Wie kann ich einem JPEG-Foto einen Rand hinzufügen, ohne die Qualität zu beeinträchtigen?

24

Ich habe ein Foto im JPEG-Format mit einer Auflösung von 4680x3120. Ich möchte dieses Foto mit einem weißen Rand versehen und aus Gründen des Drucks in ein Foto der Größe 5200 x 3467 verwandeln.

Klar, ich ändere oder entferne nichts vom Foto, ich füge einfach etwas hinzu. Daher kann dieses Verfahren im Prinzip verlustfrei sein. Wenn ich jedoch Paint zum Hinzufügen dieses Rahmens verwende, wird das Foto beim Speichern von Paint erneut in das JPEG-Format komprimiert, wodurch Informationen und Qualität verloren gehen.

Gibt es eine Möglichkeit (ein professionelleres Programm), einem JPEG-Foto etwas wie einen Rand hinzuzufügen, ohne den Originalteil des Fotos zu beeinträchtigen, ohne die Qualität zu beeinträchtigen?

LBogaardt
quelle

Antworten:

35

Obwohl die Antwort von Philip der beste Weg ist, ist es möglich, das zu tun, was Sie wollen, und zwar vollständig innerhalb der Sphäre von JPEG.

JPEG zerlegt Ihr Bild in Blöcke, die als Minimum Coding Units (MCUs) bezeichnet werden, normalerweise jeweils 16 × 16, und komprimiert sie separat. Sie können dies in Bildern sehen, wenn Sie die Komprimierungsstufe sehr hoch drehen. Bei einer angemesseneren Komprimierungsstufe werden die Blöcke so gleichmäßig zusammengefügt, dass Sie die Ränder nie sehen.

Wir können diese Tatsache nutzen, um einem Bild verlustfrei einen einfachen weißen Rand hinzuzufügen. Wir müssen einfach eine hohle Anordnung von weißen Blöcken erstellen, die der Ausgabebildgröße entspricht, und dann die ursprünglichen JPEG-MCU-Blöcke in die Mitte legen

Diese Technik hat einen Nachteil: Sie funktioniert nur, wenn sowohl die Eingangs- als auch die Ausgangsbildgröße ein gerades Vielfaches der MCU-Größe beträgt. Ist dies nicht der Fall, müssen wir einige der Blöcke am Rand zwischen dem weißen Rand und den Rändern des Originalbilds neu komprimieren. Sie werden diesen Unterschied bei der Ausgabe nicht bemerken, wenn Sie sich von den übermäßig hohen JPEG-Komprimierungsstufen fernhalten, sodass die Ausgabe weiterhin effektiv verlustfrei ist.

Mir ist kein Programm bekannt, das nur dies tut. Das Nächste, was mir bewusst ist, ist etwas, das den umgekehrten Vorgang ausführt : jpegtran hat eine Zuschneidefunktion, die Teile der Bildkanten verlustfrei abschneidet die mitte unberührt.

Die einfachste fertige Lösung, die mir bekannt ist, ist das Better JPEG Lossless Resave- Plugin für Photoshop. Es verwendet Techniken, die auf den oben genannten Ideen basieren, um MCUs vom Originalbild zu kopieren, wo immer dies möglich ist, um zu vermeiden, dass sie aus der unkomprimierten Version neu erstellt werden, wie dies in Photoshop normalerweise der Fall ist.³


