我用下面的代码来获得一个NSImage中的宽度和高度:
NSImage *image = [[[NSImage alloc] initWithContentsOfFile:[NSString stringWithFormat:s]] autorelease];
imageWidth=[image size].width;
imageHeight=[image size].height;
NSLog(@"%f:%f",imageWidth,imageHeight);
但有时imageWidth
, imageHeight
不返回正确的值。 例如,当我读出的图像,在EXIF信息显示:
PixelXDimension = 2272;
PixelYDimension = 1704;
但是imageWidth,imageHeight输出
521:390
在像素图像的尺寸被保存在你的形象NSImageRep。 如果你的文件只包含一个图像,这将是这样的:
NSImageRep *rep = [[image representations] objectAtIndex:0];
NSSize imageSize = NSMakeSize(rep.pixelsWide, rep.pixelsHigh);
其中, 形象就是你NSImage中和IMAGESIZE是以像素为单位的图像大小。
NSImage中尺寸方法返回大小的信息是屏幕分辨率依赖。 要获得实际的文件图像中所表示的大小,你需要使用一个NSImageRep。
请参阅NSImage中大小-不实际尺寸与-些画面链接和得到帮助
直接API也给出了正确的结果
CGImageRef cgImage = [oldImage CGImageForProposedRect:nil context:context hints:nil];
size_t width = CGImageGetWidth(cgImage);
size_t height = CGImageGetHeight(cgImage);
苹果公司使用基于DPI映射指向物理设备的像素点系统。 它没有重要性的EXIF说的话,它的问题很多逻辑屏幕怎么分的画布具有显示图像。
iOS和OSX为你执行这个映射。 你应该关心的只是大小是UIImage.size返回的大小
你不能(阅读不应该有不应该照顾)做映射到设备像素自己,这就是为什么苹果做的。
SWIFT 4
你必须做一个NSBitmapImageRep
的代表性NSImage
获得正确的像素高度和宽度。 首先这个扩展聚集了CGImage
从NSImage
:
extension NSImage {
@objc var CGImage: CGImage? {
get {
guard let imageData = self.tiffRepresentation else { return nil }
guard let sourceData = CGImageSourceCreateWithData(imageData as CFData, nil) else { return nil }
return CGImageSourceCreateImageAtIndex(sourceData, 0, nil)
}
}
}
然后,当你想要得到的高度和宽度:
let rep = NSBitmapImageRep(cgImage: (NSImage(named: "Your Image Name")?.CGImage)!)
let imageHeight = rep.size.height
let imageWidth = rep.size.width