我在Mac OSX上有以下代码来加载图像:
NSImage *baseImage = [NSImage imageNamed:[NSString stringWithCString:file.getFilename().c_str() encoding:NSUTF8StringEncoding]];
以下代码在iOS上加载图片:
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并相应地进行缩放?
答案 0 :(得分:2)
NSImage实例实际上可以包含多个图像表示(它们是NSImageRep的实例),并且可能具有不同的大小。您应该将“尺寸”理解为绘制单位点的尺寸,而不是像素尺寸。
如果您想要像素尺寸,请使用-bestRepresentationForRect:context:hints:获取您感兴趣的尺寸的NSImageRep,然后调用-pixelsHigh和-pixelsWide。
PNG格式可能包含描述图像实际大小的字段,看起来NSImage正在尊重这一点,而且可能UIImage不是。
您可以使用“sips”命令行工具检查图像文件(png)(输入“man sips”了解更多信息)。它具有读取和操作各种图像格式的像素尺寸和DPI的选项。