Exkursionen:

  1. Möglicherweise ist der resultierende Rand nicht ganz weiß , da der Verlust von JPEG zu Farbunterschieden in der Ausgabe führt. Ich habe einige Tests durchgeführt, und zumindest in Photoshop führt ein rein weißes Bild, das mit der JPEG-Stufe 10 von Save For Web (dh mit "geringer" Qualität) gespeichert wurde, zu einem dekodierten Bild, das immer noch rein weiß ist.

    Das habe ich mit zwei Tests festgestellt:

    Zuerst habe ich das JPEG als Ebene über das Original geladen, den Mischmodus der oberen Ebene auf Differenz eingestellt und dann eine Ebene zum Anpassen der Ebenen darüber hinzugefügt, um zu versuchen, die Unterschiede zu vergrößern. Das resultierende Bild blieb schwarz und zeigte "keinen Unterschied" an.

    Zweitens, als ich die erwarteten Unterschiede nicht sah, ließ ich die Einstellungsebene fallen und stellte die JPEG-Ebene auf den normalen Mischmodus zurück, nahm die Pipette und suchte im gesamten Bild nach einem Pixel, das nicht als RGB angezeigt wurde (255,255,255) ) im Infofenster. Ich habe nie einen gefunden. Ich hatte erwartet, dass die Zahlen ein wenig flackern, während ich über das Bild streifte, aber sie blieben felsenfest.

    Ich kann nur den Schluss ziehen, dass dies ein entarteter Fall des Kodierungsalgorithmus ist: Reinweiße Blöcke bleiben durch die diskrete Cosinustransformation weiß .

    Interessanterweise passiert dies nicht mit reinen schwarzen Blöcken. Zumindest mit Photoshop-Implementierung verwandeln sie sich beim Dekodieren in RGB (1,1,1) und nicht in RGB (0,0,0).

    Unterm Strich müssen Sie sich keine Gedanken über gesputterte Punkte in diesem Randbereich machen, wenn Sie ein Bild drucken, das mit der oben beschriebenen Technik erstellt wurde.

  2. jpegtranist ein Befehlszeilenprogramm, aber es gibt auch ein GUI-Windows-Programm, das auf demselben Code basiert, der aufgerufen wird jpegcrop.

  3. Leider ist dieses Plugin nur für Windows.

Warren Young
quelle
1
Ich habe ein Programm namens JPEG-Assistent verwendet, das solche Funktionen bietet. Es hatte auch eine sehr gute Möglichkeit, verschiedene Komprimierungsverhältnisse auf verschiedene Teile eines JPEG anzuwenden. Man könnte daher eine hohe Qualitätseinstellung für Kopf und Hände einer Person, eine mittlere Qualität für ihre Kleidung und eine geringere Qualität für den Hintergrund verwenden und so zu einer kleineren Datei mit einer besseren Gesamtqualität kommen, als wenn man für alles eine mittlere Qualität verwendet hätte.
Supercat
1
Ich hatte keine Gelegenheit, es zu versuchen, aber dieser Blogeintrag legt nahe, dass jpegtrandie Zuschneidefunktion auch zur Erweiterung verwendet werden kann. (Ich bin mir jedoch nicht sicher, welche Farbe die erweiterten Ränder haben.)
mattdm
4
@mattdm: Ja, jpegtrankann das Bild auch erweitern, aber es wird immer mit einem hartcodierten Mittelgrau, RGB (128,128,128), aufgefüllt. Dies geschieht einfach, weil dies die einzige einfache Option ist, da Sie dies im DCT-Koeffizientenraum mit einem einfachen bzero()Aufruf tun können . Ich habe einen wilden Hack versucht, um dies zu ändern , was nicht funktioniert, aber Ihnen ein Gefühl für die damit verbundene Hässlichkeit vermitteln sollte. wirft frustriert die Hände hoch
Warren Young
@WarrenYoung: Um die Farbe der Füllblöcke zu ändern, müssten Sie vermutlich nur den ersten (DC-) Koeffizienten ändern und die anderen auf Null belassen. Natürlich sind die Koeffizienten komprimiert, also ... sollte es auf jeden Fall machbar sein, aber ich stimme zu, dass es nicht so trivial ist, wie es scheinen mag.
Ilmari Karonen
2
Was Ihren letzten Punkt betrifft, die größte Ersparnis ergibt sich aus dem Wegwerfen von Hochfrequenzinformationen. Der Gewinn durch das Wegwerfen der Präzision auf die Farbe eines festen Pixelblocks kann nicht mehr als ein oder zwei Bytes betragen, es wird also nie oder fast nie ausgeführt. Wenn Daten verloren gehen, liegt dies an der YUV <-> RGB-Farbraumkonvertierung.
Hobbs
20

