我使用下面的代码来获取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
答案 0 :(得分:23)
图像尺寸(以像素为单位)存储在图像的NSImageRep中。如果您的文件只包含一个图像,则它将如下所示:
NSImageRep *rep = [[image representations] objectAtIndex:0];
NSSize imageSize = NSMakeSize(rep.pixelsWide, rep.pixelsHigh);
其中图片是您的NSImage, imageSize 是您的图片尺寸(以像素为单位)。
答案 1 :(得分:10)
NSImage size方法返回依赖于屏幕分辨率的大小信息。要获得实际文件映像中表示的大小,您需要使用NSImageRep。
答案 2 :(得分:3)
直接API也提供了正确的结果
onload
答案 3 :(得分:2)
Apple使用基于DPI的点系统将点映射到物理设备像素。无论EXIF说什么都没关系,重要的是你的画布有多少逻辑屏幕点来显示图像。
iOS和OSX为您执行此映射。您应该关注的唯一大小是从UIImage.size返回的大小
你不能(读不应该小心)自己做映射到设备像素,这就是为什么苹果这样做。
答案 4 :(得分:0)
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
答案 5 :(得分:0)
我做了一个这样的扩展:
extension NSImage{
var pixelSize: NSSize?{
if let rep = self.representations.first{
let size = NSSize(width: rep.pixelsWide, height: rep.pixelsHigh)
return size
}
return nil
}
}