2012-06-25 14 views
7

Sorun: Birden çok piksel boyutunda aynı görüntüyü içeren 40.000x2048 piksele kadar çok piksel boyutunda bir çok sayfalı TIFF görüntü (tiffutil ile oluşturulmuş) var. Bu görüntüyü CALayer'da görüntülemek istiyorum, böylece sistem katman boyutuna bağlı olarak görüntünün en iyi gösterimini otomatik olarak seçsin. Şu anda, katman, boyutuna bakılmaksızın, görüntünün 256x128 gösterimini kullanır. BenCALayer'da Çok Sayfalı TIFF NSImage'ın Otomatik Ölçeklendirilmesi

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

image nesneyi açılıyor ile resim yüklemek farklı piksel boyutlarıyla birden çok temsiller içerdiğini teyit, ancak tüm gösterimler noktaları (256x128) aynı boyuttadır:

İşte böyle yapar. AFAIK, Apple'ın çok çözünürlüklü görüntülerin nasıl yapılmasını tavsiye ettiğidir.

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" 
)> 

Sonra katmanın contents doğrudan özelliğine NSImage örneğini atayın:

belirtildiği gibi
self.layerView.layer.contents = image; 

, sonuç ne olursa olsun, katman görüntüyü göstermek için ilk gösterimini (256x128 piksel) kullanmasıdır Katmanların boyutunun veya piksellerinin büyüklüğü.

Aynı resmi bir NSImageView numaralı adama atadığımda, beklendiği gibi çalışır. Görüntü görünümü, boyutuna bağlı olarak en iyi görüntü temsilini şeffaf bir şekilde seçer. CALayer'un da aynı şekilde çalışmasını beklerdim ama görünüşe göre bu durum böyle değil. CALayer'un bu otomatik seçimi desteklemediğini doğrulayabilir miyim, yoksa yanlış bir şey mi yapıyorum?

(Bu sorunun doğrudan HiDPI/Retina grafikleriyle ilgili olmadığını unutmayın. Aslında, HiDPI modundaki katmanı bir ekrana taşırsam, biraz daha net hale gelir ve şimdi ikinci bitmap gösterimini kullanır. render için (512x256 piksel). Bu en iyi bitmap temsilinin temel seçimi başarısız olurken otomatizm bir HiDPI ekran çalışmalarına daha yüksek bir çözünürlük seçmek için ileri sürmektedir.)

+0

Sadece bir fikir, '.tiff 'in' @' map-multipage.tiff ''öğesini kaldırmayı deneyin. Ayrıca, 'layerContentsRedrawPolicy''nın 'Never' değil olduğundan emin olun. Ya da belki de tabakanın içeriğiGravity, içeriğinin nasıl güncellendiğini etkiler? – Stream

+1

@Stream: Öneriler için çok teşekkürler. Hayır, dosya uzantısının kaldırılmasının hiçbir etkisi yoktur, 'layerContentsRedrawPolicy' veya' contentGravity' ile oynamamaktadır. Dün gece WWDC 2012 oturumunu 245 izledim, sorumun cevabından şüpheleniyorum, bu şekilde çalışmıyor. Görünen o ki, “CALayer” in “içeriği”, katmanların gerçek büyüklüğü ile ilgili herhangi bir şeyi/noktalarda "bilmemektedir" ve bu nedenle bu bilgiye dayanan bir bitmap temsilini seçemez. –

+0

Anlamlıdır! '- [CALayer içeriği]' sadece bir bitmap, kaynağı hakkında bir şey bilmek için “aptal” dır. "DrawRect: inContext:" ile temsile dayanan "CALayer" dır. Yani, 'içeriği' doğrudan ayarladığınızda, boyutu geçerli '- [NSImage boyutu]' temel alınarak yapılmalıdır. – Stream

cevap

2

o bir bitmap temsilini seçer -[CALayer setContents:] AppKit yöntemi gibi görünüyoreşleştirmesi, nesnesinin NSImage biçimindedir. Daha sonra seçilen bitmap, -[CALayer setContents:] bir kez daha çağrılır.

İlgili konular