Der Punkt hier zu erinnern ist , dass Sie Qualität verlieren , wenn Speichern Sie das Foto in einem verlustbehafteten Kompressionsformat. Solange Sie das Foto nach dem Hinzufügen des Rahmens in einem verlustfreien Format (PSD, TIFF usw.) speichern , gehen nicht mehr Daten verloren, als Sie bereits verloren haben, wenn Sie das Foto zunächst als JPEG speichern.

Philip Kendall
quelle
1
Vielen Dank. Und das gilt auch, wenn Sie ein 'beschissenes' Programm wie Paint verwenden, um es zB in TIFF zu speichern?
LBogaardt
4
Mindestens meinem Schnelltest zufolge verwendet Paint beim Speichern von TIFFs den verlustfreien LZW- Komprimierungsalgorithmus, damit er in Ordnung aussieht.
Philip Kendall
5
Denken Sie daran, dass dies wahrscheinlich die Größe des Bildes erheblich erhöhen wird ...
BlueRaja - Danny Pflughoeft
2
Paint unterstützt auch PNG, das ebenfalls ein verlustfreies Format ist
phuclv
+1 dafür, da die Antworten, in denen das Zurückspeichern in JPEG besprochen wird, nicht mit allen JPEG-Codierungsoptionen kompatibel sind.
James Snell
6

Es ist nicht ganz verlustfrei, aber mit GIMP (oder einem anderen Editor mit einer ähnlichen Funktion) und den folgenden zwei Tricks können Sie ziemlich genau hinschauen:

  1. Stellen Sie zunächst sicher, dass der Rand, den Sie hinzufügen, ein Vielfaches von 8 Pixel (und vorzugsweise ein Vielfaches von 16 Pixel) breit ist .

    Dies ist wichtig, da der JPEG-Komprimierungsalgorithmus das Bild ausgehend von der oberen linken Ecke in 8 × 8-Pixel-Blöcke * aufteilt und den verlustbehafteten Komprimierungsalgorithmus unabhängig auf jeden Block anwendet. Zumindest im Prinzip können Sie ein JPEG-Bild verlustfrei auffüllen, indem Sie die vorhandenen Blöcke mit 8 × 8 Pixeln ergänzen. Wenn Sie jedoch versuchen, einen Rand hinzuzufügen, der nicht eine ganze Anzahl von Blöcken breit ist, stimmen die Blöcke im aufgefüllten Bild nicht mit denen im Original überein, und ein gewisser Komprimierungsverlust ist unvermeidlich.

    *) Tatsächlich verwenden die meisten JPEG-Bilder das Chroma-Sub-Sampling. Dies bedeutet, dass nur der Graustufenteil des Bildes in 8 × 8-Blöcken komprimiert wird, während die Chroma-Kanäle vor der Komprimierung um 50% verkleinert werden, wodurch sich ihre effektive Blockgröße auf 16 × erhöht 16 Pixel. Um optimale Ergebnisse zu erzielen, sollte Ihre Rahmenbreite also ein Vielfaches von 16 Pixel sein. Normalerweise kommt man jedoch mit einem Rand von 8 (oder 24 oder 40 usw.) Pixeln davon, da ein gewisser Komprimierungsverlust in der Farbsättigung nicht sehr auffällt.

  2. Der zweite Teil des Tricks besteht darin, beim Speichern des endgültigen Bildes das Kontrollkästchen "Qualitätseinstellungen vom Originalbild verwenden" im Dialogfeld " Bild als JPEG exportieren" (unter "Erweiterte Einstellungen") zu aktivieren. Tun Sie dies auch dann, wenn es den Anschein hat, als würde dies zu einer geringeren Qualität führen, als Sie normalerweise verwenden würden!

    Diese Einstellung bewirkt, dass GIMP genau die gleichen Komprimierungseinstellungen verwendet, die für das Originalbild verwendet wurden, wodurch in der Regel etwa 99% der Komprimierungsverluste beseitigt werden, vorausgesetzt, Sie haben das Bild nicht zu stark bearbeitet und insbesondere die Blöcke im Das neue Bild stimmt immer noch mit dem Original überein. (Es wird gelegentlich immer noch Verluste aufgrund von Rundungsfehlern geben, aber viel weniger als sonst.)


