Ich möchte die DPI mit ImageMagick ändern, ohne die tatsächliche Bytegröße der Bilddaten zu ändern

Ich möchte die DPI mit ImageMagick ändern, ohne die tatsächliche Bytegröße der Bilddaten zu ändern

In GIMP gibt es eine sehr einfache Möglichkeit, das zu tun, was ich will. Ich habe nur den deutschen Dialog installiert, aber ich werde versuchen, ihn zu übersetzen. Ich spreche davon, zu zu gehen Picture -> PrintingSizeund dann die Werte anzupassen X-Resolution, Y-Resolutiondie mir als sogenannte DPI-Werte bekannt sind. Sie können auch das Format wählen, das standardmäßig ist Pixel/Inch. (Auf Deutsch ist der Dialog Bild -> Druckgrößeund dort X-Auflösungund Y-Auflösung)

Ok, die Werte dort sind oft 72Standard. Wenn ich sie z. B. auf ändere, 300hat das den Effekt, dass das Bild auf dem Computer gleich bleibt, aber wenn ich es ausdrucke, wird es kleiner, wenn man es betrachtet, aber alle Details sind immer noch da, nur kleiner -> es hat eine höhere Auflösung auf dem ausgedruckten Papier (aber eine kleinere Größe... was für mich in Ordnung ist).

Ich mache das oft, wenn ich mit LaTeX arbeite, oder genauer gesagt mit dem Befehl pdflatexauf einer aktuellen Ubuntu-Maschine. Wenn ich den obigen Vorgang mit GIMP manuell durchführe, funktioniert alles einwandfrei. Die Bilder erscheinen im resultierenden PDF kleiner, haben aber eine hohe Druckqualität.

Ich versuche, den Vorgang zu automatisieren, bei dem ich in GIMP gehe und die DPI-Werte anpasse. Da ImageMagick als hervorragend gilt und ich es für viele andere Aufgaben verwende, habe ich versucht, mein Ziel mit diesem Tool zu erreichen. Aber es macht einfach nicht, was ich will.

Nachdem ich viele Dinge ausprobiert habe, denke ich, dass dies tatsächlich der Befehl ist, der mein Freund sein sollte:

convert input.png -density 300 output.png

Dies sollte die DPI auf 300 setzen, wie ich überall im Web lesen kann. Es scheint zu funktionieren. Wenn ich die Datei überprüfe, bleibt sie gleich (EDIT: das ist, was ich erwarte, wie oben erklärt).

file input.png output.png
     input.png: PNG image data, 611 x 453, 8-bit grayscale, non-interlaced
    output.png: PNG image data, 611 x 453, 8-bit grayscale, non-interlaced

Wenn ich diesen Befehl verwende, scheint er das gewünschte Ergebnis zu erzielen:

identify -verbose output.png | grep 300
    Resolution: 300x300
    PNG:pHYs                 : x_res=300, y_res=300, units=0

(Komischerweise kommt die gleiche Ausgabe, input.pngwas mich verwirrt ... sind das also vielleicht die falschen Parameter, auf die man achten sollte?)

AberWenn ich jetzt mein TeX rendern lasse, ist das Bild immer noch groß und verschwommen. Auch wenn ich das Bild erneut mit GIMP öffne, sind die DPI-Werte auf statt auf pdflatexeingestellt . Es gab also tatsächlich überhaupt keinen Effekt.72300

Was ist hier nun das Problem? Habe ich etwas völlig falsch verstanden? So falsch kann ich nicht liegen, denn mit GIMP funktioniert alles einwandfrei.

Vielen Dank für jede Hilfe. Ich bin auch offen für andere automatisierte Lösungen, die auf einem Linux-System problemlos umgesetzt werden können.

Antwort1

Geben Sie die Einheiten an. Ich glaube, ich hatte ein Problem, als ich diese Option wegließ (obwohl DPI die Standardeinstellung sein sollte), zum Beispiel:

convert -units PixelsPerInch input.png -density 300 output.png

Wissen Sie, welche eingebetteten Datenfelder GIMP zum Lesen der Auflösung verwendet? Hat es eigene, die die von ImageMagick verwendeten Standardfelder überschreiben? Photoshop verwendet beispielsweise diese, Photoshop:XResolutionund Photoshop:YResolutionSie müssen diese also festlegen, damit Photoshop eine Dichteeinstellung erkennt (ImageMagick kann dies nicht – wir verwenden ExifTool).

Antwort2

Ich wusste nicht, wie ich überzeugen sollteKonvertierennur die Metadaten hinzuzufügen und mein [monochromes] Bitmap nicht neu zu kodieren; dadurch wurde die Datei um mehr als 50 % vergrößert.

