Wie man in Objective-c / Cocoa (OSX) eine perfekte Ernte (ohne Änderung der Qualität) macht

8

Gibt es in Objective-c / cacao (OSX) eine Möglichkeit, ein Bild zu beschneiden, ohne die Qualität des Bildes zu ändern?

Ich bin sehr nah an einer Lösung, aber es gibt noch einige Unterschiede, die ich in der Farbe erkennen kann. Ich kann es beim Zoomen in den Text bemerken. Hier ist der Code, den ich gerade verwende:

%Vor%

Hier ist ein vergrößerter Vergleich des Originals und des zugeschnittenen Bildes:

(Originalbild - oben)

(Beschnittenes Bild - oben)

Der Unterschied ist schwer zu sehen, aber wenn Sie zwischen ihnen wechseln, können Sie es bemerken. Sie können einen Farbwähler verwenden, um den Unterschied zu bemerken. Zum Beispiel ist das dunkelste Pixel in der unteren Reihe des Bildes eine andere Farbe.

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

%Vor%

Gibt es also eine Möglichkeit, ein Bild in OSX zu beschneiden, damit sich das zugeschnittene Bild überhaupt nicht ändert? Vielleicht muss ich in eine andere Bibliothek schauen, aber ich wäre überrascht, wenn ich das nicht mit Objective-C machen könnte ...

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

Update Ich habe versucht (gemäß dem Vorschlag ), die CGRect-Werte zu runden ganze Zahlen, aber bemerkte keinen Unterschied. Hier ist der Code für den Fall, dass ich:

%Vor%

Update Ich habe Mazzaroth Code ausprobiert und es funktioniert, wenn ich es als PNG speichere , aber wenn ich versuche es als JPEG zu speichern, verliert das Bild an Qualität. So nah, aber nicht nah genug. Ich hoffe immer noch auf eine vollständige Antwort ...

    
lindon fox 05.12.2012, 04:39
quelle

4 Antworten

10

Verwenden Sie CGImageCreateWithImageInRect.

%Vor%

Ich habe auch einen Sinn gemacht:

Ссылка

    
maz 11.12.2012 15:58
quelle
3

Versuchen Sie, die drawInRect-Ausrichtung auf 0,5,0,5 zu ändern. Ansonsten verteilt Quartz jede Pixelfarbe auf die benachbarten 4 Fixes.

Legen Sie den Farbraum des Zielbildes fest. Möglicherweise haben Sie einen anderen Farbraum, der etwas anders aussieht.

Probieren Sie die verschiedenen Rendering Intents aus und sehen Sie, welches das beste Ergebnis erzielt, ob perzeptiv oder relativ farbmetrisch. Es gibt 4 Möglichkeiten, denke ich.

Sie erwähnen, dass die Farben durch das Speichern von JPEG gegenüber PNG geändert werden.

Sie können die Komprimierungsstufe beim Speichern in JPEG angeben. Versuchen Sie mit etwas wie 0.8 oder 0.9. Sie können JPEG auch ohne Komprimierung mit 1.0 speichern, aber PNG hat einen entscheidenden Vorteil. Sie geben die Komprimierungsstufe im Optionsverzeichnis für CGImageDesinationAddImage an.

Schließlich - wenn nichts hilft - sollten Sie eine TSI mit DTS öffnen, können sie Ihnen sicherlich die Anleitung geben, die Sie suchen.

    
Cocoanetics 17.12.2012 06:08
quelle
1

Das übliche Problem ist, dass die Cropping-Größen float sind, aber die Bildpixel ganzzahlig sind. Kakao interpoliert es automatisch.

Sie müssen die Größe und die Koordinaten des Bodens flood, round oder ceil sein, um sicherzustellen, dass sie Integer sind.

Dies kann helfen.

    
Remizorrr 10.12.2012 14:01
quelle
0

Ich mache EXIF ​​löschen von JPG-Dateien und ich denke, ich habe den Grund gefangen:

Alle Verluste und Änderungen kommen von der Neukomprimierung Ihres Bildes beim Speichern in Datei.

Sie können die Änderung auch bemerken, wenn Sie nur das gesamte Bild erneut speichern. Was ich tun soll, ist das Original-JPG zu lesen und es in eine Qualität zu komprimieren, die die gleiche Dateigröße annimmt.

    
Jiulong Zhao 22.02.2014 13:36
quelle