Als kurze Demonstration nahm ich dieses JPEG-Testbild aus Wikimedia Commons , das ursprünglich mit einer Einstellung von 50 für eine relativ niedrige Qualität gespeichert wurde, und fügte ihm mit der oben beschriebenen Methode einen schicken 8-Pixel-Schwarzweißrand hinzu:

Testbild mit 8px Rand, meist verlustfrei

Hier ist der Unterschied zwischen dem Originalbild (15,1 kB) und dem bearbeiteten Bild (16,7 kB), das im GIMP-Ebenenmodus "Getreideextrakt" angezeigt wird:

Unterschied zwischen gepolstertem Bild und Original

Sie können einige sehr leichte Chroma-Fehler sehen, die darauf zurückzuführen sind, dass die Randbreite nicht ein Vielfaches von 16 ist, und (wenn Sie genau hinschauen) einige Blöcke, in denen es aufgrund von Abrundung auch geringfügige Verluste im Lumakanal gab. Optisch sind das Original und das gepolsterte Bild selbst bei zweifacher Vergrößerung und abwechselndem Spiegeln kaum zu unterscheiden.

Insbesondere kontrastiert diese mit dem Ergebnis stößt die JPEG - Qualität auf 50 bis 60 vor dem gepolsterte Bild zu speichern, die das folgenden 17,6 kB Bild ergibt:

Testbild mit 8px Rand, Qualität von 50 auf 60 angehoben

Bei hoher Vergrößerung können Sie definitiv feststellen, dass das bearbeitete Bild an einigen Stellen merklich unschärfer ist als das Original, und der Unterschied zu Grain Extract bestätigt dies:

Unterschied zwischen aufgefülltem Bild (bei q60) und Original

Ilmari Karonen
quelle
"Das Aktivieren dieses Kontrollkästchens scheint die Einstellung" Progressiv "nicht zu beeinflussen." Kein Fehler, da progressive Codierung eine Codierungseinstellung und keine Qualitätseinstellung ist. Jpegtran kann Bilder verlustfrei in und aus Progressive konvertieren.
Damian Yerrick
@tepples: Du hast recht; Ich habe diesen Absatz entfernt. Aus irgendeinem Grund hatte ich den Eindruck, dass das Umschalten des progressiven Modus dazu führen würde, dass die Qualitätseinstellungen nicht übereinstimmen, aber ein schneller Test scheint zu bestätigen, dass ich mich darin geirrt habe.
Ilmari Karonen
1
@ thomasrutter: Ich kann einen Kommentar nicht runterstimmen, daher verweise ich Sie einfach auf den ursprünglichen Forumsbeitrag, in dem die Funktion beschrieben wird , und insbesondere auf dieses Zitat: " Wenn Sie nur einige Änderungen am Bild vorgenommen haben, wiederholen Sie den Vorgang. Wenn Sie dieselben Quantisierungstabellen verwenden, erhalten Sie fast die gleiche Qualität und Dateigröße wie das Originalbild. Auf diese Weise werden die durch den Quantisierungsschritt verursachten Verluste im Vergleich zu denen, die bei Verwendung unterschiedlicher Quantisierungstabellen auftreten würden, auf ein Minimum reduziert. "
Ilmari Karonen
1
Zum Vergleich hier ein weiteres Beispiel für die Beantwortung einer anderen Frage. Mein Verständnis in der Theorie stimmt mit Ilmari überein, aber zumindest in meinem Beispiel scheint die Praxis viel mehr mit dem übereinzustimmen, was Thomas sagt - zumindest wenn man mit einem stark herabgesetzten Bild beginnt. (Ich denke, der Grabstein ist ein schlechtes Beispiel für diesen Zweck, weil der Detailverlust auf dem Stein weniger offensichtlich ist als auf der menschlichen Haut.)
mattdm
1
@mattdm: Es scheint ziemlich softwareabhängig zu sein; Ich habe versucht, Ihre Ergebnisse aus dieser Antwort in GIMP zu reproduzieren, und es scheint, dass GIMP (mindestens v2.8.10) die JPEG-Qualität wesentlich besser bewahrt als ImageMagick (unabhängig von der von Ihnen getesteten Version). Ihr erstes Bild, das einmal bei q75 gespeichert wurde, hat eine PSNR von 34.0298, während das bei q75 zweimal gespeicherte Bild nur eine PSNR von 32.8169 hat (und das Bild, das achtmal erneut gespeichert wurde, eine PSNR von 32.6459 hat). Im Vergleich dazu ergibt das einmalige Speichern desselben Quellbilds in GIMP bei q75 einen PSNR von 36,4560. Beim Öffnen und erneuten Speichern in derselben Qualität wird der Wert nur geringfügig auf 36,3295 verringert.
Ilmari Karonen,
3