Ich habe das entdecktAbonnieren(kein ImageMagick-Tool) kann auch die Dichte-Metadaten hinzufügen. Diese Befehlszeile markiert 600 dpi und ermöglicht weitere Optimierungen, die die Dateigröße um ~10 % reduzieren:

pngcrush -res 600 in.png out.png

Antwort3

Beachten Sie, dass Sie Exiftool verwenden können, um Auflösungen auszulesen. Beispielsweise Exiftool '-*resolution*' c.jpgkönnte

Auflösungseinheit: Zoll X-Auflösung: 300 Y-Auflösung: 300

Exiftool kann auch Parameter festlegen, aber wie auf der Manpage vermerkt Image::ExifTool::TagNames, können die zusätzlichen Tags XResolution und YResolution von Exiftool nicht geschrieben werden.

Ich weiß nicht, ob ImageMagick Optionen zum Ändern der Auflösung hat, aber es würde mich überraschen, wenn es keine gibt. Außerdem ist es ganz einfach, GIMP-Skripte zu schreiben, um Aufgaben wie diese zu automatisieren, und es ist auch möglich, Auflösungen mit kleinen Programmen zu ändern. Das folgende Beispiel ist ein C-Programm (kompilierbar über gcc setRes.c -O3 -Wall -o setRes), das die ersten paar Bytes einer JPEG-Datei liest, die Auflösung auf 300 ändert und sie neu schreibt. Das gezeigte Programm verwendet Konstanten für Little-Endian-Maschinen wie x86. Wenn es auf einer Big-Endian-Maschine ausgeführt wird, sollte es mit einer Meldung wie enden Error: xyz may be not a .jpg file, selbst wenn xyzIsteine jpeg-Datei. Beachten Sie, dass ich die resultierenden Bilder nicht über getestet habe pdflatex. Sie werden es wahrscheinlich für sinnvoll halten, eine Frage imtex SE.

/* jiw -- 24 Sep 2012 -- Re: set resolution in a jpg -- Offered without
warranty under GPL v3 terms as at http://www.gnu.org/licenses/gpl.html
*/
#include <stdlib.h>
#include <stdio.h>
void errorExit(char *msg, char *par, int fe) {
  fprintf (stderr, "\n%3d Error: %s %s\n", fe, msg, par);
  exit (1);
}
// Note, hex constants are byte-reversed on little vs big endian machines
enum { JF=0x464a, IF=0x4649, L300=0x2c01, B300=0x012c, NEWRES=L300};
int main(int argc, char *argv[]) {
  FILE *fi;
  short int buf[9];
  int r, L=sizeof buf;
  if (argc<2) errorExit(argv[0], "requires a .jpg file name", 0);
  fi = fopen(argv[1], "r+b");
  if(!fi) errorExit("open failed for", argv[1], ferror(fi));
  r = fread(buf, 1, L, fi);
  if (r != L) errorExit("read failed for", argv[1], ferror(fi));
  if (buf[3] != JF || buf[4] != IF) // Check JFIF signature
    errorExit(argv[1], "may be not a .jpg file", 0);
  buf[7] = buf[8] = NEWRES;
  fseek(fi, 0, SEEK_SET);
  r = fwrite(buf, 1, L, fi);
  if (r != L) errorExit("write failed for", argv[1], ferror(fi));
  return 0;
}

Antwort4

„Ich möchte die DPI mit Imagemagick ändern, ohne die tatsächliche Bytegröße der Bilddaten zu ändern.“

Das ist völlig unmöglich!

Weil:

     more "Dots per Inch" 
<==> more pixels per area 
<==> more total pixels per image 
<==> more total bytes per image

Außerdem scheinen Sie nicht zu verstehen, was DPI in Wirklichkeit ist:

  1. Es handelt sich um einen völlig abstrakten Wert, der nur dann einen praktischen Wert erhält, wenn man auch die absolute Größe des Ausdrucks bzw. der Darstellung auf dem Bildschirm bzw. Monitor kennt:
    • Sie können dasselbe 72 x 72 Pixel große Bild auf einem 1 Zoll breiten Quadrat „drucken“: Der Ausdruck hat eine Auflösung von 72dpi.
    • Sie können es auch auf einem 1/4 Zoll breiten Quadrat „drucken“: Dann hat der Ausdruck eine Auflösung von 288dpi.
    • (Hinweis: Wenn Sie es auf einem 1-Zoll-Quadrat „drucken“ 288dpi, ist es nicht mehr dasselbe Bild: Es wurde durch den Druckertreiber oder einen anderen Filtermechanismus extrapoliert und hat nun eine Größe von 288 x 288 Pixeln anstelle von 72 x 72 Pixeln ...)
  2. Beide Ausdrucke enthalten genau dieselben Bildinformationen. Das 288-dpi-Bild enthält nicht plötzlich mehr Informationen.

