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

45

Di GIMP ada cara yang sangat sederhana untuk melakukan apa yang saya inginkan. Saya hanya menginstal dialog bahasa Jerman tetapi saya akan mencoba menerjemahkannya. Saya berbicara tentang pergi ke Picture -> PrintingSizedan kemudian menyesuaikan Nilai X-Resolutiondan Y-Resolutionyang saya kenal sebagai nilai DPI. Anda juga dapat memilih format yang secara default Pixel/Inch. (Dalam bahasa Jerman, dialognya adalah di Bild -> Druckgrößesana X-Auflösungdan di sana Y-Auflösung)

Ok, nilainya sering ada secara 72default. Ketika saya mengubahnya menjadi misalnya 300ini memiliki efek bahwa gambar tetap sama di komputer, tetapi jika saya mencetaknya, itu akan lebih kecil jika Anda melihatnya, tetapi semua detailnya masih ada, hanya lebih kecil -> ia memiliki resolusi lebih tinggi pada kertas yang dicetak (tetapi ukuran lebih kecil ... yang baik untuk saya).

Saya sering melakukan itu ketika saya bekerja dengan LaTeX, atau tepatnya dengan perintah pdflatexpada Ubuntu-Machine baru-baru ini. Ketika saya melakukan proses di atas dengan GIMP secara manual semuanya bekerja dengan baik. Gambar akan tampak lebih kecil dalam PDF yang dihasilkan tetapi dengan kualitas cetak tinggi.

Apa yang saya coba lakukan adalah mengotomatiskan proses masuk ke GIMP dan menyesuaikan nilai DPI. Karena ImageMagick dikenal luar biasa dan saya menggunakannya untuk banyak tugas lain, saya mencoba mencapai tujuan saya dengan alat ini. Tapi itu tidak melakukan apa yang saya inginkan.

Setelah mencoba banyak hal, saya pikir ini sebenarnya adalah perintah yang harus menjadi teman saya:

convert input.png -density 300 output.png

Ini harus mengatur DPI ke 300, karena saya bisa membaca di mana saja di web. Tampaknya berhasil. Tetapi ketika saya memeriksa file itu tetap sama (EDIT: yang saya harapkan, seperti yang dijelaskan di atas).

file input.png output.png
     input.png: PNG image data, 611 x 453, 8-bit grayscale, non-interlaced
    output.png: PNG image data, 611 x 453, 8-bit grayscale, non-interlaced

Ketika saya menggunakan perintah ini, sepertinya itu melakukan apa yang saya inginkan:

identify -verbose output.png | grep 300
    Resolution: 300x300
    PNG:pHYs                 : x_res=300, y_res=300, units=0

Cukup lucu, output yang sama muncul untuk input.pngmembingungkan saya ... jadi ini mungkin parameter yang salah untuk ditonton?

Tetapi ketika saya sekarang membuat TeX saya dengan pdflatexgambar masih besar dan buram. Juga ketika saya membuka gambar dengan GIMP lagi nilai-nilai DPI diatur ke 72bukan 300. Jadi sebenarnya tidak ada efek sama sekali.

Sekarang apa masalahnya di sini. Apakah saya mendapatkan sesuatu yang sepenuhnya salah? Saya tidak mungkin salah karena semuanya berjalan baik dengan GIMP.

Terima kasih atas bantuannya. Saya juga terbuka untuk solusi otomatis lainnya yang mudah dilakukan pada sistem Linux.

Boris Däppen
sumber
user1694803: Anda harus ingat untuk kembali ke jawaban Martin Wilson dan 'meningkatkannya juga (klik ^ikon kecil di sebelah kiri jawabannya), bukan hanya' menerimanya 'segera setelah Anda memiliki reputasi pribadi yang cukup (saya pikir Anda perlu +15) ...
Kurt Pfeifle

Jawaban:

76

Tentukan unit - Saya sepertinya ingat memiliki masalah ketika saya menghilangkan opsi ini (meskipun DPI harus menjadi default), misalnya:

