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

Ash*_*ish 3 macos cocoa nsimage osx-snow-leopard

我必须制作一个原型应用程序,我将一个小图像叠加到给定文件夹的文件图标上.假设我有一个文件夹/ 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部分.

Pet*_*sey 5

将焦点锁定在文件图标上,然后绘制徽章图标,然后解锁焦点.您可能希望对文件图标的副本执行此操作,并将其挂在未加载的原始文件上.

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


Dan*_*ese 5

作为对 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];
Run Code Online (Sandbox Code Playgroud)