2012-02-13 21 views
24

Vedo che a volte le dimensioni di NSImage non sono di dimensioni reali (con alcune immagini) e la dimensione di CIImage è sempre reale. Stavo testando con questo image.Dimensioni NSImage non reali con alcune immagini?

Questo è un codice sorgente che ho scritto per il test:

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

e l'uscita è:

enter image description here

Così come che può essere ?? Forse sto facendo qualcosa di sbagliato?

+4

Grazie per l'ottimo sfondo! – JustSid

+0

@JustSid Prego :) –

risposta

38

NSImagesize il metodo restituisce informazioni sulla dimensione dipendenti dalla risoluzione dello schermo. Per ottenere la dimensione rappresentata nell'immagine reale del file è necessario utilizzare uno NSImageRep. È possibile ottenere uno NSImageRep da un NSImage utilizzando il metodo representations. In alternativa è possibile creare un'istanza NSBitmapImageRep sottoclasse direttamente in questo modo:

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

Il ciclo tiene conto che alcuni formati immagine possono contenere più di una singola immagine (come TIFF, per esempio).

è possibile creare un NSImage a questo formato utilizzando la seguente:

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

Grazie, ma un'altra domanda. Ora conosco le dimensioni reali, ma NSImage è piccolo in quelle dimensioni .. come evitare questo? Devo usare NSImage. Ad esempio, cambio il frame NSView in dimensioni reali dell'immagine, ma in quel frame NSImage viene disegnato in piccolo. –

+0

Ho apportato alcune modifiche alla risposta che dovrebbe aiutare. – zenopolis

+0

Che funziona bene ora, grazie! –

5

metodo size NSImage dimensione restituita in punti. Per ottenere dimensioni rappresentata in pixel è necessario ispezionare proprietà NSImage.representations che contiene una serie di oggetti con proprietà NSImageRep pixelWide/pixelHigh e semplice cambio formato NSImage oggetto:

@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

Grazie a Zenonopoli per il codice originale objC, ecco un bello conciso versione Swift:

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

Se il file contiene una sola immagine, si può semplicemente utilizzare questo: immagine

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

i s your NSImage, imageSize è la dimensione dell'immagine in pixel.

Copiato e aggiornato qui: https://stackoverflow.com/a/13228091/3608824

Problemi correlati