如何将Cocoa文件类型图标写出为16x16 PNG文件?

问题描述:

如何在Cocoa中为文件类型图标写出16x16 PNG文件?我之前使用如下代码片段的代码尝试了这一点。该片段在Mac OS X 10.5的PPC机器上工作,但似乎不再适用于Mac OS X 10.6:写出的PNG尺寸为512x512,而不是16x16。如何将Cocoa文件类型图标写出为16x16 PNG文件?

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]; 

从我从NSImageNSImageRep文档明白了,其实,上面的代码工作之前是巧合,因为setSize:只设置了不一定匹配“形象的“图纸尺寸”物理大小“的代表。

那么获取16x16大小的PNG文件的正确方法是什么?另外,Mac OS X上的图标可以包含16x16大小的特殊版本,即而不是只是“大”图标的缩小版本;你如何确保在有人可用时将这个特殊版本写出到PNG文件中?

如果您确信有存在于NSImage中的图标的16×16大小的版本,你可以看看通过交涉(-[NSImage representations]),并通过查看大小,选择你感兴趣的一个(-[NSImageRep pixelsWide]pixelsHigh) 。然后,您可以将该表示写入磁盘。

更好的方法是创建一个16x16位图上下文,将图像绘制到该上下文中,然后保存上下文内容。如果原始图标不包含16x16表示形式,这种方式也可以使用。

+0

谢谢你的提示。我快速浏览了“NSGraphicsContext”的文档,看起来如何做到这一点似乎并不困难,尽管示例代码仍然值得欢迎。 – Rinzwind 2011-03-27 21:37:32

尼古拉是正确的,你应该检查,看看是否像第一个具有16×16的再现,而是简单地调整图像大小为16×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)]; 
+0

感谢您的回答。但'setScalesWhenResized:'的文档说它是“在Mac OS X v10.6中不赞成使用”。因此,遵循尼古拉关于将图像绘制到位图上下文的建议似乎是更具前景的方式,不是吗? – Rinzwind 2011-03-29 15:52:16