GNU/Linux >> Belajar Linux >  >> Linux

Saya ingin mengubah DPI dengan ImageMagick tanpa mengubah ukuran byte sebenarnya dari data gambar

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

Linux
  1. Ganti Variabel Lingkungan Dalam File Dengan Nilai Sebenarnya?

  2. Bagaimana Cara Mengubah Font Bar Atas Tanpa Mengubah Tema Shell?

  3. Mengubah Izin Berkas

  1. tr perintah - cara mengganti string \n dengan baris baru yang sebenarnya (\n)

  2. Mengatur/mengubah ctime atau Ubah atribut waktu pada file

  3. Mengapa data ditulis ke file dibuka dengan flag O_APPEND, selalu ditulis di akhir, bahkan dengan `lseek`?

  1. Baca dan tulis data dari mana saja dengan pengalihan di terminal Linux

  2. Memulai dengan perintah tac Linux

  3. Mengubah urutan baris dalam file