Geben Sie die Einheiten an - ich erinnere mich, dass ich ein Problem hatte, als ich diese Option weggelassen habe (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? Beispielsweise verwendet Photoshop Photoshop:XResolution
und Photoshop:YResolution
Sie müssen diese also festlegen, damit Photoshop eine Dichteeinstellung erkennt (ImageMagick kann dies nicht tun - wir verwenden ExifTool).
Beachten Sie, dass Sie Exiftool verwenden können, um Auflösungen auszulesen. Beispiel:Exiftool '-*resolution*' c.jpg
könnte angezeigt werden
Auflösungseinheit:ZollX Auflösung:300Y Auflösung:300
Exiftool kann auch Parameter setzen, aber wie in Manpage Image::ExifTool::TagNames
angegeben , die Extra-Tags XResolution und YResolution können nicht von Exiftool geschrieben werden.
Ich weiß nicht, ob ImageMagick Optionen zum Ändern der Auflösung hat, wäre aber überrascht, wenn dies nicht der Fall wäre. Außerdem ist es 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 ist beispielsweise 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 einem Big-Endian-Rechner ausgeführt wird, sollte es mit einer Nachricht wie Error: xyz may be not a .jpg file
enden , auch wenn xyz ist eine JPEG-Datei. Beachten Sie, dass ich die resultierenden Bilder nicht über pdflatex
getestet habe; Sie würden es wahrscheinlich lohnen, eine Frage in der tex SE zu stellen.
/* 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;
}
Ich konnte nicht herausfinden, wie ich Convert überzeugen könnte nur die Metadaten hinzuzufügen und meine [monochrome] Bitmap nicht neu zu codieren; die Datei wurde um>50 % erweitert.
Ich habe diesen pngcrush entdeckt (kein ImageMagick-Tool) kann auch die Dichte-Metadaten hinzufügen. Diese Befehlszeile markiert es mit 600 dpi und ermöglicht andere Optimierungen, die die Dateigröße um ~ 10 % reduziert haben:
pngcrush -res 600 in.png out.png