【问题标题】:Get NSRunningApplication's icon with an other size获取其他尺寸的 NSRunningApplication 图标
【发布时间】:2015-02-13 16:31:29
【问题描述】:
// 561 is PID of Chrome application in Activity Monitor.
NSRunningApplication *chromeApp = [NSRunningApplication runningApplicationWithProcessIdentifier:561];
self.imgView.image = chromeApp.icon;

我的日志:

(lldb) po chromeApp.icon
<NSImage 0x608000268c40 Size={32, 32} Reps=(
    "<NSIconRefImageRep:0x600000082df0 iconRef=0x103 size:128x128 pixels:128x128>",
    "<NSIconRefImageRep:0x600000083020 iconRef=0x103 size:128x128 pixels:256x256>",
    "<NSIconRefImageRep:0x600000082fd0 iconRef=0x103 size:256x256 pixels:256x256>",
    "<NSIconRefImageRep:0x600000083070 iconRef=0x103 size:256x256 pixels:512x512>",
    "<NSIconRefImageRep:0x6000000830c0 iconRef=0x103 size:512x512 pixels:512x512>",
    "<NSIconRefImageRep:0x600000083110 iconRef=0x103 size:48x48 pixels:48x48>",
    "<NSIconRefImageRep:0x600000083160 iconRef=0x103 size:36x36 pixels:36x36>",
    "<NSIconRefImageRep:0x600000083200 iconRef=0x103 size:36x36 pixels:72x72>",
    "<NSIconRefImageRep:0x600000083250 iconRef=0x103 size:32x32 pixels:32x32>",
    "<NSIconRefImageRep:0x6000000832a0 iconRef=0x103 size:32x32 pixels:64x64>",
    "<NSIconRefImageRep:0x6000000832f0 iconRef=0x103 size:18x18 pixels:18x18>",
    "<NSIconRefImageRep:0x6000000831b0 iconRef=0x103 size:18x18 pixels:36x36>",
    "<NSIconRefImageRep:0x600000083340 iconRef=0x103 size:16x16 pixels:16x16>",
    "<NSIconRefImageRep:0x600000083390 iconRef=0x103 size:16x16 pixels:32x32>",
    "<NSIconRefImageRep:0x6000000833e0 iconRef=0x103 size:512x512 pixels:1024x1024>"
)>

在上面的代码中,我收到了一个大小为 32x32 的图像(在我的 xib 文件中,imageView 的大小为 512 x 512)。 问题:如何获取 512x512 像素的图像。

【问题讨论】:

    标签: ios objective-c macos uiimage nsimage


    【解决方案1】:

    您返回的图标是一个 NSImage,其 ITS 大小设置为 32x32。意味着如果你现在绘制它,它会选择一个合适的 NSImageRepresentation。从日志中你可以看到它有很多不同的——它们是纯数据

    所以你需要做的就是:

    self.imgView.image.size = NSMakeSize(512,512);

    一个 NSImage 基本上只是一个“可绘制”,它没有自己的数据,而是将 1..n 种图像数据“组合”在一起

    【讨论】:

    • 它有效,谢谢!我想知道为什么 Apple 不使用渲染目标大小来选择最佳代表。
    【解决方案2】:

    在这个答案中,我尝试使用 Safari(而不是 Chrome),因为我不知道 Chrome 的 bundleIdentifier。以下代码包含一些用于测试但没有错误处理和内存管理的 NSLog:

    获取 NSRunningApplication:

    NSArray *appArray =
            [NSRunningApplication 
                runningApplicationsWithBundleIdentifier:@"com.apple.Safari"];
    NSLog(@"%@", appArray );
    NSRunningApplication *safariApp = [appArray objectAtIndex:0];
    

    首先加载应用的图标:

    NSImage *iconImage = safariApp.icon;
    NSLog( @"iconImage:\n%@", ); //show all representations
    

    然后提取最适合您的 NSImageView 的 NSImageRep:

    NSRect rect = [myImageView frame];
    NSLog( @"rect = %@", NSStringFromRect( rect ) );
    NSImageRep *rep = [iconImage bestRepresentationForRect:rect
                                                   context:nil
                                                     hints:nil];
    NSLog( @"rep = %@", );  // what rep is selected?
    // make an NSImage from this rep
    NSImage *theImage = [[NSImage alloc] initWithSize:NSZeroSize];
    [theImage addRepresentation:rep];
    self.imgView.image = theImage;
    

    在您的示例中(使用 size=512x512 的 imageView),将选择 size=512x512 像素=512x512 的代表。如果你有一个视网膜屏幕,你会得到 size=512x512 像素=1024x1024 的代表。

    【讨论】:

    • 对,但是复杂的恕我直言:) 为什么只提取代表来制作新图像...有什么意义?以 CPU 和(!)多行代码为代价节省一些内存? ;)
    猜你喜欢
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    相关资源
    最近更新 更多