2012-06-25 3 views
7

문제점 : 256x128 픽셀에서 최대 4096x2048 픽셀까지의 여러 픽셀 크기에서 동일한 이미지를 포함하는 다중 페이지 TIFF 이미지 (tiffutil로 생성 됨)가 있습니다. 이 이미지를 CALayer에 표시하고 레이어의 크기에 따라 이미지의 최적 표현을 자동 선택합니다. 현재 레이어는 크기에 관계없이 항상 이미지의 256x128 표현을 사용합니다. 내가CALayer에서 멀티 페이지 TIFF NSImage의 자동 크기 조정

NSImage *image = [NSImage imageNamed:@"map-multipage.tiff"]; 

image 객체를 로그로 이미지를로드는 다른 픽셀 크기의 여러 표현이 포함되어 있는지 확인하지만, 모든 표현은 점 (256x128)에서 동일한 크기 :

는 여기에 내가하는 일입니다. AFAIK 이것은 Apple이 다중 해상도 이미지를 생성하는 것을 권장하는 방법입니다.

NSLog(@"%@", image); 

<NSImage 0x100623060 Name=map-multipage Size={256, 128} Reps=(
    "NSBitmapImageRep 0x10064d330 Size={256, 128} ColorSpace=(not yet loaded) BPS=8 BPP=(not yet loaded) Pixels=256x128 Alpha=NO Planar=NO Format=(not yet loaded) CurrentBacking=nil (faulting) CGImageSource=0x10014fdb0", 
    "NSBitmapImageRep 0x10064e1b0 Size={256, 128} ColorSpace=(not yet loaded) BPS=8 BPP=(not yet loaded) Pixels=512x256 Alpha=NO Planar=NO Format=(not yet loaded) CurrentBacking=nil (faulting) CGImageSource=0x10014fdb0", 
    ... 
    "NSBitmapImageRep 0x100530bd0 Size={256, 128} ColorSpace=(not yet loaded) BPS=8 BPP=(not yet loaded) Pixels=4096x2048 Alpha=NO Planar=NO Format=(not yet loaded) CurrentBacking=nil (faulting) CGImageSource=0x10014fdb0" 
)> 

I는 다음 층의 contents 속성에 직접 NSImage 인스턴스를 할당 :

바와 같이
self.layerView.layer.contents = image; 

결과에 관계없이 상기 층 화상을 표시하는 제 1 표현 (256x128 픽셀)을 사용한다는 레이어의 크기를 포인트 또는 픽셀 단위로 나타냅니다.

같은 이미지를 NSImageView에 할당하면 예상대로 작동합니다. 이미지보기는 크기에 따라 투명하게 최상의 이미지 표현을 선택합니다. 나는 CALayer이 같은 방식으로 작동 할 것이라고 기대하지만 분명히 그렇지 않습니다. 아무도이 CALayer이 자동 선택을 지원하지 않거나 내가 잘못된 것을하고 있는지 확인할 수 있습니까?

(이 질문은 HiDPI/Retina 그래픽과 직접 관련이 없습니다. 실제로 HiDPI 모드의 디스플레이로 레이어를 이동하면 약간 더 선명하게 렌더링되어 현재 두 번째 비트 맵 표현을 사용함을 나타냅니다. (512x256 px) 렌더링에 적합합니다. 이는 HiDPI 디스플레이에서 더 높은 해상도를 선택하는 자동 연산이 작동 함을 의미합니다.

+0

그냥 생각해보십시오.'@ "map-multipage.tiff"'에서'.tiff'를 제거해보십시오. 또한,'layerContentsRedrawPolicy'가'Never'가 아닌지 확인하십시오. 아니면 레이어의 'contentsGravity' 유입에 콘텐츠가 어떻게 업데이트되고 있습니까? – Stream

+1

@Stream : 제안에 감사드립니다. 아니요. 파일 확장명을 제거해도 아무런 효과가 없습니다. 또한 'layerContentsRedrawPolicy' 또는'contentsGravity'로 재생되지 않습니다. 지난 밤에 WWDC 2012 세션 245를 지켜본 결과 내 질문에 대한 대답이 의심 스럽습니다. 그런 식으로는 작동하지 않습니다. 'CALayer'의'contents'는 레이어의 실제 크기에 대한 정보를 포인트/픽셀 단위로 "알지 못합니다". 따라서이 정보를 기반으로 비트 맵 표현을 선택할 수 없습니다. –

+0

의미가 있습니다! '- [CALayer contents]'는 비트 맵 일 뿐이며 소스에 대해 아는 것도 "벙어리"입니다. 'drawRect : inContext :'를 통해 표현에 의존하는 것은'CALayer'입니다. 따라서,'contents'를 직접 설정할 때, 그 차원은 현재의'- [NSImage size]'에 기반해야합니다. – Stream

답변

2

AppKit 메소드 -[CALayer setContents:]은 다음과 같은 비트 맵 표현을 선택합니다. contents 개체가 NSImage 인 경우 크기 일치 -[contents size]. 그런 다음 -[CALayer setContents:]이 다시 호출 될 때까지 선택한 비트 맵이 그대로 사용됩니다.