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:
(Original - Bild- oben)
(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?
Du musst angemeldet sein, um einen Kommentar abzugeben.
verwenden CGImageCreateWithImageInRect.
Habe ich auch ein gist:
https://gist.github.com/4259594
1.0
. Aber da fragte man so schön... (eigentlich haben Sie schon Recht hilfreich, so werde ich Ihnen die bounty, aber ich habe nicht markieren Sie diese Frage als gelöst.)bounty give
Versuchen, ändern Sie die drawInRect orign 0.5,0.5. Ansonsten Quarz verteilen wird jedem pixel die Farbe der angrenzenden 4 fixels.
Festlegen der Farbraum des Ziel-Bildes. Sie könnten mit einem anderen Farbraum zufügen, um etwas anders Aussehen.
Versuchen die verschiedenen rendering intents und sehen, welches wird das beste Ergebnis, Wahrnehmungs-versus "relativ farbmetrisch" etc. Es gibt 4 Optionen, die ich denke.
Bemerken Sie, dass die Farben modifiziert werden, indem das speichern von JPEG vs. PNG.
Können Sie den Komprimierungsgrad beim speichern als JPEG. Versuchen Sie mit so etwas wie 0.8 oder 0.9. Sie können auch speichern Sie JPEG ohne Kompression mit 1.0, aber ther PNG hat einen entscheidenden Vorteil. Geben Sie die Stärke der Komprimierung in den Optionen Wörterbuch für CGImageDesinationAddImage.
Schließlich - wenn nichts Ihr hilft - Sie sollten einen TSI mit einem DTS -, Sie kann sicherlich bieten Ihnen mit der Anleitung, die Sie suchen.
[source drawInRect:NSMakeRect(0.5,0.5,roundedPanelRect.size.width,roundedPanelRect.size.height) fromRect:roundedPanelRect operation:NSCompositeCopy fraction:1.0];
fromRect
ist der Teil, den ich am zuschneiden. Wenn ich bei null, es ist einfach schrumpft das ganze Bild... ich habe versucht, die Einstellung sowohl derdrawInRect
undfromRect
Herkunft Werte-.5
Werte keine Veränderung.Das übliche problem ist, dass Kupieren Größen sind float, aber Bild-Pixel sind integer.
Kakao fügt es automatisch.
Müssen Sie zu Boden, Runde oder ceil die Größe und die Koordinaten, um sicher zu sein, dass Sie integer.
Dies kann helfen.
Ich mache EXIF löschen von JPG-Dateien und ich glaube, ich fing den Grund:
Alle Verluste und Veränderungen kommen aus der re-komprimieren des Bildes beim speichern in eine Datei.
Können Sie bemerken die Veränderung, auch wenn Sie nur zu speichern, das ganze Bild wieder.
Was ich zu tun habe, ist zu Lesen, das original-JPG-und re-komprimieren Sie eine Qualität, dass Sie entsprechende Dateigröße.