2012-02-13 125 views
24

我看到有时NSImage大小不是实际大小(有一些图片),CIImage大小总是真实的。我正在测试这imageNSImage尺寸与一些图片不是实际尺寸?

这是我写的测试代码:

NSImage *_imageNSImage = [[NSImage alloc]initWithContentsOfFile:@"<path to image>"]; 

NSSize _dimensions = [_imageNSImage size]; 

[_imageNSImage release]; 

NSLog(@"Width from CIImage: %f",_dimensions.width); 
NSLog(@"Height from CIImage: %f",_dimensions.height); 




NSURL *_myURL = [NSURL fileURLWithPath:@"<path to image>"]; 
CIImage *_imageCIImage = [CIImage imageWithContentsOfURL:_myURL]; 


NSRect _rectFromCIImage = [_imageCIImage extent]; 

NSLog(@"Width from CIImage: %f",_rectFromCIImage.size.width); 
NSLog(@"Height from CIImage: %f",_rectFromCIImage.size.height); 

和输出是:

enter image description here

所以怎么说也?也许我做错了什么?

+4

感谢您的伟大壁纸! – JustSid 2012-02-13 17:53:20

+0

@JustSid不客气:) – 2012-02-13 18:04:45

回答

38

NSImagesize方法返回屏幕分辨率相关的大小信息。要获取实际文件图像中显示的大小,您需要使用NSImageRep。您可以使用representations方法从NSImage获得NSImageRep。或者,也可以像这样直接创建NSBitmapImageRep子类实例:

NSArray * imageReps = [NSBitmapImageRep imageRepsWithContentsOfFile:@"<path to image>"]; 

NSInteger width = 0; 
NSInteger height = 0; 

for (NSImageRep * imageRep in imageReps) { 
    if ([imageRep pixelsWide] > width) width = [imageRep pixelsWide]; 
    if ([imageRep pixelsHigh] > height) height = [imageRep pixelsHigh]; 
} 

NSLog(@"Width from NSBitmapImageRep: %f",(CGFloat)width); 
NSLog(@"Height from NSBitmapImageRep: %f",(CGFloat)height); 

环路考虑到某些图象格式可以包含除单个图像多个(诸如TIFF格式例如)。

您可以通过以下这个尺寸创建一个NSImage中:在点

NSImage * imageNSImage = [[NSImage alloc] initWithSize:NSMakeSize((CGFloat)width, (CGFloat)height)]; 
[imageNSImage addRepresentations:imageReps]; 
+0

谢谢,但还有一个问题。现在我知道真正的大小,但是NSImage在这个尺寸上很小。如何避免这种情况?我需要使用NSImage。例如,我将NSView帧更改为实际大小的图像,但在该帧中,NSImage被缩小。 – 2012-02-14 08:49:13

+0

我对应该帮助的答案做了一些更改。 – zenopolis 2012-02-14 11:45:39

+0

现在很好,谢谢! – 2012-02-14 12:15:16

5

NSImage中尺寸方法返回大小。若要像素大小代表你需要检查包含NSImageRep的阵列pixelWide/pixelHigh性能和简单的改变大小NSImage中对象的对象NSImage.representations属性:

@implementation ViewController { 
    __weak IBOutlet NSImageView *imageView; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do view setup here. 

    NSImage *image = [[NSImage alloc] initWithContentsOfFile:@"/Users/username/test.jpg"]; 

    if (image.representations && image.representations.count > 0) { 
     long lastSquare = 0, curSquare; 
     NSImageRep *imageRep; 
     for (imageRep in image.representations) { 
      curSquare = imageRep.pixelsWide * imageRep.pixelsHigh; 
      if (curSquare > lastSquare) { 
       image.size = NSMakeSize(imageRep.pixelsWide, imageRep.pixelsHigh); 
       lastSquare = curSquare; 
      } 
     } 

     imageView.image = image; 
     NSLog(@"%.0fx%.0f", image.size.width, image.size.height); 
    } 
} 

@end 
5

感谢Zenopolis原始ObjC代码,这里有一个漂亮简洁斯威夫特版本:

func sizeForImageAtURL(url: NSURL) -> CGSize? { 
     guard let imageReps = NSBitmapImageRep.imageRepsWithContentsOfURL(url) else { return nil } 
     return imageReps.reduce(CGSize.zero, combine: { (size: CGSize, rep: NSImageRep) -> CGSize in 
      return CGSize(width: max(size.width, CGFloat(rep.pixelsWide)), height: max(size.height, CGFloat(rep.pixelsHigh))) 
     }) 
    } 
0

如果你的文件只包含一个图像,你可以这样做:

let rep = image.representations[0] 
let imageSize = NSSize(width: rep.pixelsWide, height: rep.pixelsHigh) 

像我是你的NSImage,imageSize是以像素为单位的图像大小。

复制并更新此处:https://stackoverflow.com/a/13228091/3608824