【问题标题】:NSImage -initWithContentsOfFile returns an image of size zero (0)NSImage -initWithContentsOfFile 返回大小为零 (0) 的图像
【发布时间】:2026-01-31 01:50:01
【问题描述】:

要加载图标图像,我在其中一种方法中有以下代码:

NSLog(@"icon path: %@", iconPath);
NSImage *iconImage = [[NSImage alloc] initWithContentsOfFile:iconPath];
return iconImage;

从日志输出中可以清楚地看出,图像资源是从正确的位置打开的。我没有看到错误。然而,我打开的 tif 文件在调试器中显示为空 NSSize (width=0, height=0),并显示在屏幕上,好像我指向某个失控的内存段。

Flags主要设置为0。例外的是colorMatchPreferred和multipleResolutionMatching设置为1。

Reps 指向一个数组 (NSArrayM *),其中包含两 (2) 个位图表示(NSBitmapImageRep 条目)。

请指教我做错了什么!

谢谢

【问题讨论】:

  • 请包括完整的异常文本和堆栈跟踪。
  • 没有异常,因此没有堆栈跟踪。
  • 好的,我对“例外情况是 colorMatchPreferred 和 multipleResolutionMatching 设置为 1”的说法感到困惑。
  • 先用 NSData 加载内容,然后使用 [NSImage initWithData:]。有一些缓存机制。
  • 我尝试使用:NSData *iconImageData = [NSData dataWithContentsOfFile:iconPath]; NSImage *iconImage = [[NSImage alloc] initWithData:iconImageData];它表明我的数据确实正在加载。加载的字节数因图像而异。这似乎很好。然而,这种变化并没有影响最终结果。大小仍然是 0x0,并且正在显示一些时髦的东西。

标签: objective-c macos cocoa nsimage


【解决方案1】:
//to get image original size use this code

NSArray * imageReps = [NSBitmapImageRep imageRepsWithContentsOfFile:fileUrl];  
        NSInteger width = 0;
        NSInteger height = 0;

        for (NSImageRep * imageRep in imageReps)
        {
            if ([imageRep pixelsWide] > width)
                width = [imageRep pixelsWide];
            if ([imageRep pixelsHigh] > height)
                height = [imageRep pixelsHigh];
        }

【讨论】:

    最近更新 更多