Entschuldigung, wenn dies nicht genau das ist, was Sie wollten, aber ...

Es hört sich so an, als würden Sie beim Drucken einen weißen Rand hinzufügen, um das Bild besser positionieren zu können. Warum sollten Sie sich nicht darauf konzentrieren, die Druckschnittstellen richtig zu erlernen und solche zweifelhaften Hacks zu vermeiden? Das andere Problem ist, dass Sie dem Druckprogramm erlauben, die Größe Ihres 4680x3120-Bildes an die richtige DPI / Auflösung anzupassen. Dies hat möglicherweise schwerwiegendere Auswirkungen als das erneute Speichern eines JPEG.

aaaaargZombies
quelle
Beide gültigen Punkte, danke. Ich habe mein Foto jedoch in eine dieser Online-Druckereien hochgeladen, sodass ich keinen Einfluss auf den eigentlichen Drucker habe.
LBogaardt
1

Die bisherigen Antworten sind sehr gut.

Ich werde nur einige "psychologische Aspekte" des JPG-Formats hinzufügen.

Wenn ein JPG gut vorbereitet ist, verliert es nur etwa 0,5% der Informationen. Das ist in den allermeisten Fällen etwas, das das menschliche Auge nicht sehen kann. Sie benötigen ein Programm, um einige Analysen durchzuführen und die Unterschiede zu erkennen (wie die Analyse, die Ilmari gerade durchgeführt hat).

"Gute Qualität" ist ein Prozess, nicht nur die Art und Weise, wie ein Dateiformat das Bild speichert. Ja, Sie haben die Datei noch einmal mit jpg komprimiert, weil Sie sie wirklich gebraucht haben. Wenn es sich um eine kontrollierte Situation handelt, ist dies in Ordnung.

Sie haben es wirklich gebraucht, was bedeutet, dass Sie kein anderes verlustfreies Format verwenden können, sehr spezielle Speicher- oder Softwareanforderungen haben oder einen sehr engen Workflow haben.

Wenn Sie sich wirklich Gedanken über die Qualität machen, würden Sie Paint wahrscheinlich nicht verwenden. Das JPG-Format verfügt über einige Konfigurationen, die Sie in Paint überhaupt nicht steuern können.

Hier ist meine Liste der kostenlosen Programme, mit denen Sie die JPG-Komprimierung wirklich steuern können, sowie die Option, die Sie auswählen müssen. (Alle im JPG-Speicherdialog)

Irfanview - Aktivieren Sie diese Option, um die Unterabtastung für Chroma-Farben zu deaktivieren.

FastStone Image Viewer - Farbunterabtastung: Keine.

Gimp - Subsampling 4: 4: 4

Fazit. Verwenden Sie keine Farbe.

Eine Sache habe ich noch nicht überprüft. Wenn alle diese Programme das eingebettete Farbprofil beibehalten. Ich werde meinen Beitrag später bearbeiten.

