Tamanho NSImage tamanho não real com algumas fotos?

Vejo que às vezes o tamanho da NSImage não é real (com algumas fotos) e o tamanho da CIImage é sempre real. Eu estava testando com esta imagem .

Este é o código-fonte que escrevi para teste:

NSImage *_imageNSImage = [[NSImage alloc]initWithContentsOfFile:@""]; NSSize _dimensions = [_imageNSImage size]; [_imageNSImage release]; NSLog(@"Width from CIImage: %f",_dimensions.width); NSLog(@"Height from CIImage: %f",_dimensions.height); NSURL *_myURL = [NSURL fileURLWithPath:@""]; 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); 

E a saída é:

insira a descrição da imagem aqui

Então, como isso pode ser? Talvez eu esteja fazendo algo errado?

NSImage método de size NSImage retorna informações de tamanho dependentes da resolução da canvas. Para obter o tamanho representado na imagem real do arquivo, você precisa usar um NSImageRep . Você pode obter um NSImageRep de uma NSImage usando o método de representations . Alternativamente, você pode criar uma instância da subclass NSBitmapImageRep diretamente assim:

 NSArray * imageReps = [NSBitmapImageRep imageRepsWithContentsOfFile:@""]; 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); 

O loop leva em conta que alguns formatos de imagem podem conter mais de uma única imagem (como TIFFs, por exemplo).

Você pode criar uma NSImage nesse tamanho usando o seguinte:

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

O tamanho do método NSImage retorna o tamanho em pontos. Para obter o tamanho representado em pixels, é necessário inspecionar a propriedade NSImage.representations que contém uma matriz de objects NSImageRep com propriedades pixelWide / pixelHigh e um object NSImage de tamanho de mudança simples:

 @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 

Graças a Zenopolis pelo código ObjC original, aqui está uma versão Swift concisa:

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

Se o seu arquivo contiver apenas uma imagem, você pode simplesmente usar isto:

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

imagem é sua NSImage, imageSize é o tamanho da imagem em pixels.

Copiado e atualizado aqui: https://stackoverflow.com/a/13228091/3608824