Создание миниатюр с эффективным использованием памяти с использованием NSImageView (какао / OSX) - PullRequest
2 голосов
/ 27 сентября 2011

Я создаю маленькие NSImageViews (32x32 пикселей) из больших изображений, часто 512x512 или даже 4096 x 2048 для экстремального теста. Моя проблема в том, что в моем экстремальном тестовом случае мой объем памяти приложения возрастает более чем на 15 МБ при отображении миниатюры, и это заставляет меня думать, что NSImage хранится в памяти как 4096x2048 вместо 32x32, и мне было интересно, есть ли это способ избежать этого. Вот процесс, который я прохожу, чтобы создать NsImageView:

• Сначала я создаю NSImage, используя initByReferencingFile: (указывая на файл 4096x2048 .png)

• Затем я инициализирую NSImageView вызовом initWithFrame:

• Затем я вызываю setImage: назначить мой NSImage для NSImageView

• Наконец, я установил NSImageView в NSScaleПропорционально

Я явно ничего не делаю, чтобы уменьшить размер NSImage до 32x32, но у меня возникли проблемы с поиском хорошего способа справиться с этим.

1 Ответ

4 голосов
/ 28 сентября 2011

Вы можете просто создать новый 32x32 NSImage из оригинала, а затем release исходное изображение.

Сначала создайте изображение 32x32:

NSImage *smallImage = [[NSImage alloc]initWithSize:NSMakeSize(32, 32)];

Затем заблокируйтесфокусируйтесь на изображении и нарисуйте на нем оригинал:

NSSize originalSize = [originalImage size];
NSRect fromRect = NSMakeRect(0, 0, originalSize.width, originalSize.height);
[smallImage lockFocus];
[originalImage drawInRect:NSMakeRect(0, 0, 32, 32) fromRect:fromRect operation:NSCompositeCopy fraction:1.0f];
[smallImage unlockFocus];

Тогда вы можете сделать, как хотите, с уменьшенным изображением:

[imageView setImage:smallImage];

Не забудьте release!

[originalImage release];
[smallImage release];
...