Wie, um eine perfekte Ernte (ohne Veränderung der Qualität) in Objective-c/Cocoa (OSX)

Gibt es eine Möglichkeit, in Objective-c/cocoa (OSX) zum beschneiden eines Bildes, ohne die Qualität des Bildes?

Ich bin sehr nahe an einer Lösung, aber es gibt noch einige Unterschiede, die ich erkennen kann in der Farbe. Ich kann es merken, wenn das Zoomen in den text. Hier ist der code den ich momentan verwende:

    NSImage *target = [[[NSImage alloc]initWithSize:panelRect.size] autorelease];
    target.backgroundColor = [NSColor greenColor];
    //start drawing on target
    [target lockFocus];
    [NSGraphicsContext saveGraphicsState];
    [[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationNone];
    [[NSGraphicsContext currentContext] setShouldAntialias:NO];

    //draw the portion of the source image on target image
    [source drawInRect:NSMakeRect(0,0,panelRect.size.width,panelRect.size.height)
              fromRect:NSMakeRect(panelRect.origin.x , source.size.height - panelRect.origin.y - panelRect.size.height, panelRect.size.width, panelRect.size.height)
             operation:NSCompositeCopy
              fraction:1.0];

    [NSGraphicsContext restoreGraphicsState];
    //end drawing
    [target unlockFocus];

    //create a NSBitmapImageRep
    NSBitmapImageRep *bmpImageRep = [[[NSBitmapImageRep alloc]initWithData:[target TIFFRepresentation]] autorelease];
    //add the NSBitmapImage to the representation list of the target
    [target addRepresentation:bmpImageRep];
    //get the data from the representation
    NSData *data = [bmpImageRep representationUsingType: NSJPEGFileType
                                             properties: imageProps];
    NSString *filename = [NSString stringWithFormat:@"%@%@.jpg", panelImagePrefix, panelNumber];
    NSLog(@"This is the filename: %@", filename);
    //write the data to a file
    [data writeToFile:filename atomically:NO];

Hier ist ein Zoom-in-Vergleich das original und das beschnittene Bild:

Wie, um eine perfekte Ernte (ohne Veränderung der Qualität) in Objective-c/Cocoa (OSX)
(Original - Bild- oben)

Wie, um eine perfekte Ernte (ohne Veränderung der Qualität) in Objective-c/Cocoa (OSX)
(Freigestelltes Bild - oben)

Der Unterschied ist schwer zu sehen, aber wenn Sie wechseln zwischen Ihnen, können Sie es bemerken. Sie können ein Farb-picker, um zu bemerken, der Unterschied, wie gut. Zum Beispiel, die dunkelsten pixel auf der unteren Zeile des Bildes ist eine andere Farbe.

Ich habe auch eine Lösung, die funktioniert genau so wie ich es will in iOS. Hier ist der code:

-(void)testMethod:(int)page forRect:(CGRect)rect{
    NSString *filePath = @"imageName";

    NSData *data = [HeavyResourceManager dataForPath:filePath];//this just gets the image as NSData
    UIImage *image = [UIImage imageWithData:data];

    CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], rect);//crop in the rect

    UIImage *result = [UIImage imageWithCGImage:imageRef scale:0 orientation:image.imageOrientation];
    CGImageRelease(imageRef);

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectoryPath = [paths objectAtIndex:0];

    [UIImageJPEGRepresentation(result, 1.0) writeToFile:[documentsDirectoryPath stringByAppendingPathComponent::@"output.jpg"] atomically:YES];
}

So, gibt es eine Möglichkeit, um ein Bild zu beschneiden in OSX so, dass das beschnittene Bild nicht ändern? Vielleicht habe ich zu suchen in einer anderen Bibliothek, aber ich wäre überrascht, wenn ich könnte dies nicht mit Objective-C...


Hinweis, Dies ist eine folgefrage zu meiner vorherigen Frage hier.


Update ich habe versucht (nach der Vorschlag) Runden die CGRect Werte auf ganze zahlen, aber nicht einen Unterschied feststellen. Hier ist der code, falls ich verwendet:

    [source drawInRect:NSMakeRect(0,0,(int)panelRect.size.width,(int)panelRect.size.height)
              fromRect:NSMakeRect((int)panelRect.origin.x , (int)(source.size.height - panelRect.origin.y - panelRect.size.height), (int)panelRect.size.width, (int)panelRect.size.height)
             operation:NSCompositeCopy
              fraction:1.0];

Update ich habe versucht mazzaroth-code und es funktioniert, wenn ich speichern Sie es als png, aber wenn ich versuche und speichern Sie es als jpeg, das Bild verliert an Qualität. So nah, aber nicht nah genug. Hofft noch auf eine vollständige Antwort...

  • Sehen Sie noch das problem, wenn Sie eine TIFF-Darstellung statt JPEG?
  • Hi @user1118321, ja. Habe ich bereits getestet mit TIFF und PNG. Gleiches Ergebnis.
  • Sind Sie vergrößert, so dass Sie eine 1:1-pixel-Bildschirm-Verhältnis, bevor Sie Sie beschneiden?
  • Ich glaube nicht, dass es keine Zoom beteiligten... aber ich könnte etwas fehlen. Ich Schaffe das Quell-Bild mit 'initWithContentsOfFile'. Es ist keine änderung am Bild, dass nach...
  • Naja, es ist nur ein Gedanke. Wenn Sie unterschiedlich skaliert werden, dann würde es schaffen, andere Werte für andere Pixel... verwenden Sie auto-layout oder die auto-sizing, die möglicherweise die Größe des Bildes?
  • Ich bin gerade beim betrachten der Bilder im Finder. Der code oben ist alles, was ich benutze, um speichern Sie das zugeschnittene Bild... Es ist interessant. Alle Pixel scheinen an der richtigen Stelle, aber die Farbe ist nur ein bisschen ab.
  • haben Sie versucht zu deaktivieren/aktivieren von antialiasing auf dem Bild-Kontext?
  • Ja. [[NSGraphicsContext currentContext] setShouldAntialias:NO];
  • Haben Sie versucht, die Verrechnung der Gemeinschaftsmarke durch (0.5,0.5). Quarz-sonst verteilt die pixel-Farbe ansonsten auf der benachbarten 4 Pixeln.
  • Kannst du bitte akzeptieren Sie die Antwort so, dass die bounty angewendet wird?

InformationsquelleAutor lindon fox | 2012-12-05
Schreibe einen Kommentar