获取一个NSImage中的正确的图像的宽度和高度(Get the correct image wid

2019-07-30 21:20发布

我用下面的代码来获得一个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 

Answer 1:

在像素图像的尺寸被保存在你的形象NSImageRep。 如果你的文件只包含一个图像,这将是这样的:

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

其中, 形象就是你NSImage中和IMAGESIZE是以像素为单位的图像大小。



Answer 2:

NSImage中尺寸方法返回大小的信息是屏幕分辨率依赖。 要获得实际的文件图像中所表示的大小,你需要使用一个NSImageRep。

请参阅NSImage中大小-不实际尺寸与-些画面链接和得到帮助



Answer 3:

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

CGImageRef cgImage = [oldImage CGImageForProposedRect:nil context:context hints:nil];
size_t width = CGImageGetWidth(cgImage);
size_t height = CGImageGetHeight(cgImage);


Answer 4:

苹果公司使用基于DPI映射指向物理设备的像素点系统。 它没有重要性的EXIF说的话,它的问题很多逻辑屏幕怎么分的画布具有显示图像。

iOS和OSX为你执行这个映射。 你应该关心的只是大小是UIImage.size返回的大小

你不能(阅读不应该有不应该照顾)做映射到设备像素自己,这就是为什么苹果做的。



Answer 5:

SWIFT 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


文章来源: Get the correct image width and height of an NSImage