Автоматическое масштабирование многостраничного TIFF NSImage в CALayer

Проблема :У меня есть многостраничное изображение TIFF (, сгенерированное с помощью tiffutil ), которое содержит одно и то же изображение с размером в несколько пикселей от 256x128 пикселей до 4096x2048 пикселей. Я хочу отобразить это изображение в CALayer, чтобы система автоматически выбирала наилучшее представление изображения в зависимости от размера слоя. На данный момент слой всегда использует представление изображения 256x128, независимо от его размера.

Вот что я делаю :Я загружаю изображение с помощью

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

Регистрация объекта imageподтверждает, что он содержит несколько представлений с разными размерами пикселей, но все представления имеют одинаковый размер в точках (256x128 ). Насколько я знаю, именно так 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"
)>

Затем я назначаю экземпляр NSImageнепосредственно свойству contentsслоя :

self.layerView.layer.contents = image;

. Как уже упоминалось, в результате слой использует первое представление (256x128 пикселей )для отображения изображения, независимо от размера слоя в точках или пикселях.

Когда я назначаю одно и то же изображение NSImageView, оно работает, как и ожидалось. Представление изображения прозрачно выбирает наилучшее представление изображения в зависимости от его размера. Я ожидал, что CALayerбудет работать так же, но, видимо, это не так. Кто-нибудь может подтвердить, что CALayerне поддерживает этот автоматический выбор или я что-то не так делаю?

(Обратите внимание, что этот вопрос не имеет прямого отношения к графике HiDPI/Retina. На самом деле, если я перемещу слой на дисплей в режиме HiDPI, он будет отображаться немного четче, указывая на то, что теперь он использует второе растровое представление (512x256 пикселей )для рендеринга.Это говорит о том, что автоматизм выбора более высокого разрешения на дисплее HiDPI работает, в то время как фундаментальный выбор наилучшего представления растрового изображения терпит неудачу.)

7
задан Ole Begemann 25 June 2012 в 16:20
поделиться