Как записать значок типа файла Какао в формате PNG размером 16x16? - PullRequest
1 голос
/ 27 марта 2011

Как записать PNG-файл 16x16 для значка типа файла в Какао? Я пробовал это раньше с кодом, как фрагмент ниже. Фрагмент работал на PPC-машине с Mac OS X 10.5, но, похоже, больше не работает на Mac OS X 10.6: записанный PNG имеет размер 512x512, а не 16x16.

NSImage * icon = [[NSWorkspace sharedWorkspace] iconForFileType: NSFileTypeForHFSTypeCode(kGenericFolderIcon)];
[icon setSize: NSMakeSize(16.0,16.0)];
NSBitmapImageRep * bitmapRep = [NSBitmapImageRep imageRepWithData: [icon TIFFRepresentation]];  
NSData * data = [bitmapRep representationUsingType: NSPNGFileType properties: nil];
[data writeToFile: @"/tmp/test.png" atomically: NO];

Из того, что я понимаю из документации по NSImage и NSImageRep, тот факт, что вышеупомянутый код работал раньше, был совпадением, поскольку setSize: устанавливает только "размер рисунка" изображения, который не обязательно совпадает «физический размер» его представления (й).

Итак, как правильно получить файл PNG размером 16x16? Кроме того, значки в Mac OS X могут включать специально нарисованную версию для размера 16x16, которая является , а не просто уменьшенной версией "большой" иконки; как убедиться, что эта специальная версия записана в файл PNG, если она доступна?

Ответы [ 2 ]

2 голосов
/ 29 марта 2011

Николай прав, вы должны проверить, имеет ли изображение сначала 16x16 представление, но чтобы просто изменить размер изображения до 16 x 16, вы должны сделать это:

NSImage * icon = [[NSWorkspace sharedWorkspace] iconForFileType: NSFileTypeForHFSTypeCode(kGenericFolderIcon)];
[icon setScalesWhenResized:YES];  //this makes NSImage create a new representation
[icon setSize: NSMakeSize(16.0,16.0)];
1 голос
/ 28 марта 2011

Если вы уверены, что в NSImage имеется версия значка размером 16x16, вы можете просмотреть представления (-[NSImage representations]) и выбрать интересующее вас изображение, посмотрев на размер (-[NSImageRep pixelsWide]).и pixelsHigh).Затем вы можете записать представление на диск.

Лучшим способом было бы создать контекст растрового изображения 16x16, нарисовать изображение в этом контексте и затем сохранить содержимое контекстов.Этот способ также работает, если исходный значок не содержит представление 16x16.

...