如何使用Cocoa将图像重叠(叠加)在文件图标上?

时间:2010-02-17 13:54:25

标签: cocoa macos osx-snow-leopard nsimage

我必须制作一个原型应用程序,我在给定文件夹的文件图标上叠加一个小图像。 假设我有一个文件夹/ MyDocuments / 并且有三个文件/MyDocuments/Doc1.rtf /MyDocuments/Doc1.pdf和/MyDocuments/Doc1.jpg 我有一个图像 myicon.png ,现在我必须将此图像myicon.png叠加在/ MyDocuments /

中存在的所有三个文件的文件图标上

据我所知,我可以使用 NSWorkspace sharedWorkspace 中的方法来获取和设置这些文件的文件图标,但我不知道如何使用图像 myicon.png 并将其叠加在这些文件的现有图标上。

如果有人看过Dropbox应用程序(dropbox.com),那么它与您在Dropbox文件夹中看到更改图标的方式类似

我认为它将使用NSImage完成,但我不知道该怎么做。

注意:图像myicon.png只会占据这些文件原始图标的左上角部分,即图像不应与现有图标​​完全重叠,但只应占用左上角的1​​/4部分。

2 个答案:

答案 0 :(得分:5)

Lock focus在文件图标上,然后draw徽章图标,然后是unlock focus。您可能希望对文件图标的副本执行此操作,并将其挂在未加载的原始文件上。

如果徽章是Mac OS X附带的标准徽章之一,请不要将徽章复制到您的应用中 - 如果Apple更改徽章,它将会过时。标准徽章在IconsCore.h中命名;你可以使用NSFileTypeForHFSTypeCode函数将任何这些类型包装在一个字符串中,然后将该字符串传递给NSWorkspace的iconForFileType:以获得标准徽章作为图像,从这一点你可以做到这一点。

答案 1 :(得分:4)

作为Peter Hosey答案的补充,这里有一些稍微修改过的示例代码:

http://cocoadev.com/forums/comments.php?DiscussionID=221

NSImage *origImage = [sourceImage copy]; // Copy to avoid modifying the original.

NSSize previewSize = NSMakeSize([origImage size].width / 4.0, [origImage size].height / 4.0);
NSImage *previewImage = [[NSImage alloc] initWithSize:previewSize];
[previewImage lockFocus];
[origImage drawInRect:NSMakeRect(0, 0, previewSize.width, previewSize.height)
             fromRect:NSZeroRect // Draws full image.
            operation:NSCompositeSourceOver
             fraction:1.0];
[previewImage unlockFocus];