代码之家  ›  专栏  ›  技术社区  ›  arachide

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

  •  23
  • arachide  · 技术社区  · 12 年前

    我使用下面的代码来获取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 
    
    6 回复  |  直到 9 年前
        1
  •  32
  •   Kibernetik    12 年前

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

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

    哪里 形象 是您的NSImage和 图像大小 是以像素为单位的图像大小。

        2
  •  10
  •   Community CDub    8 年前

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

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

        3
  •  4
  •   Karsten    9 年前

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

    CGImageRef cgImage = [oldImage CGImageForProposedRect:nil context:context hints:nil];
    size_t width = CGImageGetWidth(cgImage);
    size_t height = CGImageGetHeight(cgImage);
    
        4
  •  2
  •   deleted_user    12 年前

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

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

    你不能(阅读不应该必须不在乎)自己做设备像素的映射,这就是苹果这样做的原因。

        5
  •  2
  •   Carter Cobb    6 年前

    雨燕4

    你必须做出 NSBitmapImageRep 代表 NSImage 以获得正确的像素高度和宽度。 首先使用此扩展来收集 CGImage 来自 NSI图像 以下为:

    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
    
        6
  •  1
  •   slboat    3 年前

    我做了这样的扩展:

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