22

我使用下面的代码来获取 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 
4

6 回答 6

30

以像素为单位的图像尺寸存储在图像的 NSImageRep 中。如果您的文件只包含一张图像,它将是这样的:

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

其中image是您的 NSImage 并且imageSize是您的图像大小(以像素为单位)。

于 2012-11-05T07:59:39.183 回答
10

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

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

于 2012-08-09T05:00:46.597 回答
4

直接 API 也给出了正确的结果

CGImageRef cgImage = [oldImage CGImageForProposedRect:nil context:context hints:nil];
size_t width = CGImageGetWidth(cgImage);
size_t height = CGImageGetHeight(cgImage);
于 2015-08-13T08:11:06.737 回答
2

Apple 使用基于 DPI 的点系统将点映射到物理设备像素。EXIF 说什么并不重要,重要的是您的画布必须有多少个逻辑屏幕点才能显示图像。

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

您不能(阅读不应该不必关心)自己映射到设备像素,这就是苹果这样做的原因。

于 2012-08-09T05:01:01.337 回答
2

斯威夫特 4

您必须对 进行NSBitmapImageRep表示NSImage以获得正确的像素高度和宽度。首先一个这个扩展来收集一个CGImageNSImage

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
于 2019-01-02T22:32:28.243 回答
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
    }
}
于 2021-07-11T05:49:06.110 回答