Rafael
quelle
Jemand stimmte bei dieser Antwort mit -1. Normalerweise ist es mir egal, weil ich weiß, dass ich etwas Dummes sagen kann. In diesem speziellen Fall: Welcher Teil der Antwort ist falsch?
Rafael
Ich habe nicht abgestimmt (hoch oder runter), aber Sie möchten vielleicht an Ihrer Rechtschreibung und Grammatik arbeiten, um einen besseren ersten Eindruck zu erhalten (und ehrlich gesagt, um die Lesbarkeit Ihrer Antwort zu verbessern). Auch diese Frage hat bereits mehrere Antworten (und meine stellte sich insbesondere als ziemlich lang heraus); Irgendwann fangen manche Leute an, Antworten abzustimmen (oder zumindest nicht abzustimmen), die den vorhandenen Antworten nicht eindeutig etwas Neues hinzufügen. Versuchen Sie auch, Ihre Antwort so zu strukturieren, dass die wichtigen Punkte auf einen Blick herausragen. In diesem Fall ist der einzige fett hervorgehobene Teil eine unwichtige Fußnote.
Ilmari Karonen
Vielen Dank für Ihren Kommentar Ilmari. Ich habe Mühe, in Englisch zu denken, da es nicht meine Muttersprache ist. Ich werde nach einem Rechtschreibwerkzeug suchen. Ich bin mir nicht sicher, ob es eine Grammatik gibt. - Für den zweiten Teil des Kommentars verstehe ich, dass die Logik hinter StackExchange darin besteht, die Frage unabhängig zu beantworten, da der Ablauf der Antworten nicht festgelegt ist, da sie die Reihenfolge ändern oder bearbeitet werden können. Das werde ich mir mal ansehen. (Ich habe den fetten Text entfernt) Nochmals vielen Dank. : o)
Rafael
1
"Es verliert nur etwa 0,5% Informationen" [Zitieren benötigt] :)
Warren Young
Hey Warren, hier ist es: otake.com.mx/Apuntes/PruebasDeCompresion2/… Es ist in Spanisch, bitte benutze fürs Erste Google Translate und ich muss es aktualisieren. In der Tat ist es weniger als 0,392% :)
Rafael
0

IrfanView funktioniert bei mir gut für Bildersätze. Hier finden Sie einige Hinweise zur Vorgehensweise

Hier ist meine gespeicherte Prozedur zum Einfügen eines Rahmens - Infran-Prozedur zum Hinzufügen eines Rahmens

  1. Rechtsklick auf das Bild, 'Öffnen mit' -> 'InfranView'
  2. Drücke 'b'
  3. Aktivieren Sie "Erweiterte Optionen verwenden" oben links und drücken Sie "Erweitert".
  4. Check 'Canvas Size', drücke 'Settings'
  5. Geben Sie jede Rahmenbreite ein (linke Seite, rechte Seite, obere Seite, untere Seite)
  6. Drücke OK'
  7. Wählen Sie "Vorhandene Dateien überschreiben"
  8. Drücke OK'
  9. Geben Sie das Ausgabeverzeichnis 'Ausgabeverzeichnis für Ergebnisdateien:' ein.
  10. Navigieren Sie zu dem Bild und doppelklicken Sie darauf, um einen Rahmen in der oberen Liste hinzuzufügen. Dies fügt es der Liste "Eingabedateien:" in der unteren Liste hinzu
  11. Klicken Sie auf "Start Batch".
J-Dizzle
quelle
1
Können Sie erklären, was an dieser Methode besonders ist, damit sie den Anforderungen des Posters entspricht, die Bildqualität nicht zu beeinträchtigen? Beim ersten Lesen scheint dies das JPEG durch den gesamten Dekomprimierungs- / Neukomprimierungszyklus zu schicken, den das Poster zu vermeiden versucht.
Philip Kendall
hmmm, du bringst einen interessanten Punkt in Bezug auf den Bildlebenszyklus durch den Prozess, den ich hier aufführe, ich habe nicht daran gedacht. Sie können recht haben, wenn Sie möchten, dass ich mein Posting entferne oder ändere, lassen Sie es mich bitte wissen :)!
J-Dizzle