convert -units PixelsPerInch input.png -density 300 output.png

Apakah Anda tahu bidang data tertanam mana yang digunakan GIMP untuk membaca resolusi - apakah memiliki sendiri yang menimpa yang standar yang digunakan oleh ImageMagick? Misalnya, Photoshop menggunakan Photoshop:XResolutiondan Photoshop:YResolutionAnda harus mengatur ini untuk Photoshop untuk mengenali pengaturan kepadatan (ImageMagick tidak bisa melakukan ini - kami menggunakan ExifTool).

Martin Wilson
sumber
2
Saya perlu menempatkan -density 300sebelumnya input.png. Saya mengonversi PDF. Bagaimanapun, terima kasih.
akostadinov
Untuk konversi PNG ke TIFF yang perlu saya gunakan -set units PixelsPerInch -density 300, sederhana -unitstidak berfungsi terlepas dari urutan opsi.
Andrey
5

Perhatikan bahwa Anda dapat menggunakan Exiftool untuk membacakan resolusi. Misalnya, Exiftool '-*resolution*' c.jpgmungkin ditampilkan

Unit Resolusi: inci X Resolusi: 300 Y Resolusi: 300

Exiftool juga dapat mengatur parameter, tetapi seperti yang tercantum dalam halaman Image::ExifTool::TagNamesmanual, Extra Tags XResolution dan YResolution tidak dapat ditulis oleh Exiftool.

Saya tidak tahu apakah ImageMagick memiliki opsi untuk mengubah resolusi, tetapi akan terkejut jika tidak. Juga, mudah untuk menulis skrip GIMP untuk mengotomatisasi tugas-tugas seperti ini, dan juga dimungkinkan untuk mengubah resolusi dengan program kecil. Sebagai contoh, berikut ini adalah program C (dapat dikompilasi melalui gcc setRes.c -O3 -Wall -o setRes) yang membaca beberapa byte pertama dari file jpeg, mengubah resolusi menjadi 300, dan menulis ulangnya. Program seperti yang ditunjukkan menggunakan konstanta untuk mesin little-endian, seperti x86. Jika dijalankan pada mesin big-endian itu harus diakhiri dengan pesan seperti Error: xyz may be not a .jpg file, bahkan jika xyz adalah file jpeg. Catatan, saya belum menguji gambar yang dihasilkan melalui pdflatex; Anda mungkin akan merasa perlu untuk mengirim pertanyaan di SE tex .

