NSImageView Bild verkleinern

  • NSImageView Bild verkleinern

    Hi. Tut mir leid, dass ich schon wieder ein Thema eröffnen muss, aber ich blick da nicht ganz durch.

    Ich habe da eine NSImageView-Subclass, da steht u.a. folgender code drinnen:

    Quellcode

    1. -(void) setImage:( NSImage * ) newImage {
    2. // Die festen Werte sind nur zu Testzwecken da
    3. [newImage setSize:NSMakeSize ( 300.0, 200.0)];
    4. [super setImage:newImage];
    5. }


    Tatsächlich, das Bild wird verkleinert. Wenn ich das Bild aber jetzt als NSData abspeichere (ich hab das NSData-Object via Bindings mit dem NSImageView verbunden und es wird mit writeToFile:atomically: gespeichert) und danach wieder öffne (mit dataWithContentsOfFile) wird das Bild leider wieder in der Originalgröße angezeigt.
    Warum wird es nicht in der vorher festgelegten Größe (zb 300 und 200 px) dargestellt und gespeichert?

    lg, Benny
  • RE: NSImageView Bild verkleinern

    Das hatten wir schon mehr als einmal hier im Forum, die Suche hilft da weiter.

    Generell: Ein NSImage ist eine leere Hülle, ein sog. Fassadenobjekt. Die eigentlichen Daten sind in den Representationen gespeichert, und müssen dort behandelt werden.
    Selbst die Methoden von NSImage werden auf Reps durch gereicht, normalerweise Instanzen von NSCachedImageRep.
    I would be embarrassed if they did not spy on me.
  • Ich mach in solchen Fällen meist sowas wie

    Quellcode

    1. NSImage *myNewImage = [[NSImage alloc] initWithSize:NSMakeSize(x, y)];
    2. [myNewImage lockFocus];
    3. [otherImage drawInRect:(...)];
    4. [myNewImage unlockFocus];

    Mit dem Ansatz ist man sehr flexibel und kann auch gut Bilder beschneiden und sowas. Mag aber für deinen Fall Overkill sein.
  • Ha, ich habs geschafft (ist zwar jetzt noch nicht sauber, aber das wird noch).


    Quellcode

    1. -(void) setImage:( NSImage * ) sourceImage {
    2. float resizeWidth = 100.0;
    3. float resizeHeight = 100.0;
    4. NSImage *resizedImage = [[NSImage alloc] initWithSize: NSMakeSize(resizeWidth, resizeHeight)];
    5. NSSize originalSize = [sourceImage size];
    6. [resizedImage lockFocus];
    7. [sourceImage drawInRect: NSMakeRect(0, 0, resizeWidth, resizeHeight)
    8. fromRect: NSMakeRect(0, 0, originalSize.width, originalSize.height)
    9. operation: NSCompositeSourceOver
    10. fraction: 1.0];
    11. [resizedImage unlockFocus];
    12. [super setImage:resizedImage]; [resizedImage release];
    13. }
    Alles anzeigen


    Danke für alle Antworten
  • Es gibt noch den Weg über CoreImage mit dem Filter "CILanczosScaleTransform".

    Quellcode

    1. - (CIImage *)scaleToSize:(CGSize)inSize
    2. {
    3. // Based on Dan Wood's code: http://www.gigliwood.com/weblog/Cocoa/Core_Image,_part_2.html?seemore=y
    4. // Clamp the edges of the image (to prevent fractional pixels from being generated at the edge of the image when we scale)
    5. CIFilter *theFilter = [CIFilter filterWithName:@"CIAffineClamp" keysAndValues:@"inputTransform", [NSAffineTransform transform], @"inputImage", self, NULL];
    6. CIImage *theImage = [theFilter valueForKey:@"outputImage"];
    7. // Scale...
    8. const CGSize theOriginalSize = [self extent].size; // TODO what if it is already infinite?
    9. const float theScale = inSize.height / theOriginalSize.height;
    10. const float theAspectRatio = (theOriginalSize.height / theOriginalSize.width) / (inSize.height / inSize.width);
    11. theFilter = [CIFilter filterWithName:@"CILanczosScaleTransform" keysAndValues:@"inputScale", [NSNumber numberWithFloat:theScale], @"inputAspectRatio", [NSNumber numberWithFloat:theAspectRatio], @"inputImage", theImage, NULL];
    12. theImage = [theFilter valueForKey:@"outputImage"];
    13. // Crop...
    14. CIVector *theCropVector = [CIVector vectorWithX:0.0 Y:0.0 Z:inSize.width W:inSize.height];
    15. theFilter = [CIFilter filterWithName:@"CICrop" keysAndValues:@"inputImage", theImage, @"inputRectangle", theCropVector, NULL];
    16. theImage = [theFilter valueForKey:@"outputImage"];
    17. return(theImage);
    18. }
    Alles anzeigen
    Von "CIImage_Extensions.m" aus CoreVideoFunHouse, die genaue Quelle finde ich leider nicht so schnell.
    I would be embarrassed if they did not spy on me.