获取NSImage的正确图像宽度和高度

时间:2012-08-09 04:46:42

标签: objective-c macos cocoa nsimage

我使用下面的代码来获取NSImage的宽度和高度:

NSImage *image = [[[NSImage alloc] initWithContentsOfFile:[NSString stringWithFormat:s]] autorelease];
imageWidth=[image size].width;
imageHeight=[image size].height;
NSLog(@"%f:%f",imageWidth,imageHeight);

但有时候imageWidthimageHeight不会返回正确的值。例如,当我读取图像时,EXIF信息显示:

PixelXDimension = 2272;
PixelYDimension = 1704;

但是imageWidth,imageHeight输出

521:390 

6 个答案:

答案 0 :(得分:23)

图像尺寸(以像素为单位)存储在图像的NSImageRep中。如果您的文件只包含一个图像,则它将如下所示:

NSImageRep *rep = [[image representations] objectAtIndex:0];
NSSize imageSize = NSMakeSize(rep.pixelsWide, rep.pixelsHigh);

其中图片是您的NSImage, imageSize 是您的图片尺寸(以像素为单位)。

答案 1 :(得分:10)

NSImage size方法返回依赖于屏幕分辨率的大小信息。要获得实际文件映像中表示的大小,您需要使用NSImageRep。

参考nsimage-size-not-real-size-with-some-pictures链接并获取帮助

答案 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
    }
}