Určete jednotky – pamatuji si, že jsem měl problém, když jsem tuto možnost vynechal (ačkoli DPI by mělo být výchozí), například:
convert -units PixelsPerInch input.png -density 300 output.png
Víte, která vložená datová pole GIMP používá ke čtení rozlišení - má své vlastní, které přepíše standardní pole používaná ImageMagick? Například Photoshop používá Photoshop:XResolution
a Photoshop:YResolution
takže je musíte nastavit, aby Photoshop rozpoznal nastavení hustoty (ImageMagick to neumí – používáme ExifTool).
Všimněte si, že k načtení rozlišení můžete použít Exiftool. Například Exiftool '-*resolution*' c.jpg
se může zobrazit
Jednotka rozlišení :palceX Rozlišení :300Y Rozlišení :300
Exiftool je také schopen nastavit parametry, ale jak je uvedeno v manuálové stránce Image::ExifTool::TagNames
, Extra Tagy XResolution a YResolution nejsou zapisovatelné pomocí Exiftool.
Nevím, zda má ImageMagick možnosti změny rozlišení, ale byl bych překvapen, kdyby ne. Také je snadné psát skripty GIMP pro automatizaci úloh, jako je tento, a také je možné měnit rozlišení pomocí malých programů. Následuje například program v jazyce C (kompilovatelný pomocí gcc setRes.c -O3 -Wall -o setRes
), který přečte prvních několik bajtů souboru jpeg, změní rozlišení na 300 a přepíše je. Program, jak je znázorněno, používá konstanty pro počítače typu little-endian, jako je x86. Pokud běží na stroji big-endian, měl by skončit zprávou jako Error: xyz may be not a .jpg file
, i když xyz je soubor jpeg. Všimněte si, že jsem výsledné obrázky netestoval přes pdflatex
; pravděpodobně by vám stálo za to položit otázku do 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;
}
Nemohl jsem přijít na to, jak přesvědčit konvertovat pouze přidat metadata a ne znovu kódovat moji [monochromatickou] bitmapu; rozšiřovalo soubor>50 %.
Zjistil jsem, že pngcrush (ne nástroj ImageMagick) může také přidat metadata hustoty. Tento příkazový řádek jej označuje 600 dpi a umožňuje další optimalizace, které zmenšily velikost souboru o ~10 %:
pngcrush -res 600 in.png out.png