2012-12-06 2 views
7

J'essaie d'afficher simple NSImageView avec son image centrée sans mise à l'échelle comme ceci:Confus au sujet NSImageView échelle

Just like iOS does when you set an UIView's contentMode = **UIViewContentModeCenter**

Tout comme iOS fait quand vous définissez contentMode = d'un UIView UIViewContentModeCenter

J'ai donc essayé tous NSImageScaling valeurs, ce que je reçois quand je choisi NSScaleNone

I really don't understand what's going on :-/

Je ne comprends vraiment pas ce qui se passe: -/

Répondre

0

Pour obtenir les résultats que vous voulez, où l'image se développe pour entrer dans la vue, vous devez utiliser NSScaleToFit. Cela va changer le rapport d'aspect de la photo.

Si vous voulez l'équivalent UIViewContentModeScaleAspectFill, où le ratio d'aspect de l'image est maintenue même, l'image est agrandie pour remplir l'espace, et ses régions débordantes sont parés, puis vérifier la catégorie NSImage de ce type:

http://rheard.com/blog/making-nsimages-resizable/

C'est probablement ce que vous voulez.

5

Vous pouvez générer manuellement l'image de la taille et du contenu corrects, et définir l'image de NSImageView pour que NSImageView n'ait rien à faire.

NSImage *newImg = [self resizeImage:sourceImage size:newSize]; 
[aNSImageView setImage:newImg]; 

La fonction suivante redimensionne une image pour l'adapter à la nouvelle taille, en conservant le format d'image intact. Si l'image est plus petite que la nouvelle taille, elle est mise à l'échelle et remplie avec la nouvelle image. Si l'image est plus grande que la nouvelle taille, il est redimensionnées et rempli avec le nouveau cadre

- (NSImage*) resizeImage:(NSImage*)sourceImage size:(NSSize)size{ 

NSRect targetFrame = NSMakeRect(0, 0, size.width, size.height); 
NSImage* targetImage = [[NSImage alloc] initWithSize:size]; 

NSSize sourceSize = [sourceImage size]; 

float ratioH = size.height/ sourceSize.height; 
float ratioW = size.width/sourceSize.width; 

NSRect cropRect = NSZeroRect; 
if (ratioH >= ratioW) { 
    cropRect.size.width = floor (size.width/ratioH); 
    cropRect.size.height = sourceSize.height; 
} else { 
    cropRect.size.width = sourceSize.width; 
    cropRect.size.height = floor(size.height/ratioW); 
} 

cropRect.origin.x = floor((sourceSize.width - cropRect.size.width)/2); 
cropRect.origin.y = floor((sourceSize.height - cropRect.size.height)/2); 



[targetImage lockFocus]; 

[sourceImage drawInRect:targetFrame 
       fromRect:cropRect  //portion of source image to draw 
       operation:NSCompositeCopy //compositing operation 
       fraction:1.0    //alpha (transparency) value 
     respectFlipped:YES    //coordinate system 
        hints:@{NSImageHintInterpolation: 
[NSNumber numberWithInt:NSImageInterpolationLow]}]; 

[targetImage unlockFocus]; 

return targetImage;} 
+1

Si vous en souhaitez un avec des options de rapport d'aspect: [c'est parti] (https://github.com/spilliams/NSToolkit/blob/master/NSImage%2BResize.m). –

1

Voici une catégorie impressionnante pour NSImage: NSImage+ContentMode

Il permet des modes de contenu comme dans iOS, fonctionne très bien.

+0

Excellent. Remarque: vous devez remplacer 'UIGraphicsGetCurrentContext()' par [[NSGraphicsContext currentContext] .CGContext' pour MacOS. Particulièrement utile après que High Sierra ait détruit le contenu NSImageView pendant CABasicAnimation – codrut

+0

AspectFit ne fonctionnait pas correctement pour moi quand h> w. C'est ce qui a fonctionné: 'if (contentMode == UIViewContentModeScaleAspectFit) { \t \t \t CGSize IMAGESIZE = CGSizeMake (self.size.width, self.size.la taille); \t \t \t CGSize containerSize = rect.size; \t \t \t \t \t \t CGFloat widthRaport = containerSize.width/imageSize.width; \t \t \t CGFloat heightRaport = containerSize.height/imageSize.height; CGFloat scale = MIN (widthRaport, heightRaport); \t \t \t \t \t \t \t \t \t imageSize.width = imageSize.width * échelle; \t \t \t imageSize.height = taille_image.hauteur * échelle; ' – codrut

1

Définissez la propriété de mise à l'échelle de l'image sur NSImageScaleAxes Indépendamment de l'échelle de l'image pour remplir le rectangle.Ceci ne conserve pas le rapport d'aspect.