/* 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;
}
James Waldby - jwpat7
sumber
1
Ini tidak banyak membantu saya, karena saya berurusan dengan PNG dan tidak memiliki banyak petunjuk tentang JPG atau bahkan C. Itu adalah pengetahuan yang "mendalam" bagi saya untuk berguna. Mungkin orang lain bisa menggunakannya.
Boris Däppen
Ya, saya seharusnya lebih memperhatikan pertanyaan! Membaca ulang, JPG tidak disebutkan, jelas PNG.
James Waldby - jwpat7
Ya, saya adalah orang lain dan saya dapat menggunakannya: Saya telah membuka file .jpg saya di hex editor dan mengedit byte kesembilan dan kesebelas untuk kepadatan vertikal dan horizontal. Jadi, saya "mengeksekusi" kode Anda secara manual.
u_Ltd.
2

Saya tidak dapat menemukan cara meyakinkan konversi hanya dengan menambahkan metadata dan tidak menyandikan ulang bitmap [monochrome] saya; itu memperluas file> 50%.

Saya menemukan bahwa pngcrush (bukan alat ImageMagick) juga dapat menambahkan metadata kerapatan. Baris perintah ini menandainya 600dpi dan memungkinkan pengoptimalan lainnya, yang mengurangi ukuran file hingga ~ 10%:

pngcrush -res 600 in.png out.png
Charles Boling
sumber
-1

"Saya ingin mengubah DPI dengan Imagemagick tanpa mengubah ukuran byte sebenarnya dari data gambar."

Ini sama sekali tidak mungkin!

Karena:

     more "Dots per Inch" 
<==> more pixels per area 
<==> more total pixels per image 
<==> more total bytes per image

Anda juga tampaknya tidak mengerti apa sebenarnya DPI:

  1. Ini adalah nilai yang sepenuhnya abstrak yang mendapatkan nilai praktis hanya dalam konteks mengetahui juga ukuran absolut dari hasil cetak atau render di layar atau monitor:
    • Anda dapat 'mencetak' gambar 72x72 piksel yang sama pada persegi lebar 1 inci: hasil cetak akan memiliki resolusi 72dpi.
    • Anda dapat 'mencetaknya' pada selebar 1/4 inci juga: maka hasil cetak akan memiliki resolusi 288dpi.
    • ( Catatan: Jika Anda 'mencetak' 288dpipada 1 inci persegi, itu tidak lagi gambar yang sama: itu akan mengalami beberapa ekstrapolasi melalui driver printer atau mekanisme penyaringan lainnya, dan itu akan menjadi gambar 288x288 piksel bukannya gambar 72x72 piksel ... )
  2. Kedua cetakan akan memiliki informasi gambar yang sama - gambar 288dpi tidak akan tiba-tiba memiliki lebih banyak.

Jika Anda ingin mencetak asli 72x72 pixel image sebagai 1 inci lebar persegi, tetapi pada 288dpi, maka Anda harus rescale gambar (dalam hal ini skala itu). Untuk setiap 1 piksel dalam dokumen asli, Anda memerlukan 4 piksel gambar baru yang ditingkatkan. Sekarang ada berbagai algoritma yang dapat digunakan untuk menghitung nilai warna apa yang seharusnya dimiliki 4 piksel ini (3 di antaranya piksel baru):

  • Anda bisa memberi mereka sama dengan piksel asli (yang merupakan algoritma yang sangat "mentah",
  • atau Anda bisa melakukan rata-rata nilai warna piksel asli dengan nilai warna piksel tetangga.

Bagaimanapun Anda membuat gambar yang lebih besar yang terdiri dari 288 baris piksel yang masing-masing tingginya 288 piksel (288x288 piksel).

Apa yang dilakukan Gimp untuk Anda saat Anda menelusuri "Gambar -> Ukuran Pencetakan": ini menyederhanakan proses penghitungan ulang perubahan yang diperlukan dalam ukuran piksel absolut, menjadikannya lebih ramah pengguna. Untuk tujuan ini...

  • ... pertama-tama menanyakan kepada Anda tentang DPI karena printer yang diberikan tidak dapat mengubah resolusi pencetakannya secara sewenang-wenang (beberapa dapat menawarkan tidak hanya satu, tetapi mungkin bahkan 2 atau 3 resolusi berbeda). Jadi ia bertanya pada Anda di mana resolusi yang ingin Anda cetak. Itu info pertama.
  • ... lalu ia juga meminta informasi kedua: pada ukuran berapa (dalam cm, mmatau inch) hasil cetak akan muncul di atas kertas.

Menurut kedua informasi ini, Gimp kemudian menghitung jumlah piksel yang harus digunakan (ekstrapolasi dari jumlah piksel asli) untuk mengisi ruang yang diminta pada resolusi yang diminta.

Namun, memperbesar gambar raster dengan membuatnya mengandung lebih banyak piksel tidak menambah info nyata ke dalamnya, dan itu hanya menambah 'kualitas' untuk itu yang fiktif. Ini mungkin terlihat lebih bagus di mata manusia jika algoritme peningkatan Anda adalah yang 'baik'. Dan itu akan terlihat jelek, jika Anda hanya menggandakan, treble atau quadruple piksel yang ada, seperti beberapa algoritma sederhana.

Untuk gambar raster,
pengaturan DPI hanya relevan dalam konteks pencetakan atau tampilan . Karena printer atau monitor telah memberikan, memperbaiki resolusi. Untuk itu adalah info yang hanya ...

  • ... driver printer atau
  • ... aplikasi pengolah gambar yang mendukung pencetakan

perlu tahu.

Dan dokumentasi ImageMagick ini adalah dalam perjanjian penuh dengan saya:

-density width
-density widthxheight
Atur resolusi horizontal dan vertikal dari suatu gambar untuk dirender ke perangkat.

Untuk gambar vektor atau format file
(seperti PDF atau PostScript) pengaturan DPI sangat penting dalam konteks rasterisasi . DPI yang lebih tinggi akan mentransfer lebih banyak informasi gambar ke dalam format raster dan karenanya menyimpan lebih banyak detail dari kualitas asli yang sebenarnya. Saat mengonversi gambar vektor dari ukuran tertentumm,cmatauinchmenjadi raster dengan DPI yang lebih tinggi akan langsung diterjemahkan ke dalam jumlah piksel total yang lebih tinggi dalam gambar.

ImageMagick juga tidak mendukung 'pencetakan'. Sebaliknya, hanya ImageMagick ...

  • ... mengonversi file dari format raster yang diberikan ke format raster lainnya;
  • ... atau itu mengurangi atau meningkatkan gambar raster;
  • ... atau itu mengubah nilai warna sesuai dengan algoritma tertentu;
  • ... atau itu memotong gambar, overlay mereka, membalikkan mereka, mirror mereka;
  • ...dan apa tidak....

... tetapi untuk mencetak gambar yang dimanipulasi, Anda perlu menggunakan program lain.

Beberapa format gambar (TIFF, PNG, ...) mendukung penyimpanan pengaturan DPI secara internal dalam meta data mereka.

Tapi ini tidak lebih dari atribut 'petunjuk' yang tidak mengubah gambar raster yang mendasarinya. Itulah alasan mengapa Anda membuat penemuan ini:

"Ketika saya memeriksa file itu tetap sama."

'Petunjuk' ini mungkin dapat secara otomatis dievaluasi oleh driver printer atau dengan program pembuatan halaman seperti LaTeX. Dengan tidak adanya 'petunjuk' DPI tersebut (atau jika entah bagaimana mereka tidak menampilkan diri mereka seperti yang diharapkan LaTeX), LaTeX masih harus dapat diperintahkan untuk membuat gambar yang diberikan pada halaman seperti yang diharapkan seseorang. to - ini membutuhkan beberapa kode LaTeX yang lebih eksplisit di sekitar gambar!

Beberapa format gambar lainnya (JPEG (?), BMP, ...) bahkan tidak mendukung penyimpanan petunjuk DPI pada data meta internal mereka.

Jadi Gimp hanya mendukung apa yang Anda lakukan dengan "Gambar -> Ukuran Pencetakan" karena ingin mencetak gambar. Dengan ImageMagick Anda tidak dapat mencetak.

Terus lakukan apa yang ingin Anda lakukan dengan Gimp ketika Anda mencetak. Itu tidak masuk akal dengan ImageMagick.

Lihat juga cuplikan dokumentasi IM tambahan ini , yang menjelaskan topik yang sama dengan kata-kata yang berbeda.


Jadi yang tersisa adalah ini:

  • Jika Anda 'memanipulasi' gambar Anda dengan Gimp, dan kemudian menyematkan hasilnya di LaTeX, halaman seperti yang Anda harapkan.
  • Jika Anda 'memanipulasi' gambar Anda dengan ImageMagick, dan kemudian menyematkan hasilnya di LaTeX, halaman tersebut tidak seperti yang Anda harapkan.

Harap berikan yang berikut untuk menyelesaikan masalah di atas:

  • versi persis instalasi ImageMagick Anda (hasil lengkap dari convert -versiondan convert -list configure);
  • (tautan ke) gambar sampel asli;
  • (tautan ke) gambar yang sama dimanipulasi oleh Gimp;
  • (tautan ke) gambar yang sama dimanipulasi oleh ImageMagick.

Dengan cara ini kami dapat membantu menyelesaikan masalah.

Tetapi perhatikan: ini adalah masalah yang berbeda dari apa yang diminta subjek / tajuk utama Anda saat ini: "Saya ingin mengubah DPI dengan Imagemagick tanpa mengubah ukuran byte sebenarnya dari data gambar"


Memperbarui

Karena masih belum jelas bagi beberapa pembaca apa yang saya catat di atas, berikut adalah satu lagi upaya ...

Apa pun yang dicatat sebagai 'Resolusi' atau 'Kepadatan' di dalam file gambar, adalah atribut metadata . Ini tidak mempengaruhi jumlah piksel aktual yang dijelaskan oleh file dan sama sekali tidak relevan dalam hal ini. Ini hanya petunjuk bahwa perangkat pencetakan atau rendering atau aplikasi mungkin atau tidak dapat mengikuti saat mencetak, menampilkan atau menampilkan gambar.

Untuk tujuan ini, hanya beberapa nomor yang disimpan dalam file gambar. Angka-angka ini memberi tahu perangkat keluaran seperti printer dan menampilkan berapa banyak titik (atau piksel) per inci gambar yang harus ditampilkan. Untuk format vektor seperti PostScript, PDF, MWF, dan SVG, ia memberi tahu skala piksel untuk menggambar koordinat dunia nyata yang digunakan oleh gambar.

Salah satu contoh, di mana nilai resolusi yang dicatat oleh ImageMagick di dalam metadata gambar TIDAK dihormati oleh aplikasi adalah Adobe Photoshop. Photoshop menyimpan petunjuknya tentang resolusi cetak atau tampilan yang diinginkan dalam profil berpemilik yang bernama 8bim . ImageMagick tidak menyentuh profil ini, bahkan ketika diminta untuk menulis perubahan resolusi menjadi metadata file gambar. Sebaliknya, Photoshop, akan mengabaikan semua petunjuk resolusi yang disimpan oleh ImageMagick di bidang metadata standar yang ditentukan untuk tujuan ini segera setelah melihat profil 8bim -nya sendiri .

OP seharusnya memilih judul:

  • 'Saya ingin mengubah DPI (petunjuk resolusi metadata) dengan ImageMagick tanpa mengubah jumlah piksel aktual dalam gambar'

untuk menghindari semua kesalahpahaman ...

Kurt Pfeifle
sumber
1
"Ketika saya memeriksa file itu tetap sama." INI YANG AKU INGINKAN. SAYA TIDAK MENGATAKAN DALAM TEKS YANG MENGURUTI SAYA. BACALAH PERTANYAAN SAYA LAGI ... LAMBAT ... ARGL
Boris Däppen
6
"Ini benar-benar mustahil!" Tidak mungkin ... hanya saja gambarnya menyusut saat dicetak. Yang saya jelaskan sangat rinci dalam pertanyaan saya
Boris Däppen
5
Apa yang kamu bicarakan? Saya telah menjelaskan kasus penggunaan saya secara terperinci di dalam pertanyaan. Jika Anda menjawab pertanyaan hanya berdasarkan judul, Anda tidak membantu siapa pun di sini.
Boris Däppen
4
Kesalahan fatal Anda adalah asumsi awal: "lebih banyak piksel per area <==> lebih banyak piksel total per gambar" Itu hanya benar jika area tersebut konstan. Ini bukan kasusnya.
Leo Izen
1
Iya nih. DPI hanya bermakna jika diberikan ke perangkat. Itu juga merupakan bidang yang dapat disimpan dalam file gambar ketika resolusi ini relevan. Pertanyaannya dengan jelas bertanya bagaimana mengubah bidang ini tanpa mengubah data piksel.
Leo Izen