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

23

我使用以下代码来获取 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个回答

32

您图像的像素尺寸存储在图像的NSImageRep中。如果您的文件只包含一个图像,则如下所示:

您的图像的像素尺寸存储在图像的NSImageRep中。如果您的文件只包含一个图像,则会是这样的:

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

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


10

NSImage的size方法返回与屏幕分辨率相关的大小信息。要获取在实际文件图像中表示的大小,您需要使用NSImageRep。

请参阅nsimage-size-not-real-size-with-some-pictures链接并获得帮助。


嗨Price,在iOS中如何获取与屏幕分辨率相关的尺寸信息?你有什么想法吗?如果有,请帮帮我。 - Nikunj

4
直接的 API 也可以给出正确的结果。
CGImageRef cgImage = [oldImage CGImageForProposedRect:nil context:context hints:nil];
size_t width = CGImageGetWidth(cgImage);
size_t height = CGImageGetHeight(cgImage);

1
当在Retina屏幕上运行时,这似乎是唯一正确的答案。NSImage是错误的(它返回的可能取决于图像数据声明的DPI),NSImageRep也是错误的(当在Retina上时,它将返回真实像素大小的2倍);只有CGImage给出了图像像素的实际大小。我在macOS 11上没有找到其他获取该信息的方法。 - bhaller

2

苹果使用基于DPI的点系统将点映射到物理设备像素上。不重要的是EXIF说了什么,而是你的画布有多少逻辑屏幕点来显示图像。

iOS和OSX会为你执行此映射。您唯一需要关心的大小是从UIImage.size返回的大小。

你不应该自己进行设备像素的映射,这就是苹果的工作。


2

SWIFT 4

为了获得正确的像素高度和宽度,您需要创建一个NSImageNSBitmapImageRep表示。 首先使用此扩展从NSImage中获取CGImage

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

1
我制作了这样一个扩展程序:

extension NSImage{
    var pixelSize: NSSize?{
        if let rep = self.representations.first{
            let size = NSSize(width: rep.pixelsWide, height: rep.pixelsHigh)
            return size
        }
        return nil
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接