2012-02-13 34 views
24

Tôi thấy rằng đôi khi kích thước NSImage không phải là kích thước thực (với một số hình ảnh) và kích thước CIImage luôn luôn là thực. Tôi đã thử nghiệm với điều này image.Kích thước NSImage không phải kích thước thật với một số hình ảnh?

Đây là mã nguồn mà tôi đã viết cho thử nghiệm:

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); 

Và đầu ra là:

enter image description here

Vì vậy, làm thế nào mà có thể ?? Có lẽ tôi đang làm gì đó sai?

+4

Cảm ơn bạn về Hình nền tuyệt vời! – JustSid

+0

@JustSid Bạn được chào đón :) –

Trả lời

38

NSImagesize phương thức trả về thông tin kích thước phụ thuộc vào độ phân giải màn hình. Để có được kích thước đại diện trong hình ảnh tập tin thực tế, bạn cần phải sử dụng một NSImageRep. Bạn có thể nhận được NSImageRep từ số NSImage bằng phương pháp representations. Hoặc bạn có thể tạo một đối tượng NSBitmapImageRep lớp con trực tiếp như thế này:

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); 

Vòng lặp sẽ đưa vào tài khoản mà một số định dạng ảnh có thể chứa nhiều hơn một hình ảnh duy nhất (ví dụ như TIFFs ví dụ).

Bạn có thể tạo một NSImage ở kích thước này bằng cách sử dụng như sau:

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

Cảm ơn, nhưng một câu hỏi nữa. Bây giờ tôi biết kích thước thực sự, nhưng NSImage là nhỏ trong kích thước đó .. làm thế nào để tránh điều này? Tôi cần sử dụng NSImage. Ví dụ tôi thay đổi khung NSView thành kích thước thật của hình ảnh nhưng trong khung đó, NSImage được rút ra nhỏ. –

+0

Tôi đã thực hiện một số thay đổi đối với câu trả lời sẽ hữu ích. – zenopolis

+0

Điều đó hoạt động tốt đẹp ngay bây giờ, cảm ơn! –

5

kích thước trở lại NSImage phương pháp kích thước trong điểm. Để kích thước đại diện theo pixel bạn cần kiểm tra tài sản NSImage.representations có chứa một loạt các NSImageRep đối tượng với thuộc tính pixelWide/pixelHigh và kích thước thay đổi đơn giản NSImage đối tượng:

@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

Nhờ Zenopolis cho mã ObjC gốc, đây là một đẹp súc tích Swift phiên bản:

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

Nếu tập tin của bạn chỉ chứa một hình ảnh, bạn có thể chỉ cần sử dụng này: image

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

i NSImage của bạn, imageSize là kích thước hình ảnh tính bằng pixel.

Đã sao chép và cập nhật tại đây: https://stackoverflow.com/a/13228091/3608824

Các vấn đề liên quan