Wenn Sie das Originalbild mit 72x72 Pixeln als 1 Zoll breites Quadrat drucken möchten, aber bei 288dpi, dann müssen SieNeu skalierendas Bild (in diesem Fall durch Hochskalieren). Für jedes Pixel im Original benötigen Sie 4 Pixel des neuen, hochskalierten Bildes. Nun gibt es verschiedene Algorithmen, mit denen berechnet werden kann, welche Farbwerte diese 4 Pixel (3 davon neue Pixel) haben sollten:

  • Sie könnten ihnen die gleichen Werte wie dem Originalpixel geben (was ein sehr "roher" Algorithmus ist,
  • oder Sie könnten eine Mittelung des Farbwerts des Originalpixels mit den Farbwerten der benachbarten Pixel vornehmen.

In jedem Fall erstellen Sie ein größeres Bild, das aus 288 Pixelzeilen besteht, die jeweils 288 Pixel hoch sind (288 x 288 Pixel).

Was Gimp für Sie tut, wenn Sie über „Bild -> Druckgröße“ gehen: Es vereinfacht den Prozess der Neuberechnung der erforderlichen Änderungen in absoluten Pixelgrößen und macht ihn benutzerfreundlicher. Zu diesem Zweck...

  • ...es fragt Sie zuerst nach der DPI, da ein bestimmter Drucker seine Druckauflösung nicht beliebig ändern kann (einige bieten nicht nur eine, sondern vielleicht sogar zwei oder drei verschiedene Auflösungen). Sie werden also gefragt, mit welcher Auflösung Sie drucken möchten. Das ist die erste Information.
  • ...dann wird noch die zweite Angabe abgefragt: in welcher Größe (in cm, mmoder inch) der Ausdruck auf dem Papier erscheinen soll.

Anhand dieser beiden Informationen berechnet Gimp dann die Gesamtzahl der Pixel, die es verwenden muss (extrapoliert von der ursprünglichen Pixelanzahl), um den angeforderten Platz mit der angeforderten Auflösung zu füllen.

Das Vergrößern eines Rasterbildes durch Hinzufügen von mehr Pixeln fügt ihm jedoch keine echten Informationen hinzu, sondern fügt ihm nur „Qualität“ hinzu, die fiktiv ist. Es kannsehenFür das menschliche Auge angenehmer, wenn Ihr Skalierungsalgorithmus „gut“ ist. Und es wird hässlich aussehen, wenn Sie vorhandene Pixel einfach verdoppeln, verdreifachen oder vervierfachen, wie es einige einfache Algorithmen tun.

Für Rasterbilder:
Die DPI-Einstellung ist nur relevant im Zusammenhang mitDruckenoderAnzeigees. Denn Drucker oder Monitore haben vorgegebene, feste Auflösungen. Daher ist es Info, dass nur...

  • ...einen Druckertreiber oder
  • ...eine Bildverarbeitungsanwendung, die das Drucken unterstützt

muss es wissen.

UndImageMagicks Dokumentationist mit mir völlig einverstanden:

-density width
-density widthxheight
Stellen Sie die horizontale und vertikale Auflösung eines Bildes ein für Rendern auf Geräten.

Für Vektorbilder oder Dateiformate
(wie PDF oder PostScript) ist die DPI-Einstellung jedoch äußerst wichtig im Zusammenhang mitSterilisierensie. Ein höherer DPI-Wert überträgt mehr Bildinformationen in das Rasterformat und bewahrt somit mehr Details der echten Originalqualität. Bei der Konvertierung eines Vektorbilds einer bestimmten Größe in oder mmin ein Raster mit einem höheren DPI-Wert wird direkt eine höhere Gesamtpixelzahl im Bild erreicht.cminch

Außerdem unterstützt ImageMagick das Drucken als solches nicht. Stattdessen unterstützt ImageMagick nur ...

  • ...konvertiert Dateien von einem bestimmten Rasterformat in andere Rasterformate;
  • ... oder es verkleinert oder vergrößert Rasterbilder;
  • ... oder es ändert Farbwerte gemäß einem bestimmten Algorithmus;
  • ...oder es beschneidet Bilder, überlagert sie, invertiert sie, spiegelt sie;
  • ...und was nicht....

...um die bearbeiteten Bilder auszudrucken, müssen Sie jedoch ein anderes Programm verwenden.

Einige Bildformate (TIFF, PNG, ...) unterstützen das interne Speichern einer DPI-Einstellung in ihren Metadaten.

Dies ist jedoch nicht mehr als ein Hinweisattribut, das das zugrunde liegende Rasterbild nicht verändert. Aus diesem Grund haben Sie diese Entdeckung gemacht:

"Wenn ich die Datei überprüfe, bleibt sie gleich."

Dieser „Hinweis“ kann möglicherweise automatisch von Druckertreibern oder Seitenerstellungsprogrammen wie LaTeX ausgewertet werden. Wenn solche DPI-„Hinweise“ fehlen (oder wenn sie sich irgendwie nicht so präsentieren, wie LaTeX es erwartet), sollte LaTeX dennoch angewiesen werden können, jedes beliebige Bild auf einer Seite so darzustellen, wie man es erwartet – es braucht nur etwas expliziteren LaTeX-Code um das Bild herum!

Einige andere Bildformate (JPEG(?), BMP, ...) unterstützen nicht einmal das Speichern eines DPI-Hinweises in ihren internen Metadaten.

Gimp unterstützt also nur das, was Sie unter „Bild -> Druckgröße“ sehen, weil es ein Bild drucken möchte. Mit ImageMagick können Sie nicht drucken.

Machen Sie beim Drucken mit Gimp weiter, was Sie wollen. Mit ImageMagick ergibt das keinen Sinn.

Siehe auchdieser zusätzliche IM-Dokumentationsausschnitt, das dasselbe Thema mit anderen Worten erklärt.


Was also bleibt ist folgendes:

  • Wenn Sie Ihr Bild mit Gimp „manipulieren“ und das Ergebnis dann in LaTeX einbetten, sieht die Seite so aus, wie Sie es erwarten.
  • Wenn Sie Ihr Bild mit ImageMagick 'manipulieren' und das Ergebnis dann in LaTeX einbetten, sieht die Seite ausnichtwie Sie es erwarten.

Bitte geben Sie Folgendes an, um das oben genannte Problem zu lösen:

  • die genaue Version Ihrer ImageMagick-Installation (vollständige Ausgabe von convert -versionund convert -list configure);
  • (ein Link zu einem) Originalbeispielbild;
  • (ein Link zum) gleichen Bild, bearbeitet mit Gimp;
  • (ein Link zum) gleichen Bild, bearbeitet von ImageMagick.

Auf diese Weise können wir zur Lösung des Problems beitragen.

Aber beachten Sie: Dies ist ein anderes Problem als das, was in Ihrem aktuellen Betreff/Ihrer aktuellen Überschrift gefragt wird:„Ich möchte die DPI mit Imagemagick ändern, ohne die tatsächliche Bytegröße der Bilddaten zu ändern.“


Aktualisieren

Seit es istTrotzdemFür einige Leser ist nicht klar, was ich oben angemerkt habe. Hier ist ein weiterer Versuch …

Was auch immer als'Auflösung'oder'Dichte'innerhalb einer Bilddatei, ist einMetadatenattribut. Es hat keinen Einfluss auf die Anzahl der tatsächlichen Pixel, die durch die Datei beschrieben werden, und ist in dieser Hinsicht völlig irrelevant. Es ist nur einHinweisdie ein Druck- oder Wiedergabegerät oder eine Anwendungoder nichtBefolgen Sie diese Hinweise beim Drucken, Rendern oder Anzeigen des Bildes.

Zu diesem Zweck werden lediglich einige Zahlen in der Bilddatei gespeichert. Diese Zahlen geben Ausgabegeräten wie Druckern und Anzeigen an, mit wie vielen Punkten (oder Pixeln) pro Zoll das Bild angezeigt werden soll. Bei Vektorformaten wie PostScript, PDF, MWF und SVG geben sie den Pixelmaßstab an, um alle vom Bild verwendeten realen Koordinaten darzustellen.

Ein Beispiel, bei dem der von ImageMagick in den Bildmetadaten angegebene AuflösungswertNICHTvon einer Anwendung geehrt wird, ist Adobe Photoshop. Photoshop speichert seine Hinweise zu einer gewünschten Druck- oder Anzeigeauflösung in einem proprietären Profil namens8bim. ImageMagick berührt dieses Profil nicht, selbst wenn es aufgefordert wird, eine Auflösungsänderung in die Metadaten einer Bilddatei zu schreiben. Photoshop hingegen ignoriert alle Auflösungshinweise, die ImageMagick im ansonsten standardmäßigen Metadatenfeld speichert, das für diesen Zweck definiert ist, sobald es seine eigene8bimProfil.

Der OP hätte die Überschrift wählen sollen:

  • „Ich möchte die DPI (Hinweis zur Metadatenauflösung) mit ImageMagick ändern, ohne die tatsächliche Anzahl der Pixel im Bild zu ändern.“

um allen Missverständnissen vorzubeugen...

verwandte Informationen