Tentukan unit - sepertinya saya ingat mengalami masalah ketika saya menghilangkan opsi ini (walaupun DPI harus menjadi default), misalnya:
convert -units PixelsPerInch input.png -density 300 output.png
Apakah Anda tahu bidang data tersemat mana yang digunakan GIMP untuk membaca resolusi - apakah resolusinya sendiri yang menggantikan standar yang digunakan oleh ImageMagick? Misalnya, Photoshop menggunakan Photoshop:XResolution
dan Photoshop:YResolution
jadi Anda harus menyetelnya agar Photoshop dapat mengenali setelan kerapatan (ImageMagick tidak dapat melakukan ini - kami menggunakan ExifTool).
Perhatikan bahwa Anda dapat menggunakan Exiftool untuk membacakan resolusi. Misalnya, Exiftool '-*resolution*' c.jpg
mungkin menunjukkan
Satuan Resolusi :inciX Resolusi :300Y Resolusi :300
Exiftool juga dapat mengatur parameter, tetapi seperti yang tercantum dalam halaman manual Image::ExifTool::TagNames
, Tag Ekstra XResolution dan YResolution tidak dapat ditulis oleh Exiftool.
Saya tidak tahu apakah ImageMagick memiliki opsi perubahan resolusi, tetapi akan terkejut jika tidak. Selain itu, sangat mudah untuk menulis skrip GIMP untuk mengotomatiskan tugas seperti ini, dan juga memungkinkan untuk mengubah resolusi dengan program kecil. Sebagai contoh, berikut adalah program C (dapat dikompilasi melalui gcc setRes.c -O3 -Wall -o setRes
) yang membaca beberapa byte pertama file jpeg, mengubah resolusi menjadi 300, dan menulis ulang. Program seperti yang ditunjukkan menggunakan konstanta untuk mesin little-endian, seperti x86. Jika dijalankan pada mesin big-endian, seharusnya diakhiri dengan pesan seperti Error: xyz may be not a .jpg file
, meskipun xyz adalah file jpeg. Perhatikan, saya belum menguji gambar yang dihasilkan melalui pdflatex
; Anda mungkin merasa perlu untuk memposting pertanyaan di tex 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;
}
Saya tidak tahu cara meyakinkan convert untuk hanya menambahkan metadata dan tidak menyandikan ulang bitmap [monokrom] saya; itu memperluas file>50%.
Saya menemukan bahwa pngcrush (bukan alat ImageMagick) juga dapat menambahkan metadata kepadatan. Baris perintah ini menandainya 600dpi dan memungkinkan pengoptimalan lainnya, yang mengurangi ukuran file sebesar ~10%:
pngcrush -res 600 in.png out.png