GNU/Linux >> Znalost Linux >  >> Linux

Chci změnit DPI pomocí ImageMagick bez změny skutečné velikosti bajtů obrazových dat

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

Linux
  1. Zkontrolujte stav souboru v systému Linux pomocí příkazu stat

  2. Čtěte a zapisujte data odkudkoli s přesměrováním v terminálu Linux

  3. Začínáme s příkazem tac systému Linux

  1. Jak změnit písmo na horní liště, aniž byste změnili téma Shell?

  2. Linux odstranit soubor s velikostí 0

  3. příkaz tr - jak nahradit řetězec \n skutečným novým řádkem (\n)

  1. Rychlý tip:převádějte obrázky na příkazovém řádku pomocí ImageMagick

  2. Nahradit proměnné prostředí v souboru jejich skutečnými hodnotami?

  3. Nastavení/změna atributu ctime nebo Change time u souboru