Ios UIImage和NSImage报告不同的图像尺寸

Ios UIImage和NSImage报告不同的图像尺寸,ios,macos,uiimage,dpi,nsimage,Ios,Macos,Uiimage,Dpi,Nsimage,我在Mac OSX上有以下代码来加载图像: NSImage *baseImage = [NSImage imageNamed:[NSString stringWithCString:file.getFilename().c_str() encoding:NSUTF8StringEncoding]]; UIImage* baseImage = [UIImage imageNamed:[NSString stringWithCString:file.getFilename().c_str() en

我在Mac OSX上有以下代码来加载图像:

NSImage *baseImage = [NSImage imageNamed:[NSString stringWithCString:file.getFilename().c_str() encoding:NSUTF8StringEncoding]];
UIImage* baseImage = [UIImage imageNamed:[NSString stringWithCString:file.getFilename().c_str() encoding:NSUTF8StringEncoding]];
并在iOS上加载以下代码以加载图像:

NSImage *baseImage = [NSImage imageNamed:[NSString stringWithCString:file.getFilename().c_str() encoding:NSUTF8StringEncoding]];
UIImage* baseImage = [UIImage imageNamed:[NSString stringWithCString:file.getFilename().c_str() encoding:NSUTF8StringEncoding]];
图像加载后,两个平台上的以下行:

printf("Surface: \"%s\" size: %d, %d\n", file.getFilename().c_str(), (int)[baseImage size].width, (int)[baseImage size].height);
如果所讨论的图像是72 DPI,那么在两种平台上,我都会将其作为输出:

Surface: "player.png" size: 30, 30 (Mac)
Surface: "player.png" size: 30, 30 (iOS)
但是,如果图像为96 DPI,则会得到不同的结果:

Surface: "player.png" size: 30, 30 (Mac)
Surface: "player.png" size: 40, 40 (iOS)
虽然Mac会将图像缩放到72 DPI,而iOS不会缩放图像,这是一种奇怪的行为,但我希望在不同平台上获得一致的结果。(最好缩小到72 DPI。)


tl;dr:在iOS上,如何检测图像的DPI并相应地进行缩放?

一个NSImage实例实际上可以包含一个以上的图像表示(即NSImageRep实例),并且可能具有不同的大小。您应该理解“尺寸”是指图形单位点中的尺寸,而不是像素尺寸

如果需要像素尺寸,请使用-bestRepresentationForRect:context:hints:,获取您感兴趣的大小的NSImageRep,然后调用-pixelsHigh和-pixelsWide

PNG格式可能包含描述图像实际大小的字段,NSImage似乎尊重这一点,而UIImage可能不是

您可以使用“sips”命令行工具检查图像文件(png)(有关详细信息,请键入“man sips”)。它具有读取和操作多种图像格式的像素尺寸和DPI的选项