Görüntü verilerinin gerçek bayt boyutunu değiştirmeden DPI'yı ImageMagick ile değiştirmek istiyorum


45

GIMP'de istediğimi yapmanın çok basit bir yolu var. Yalnızca Alman iletişim kutusunu kurdum, ancak tercüme etmeye çalışacağım. Picture -> PrintingSizeDeğerleri gidip ayarlamama X-Resolutionve Y-Resolutionkendim için DPI değerleri olarak bilinenlerden söz ediyorum . Ayrıca, varsayılan olan formatı da seçebilirsiniz Pixel/Inch. (Almanca olarak diyalog Bild -> Druckgrößeorada X-Auflösungve orada ve Y-Auflösung)

Tamam, buradaki değerler genellikle 72varsayılan olarak. Onları değiştirdiğimde örneğin 300bu, bilgisayarda aynı kalıyor, ancak aynı şekilde yazdırırsam, bakarsanız daha küçük olacak, ancak tüm detaylar hala orada, sadece daha küçük -> Basılı kağıtta daha yüksek çözünürlük (ancak benim için uygun olan daha küçük boyutta).

Bunu genellikle LaTeX ile çalışırken veya pdflatexyeni bir Ubuntu-Machine komutunda tam olarak yapıldığında yapıyorum . Yukarıdaki işlemleri GIMP ile manuel olarak yaptığımda her şey iyi sonuç veriyor. Görüntüler elde edilen PDF'de daha küçük ancak yüksek baskı kalitesinde görünecektir.

Yapmaya çalıştığım, GIMP'ye girme ve DPI değerlerini ayarlama işlemini otomatikleştirmek. ImageMagick'in mükemmel olduğu bilindiğinden ve bu araçla amacımı başarmaya çalıştım. Ama istediğimi yapmıyor.

Birçok şeyi denedikten sonra, bunun aslında arkadaşım olması gereken komut olduğunu düşünüyorum:

convert input.png -density 300 output.png

Web’deki her yerde okuyabildiğim için bu, DPI’yı 300’e ayarlamalı. İşe benziyor. Ancak dosyayı kontrol ettiğimde aynı kalıyor (EDIT: yukarıda açıkladığım gibi.

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

Bu komutu kullandığımda istediğimi yapmış gibi görünüyor:

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

Yeterince komik, aynı çıktı input.pngbeni şaşırtıyor ... bu da izlemek için yanlış parametreler olabilir mi?

Ama şimdi TeX'imi pdflateximge ile yaptığımda görüntü hala büyük ve bulanık. Ayrıca görüntüyü tekrar GIMP ile açtığımda, DPI değerleri 72yerine olarak ayarlandı 300. Yani aslında hiçbir etkisi olmadı.

Şimdi burada sorun ne? Tamamen yanlış bir şey mi alıyorum? GIMP ile her şey yolunda gittiğinden o kadar yanlış olamam.

Bu konuda herhangi bir yardım için teşekkürler. Ayrıca bir Linux sisteminde kolayca yapılabilecek diğer otomatik çözümlere de açığım.


user1694803: Martin Wilson'un cevabına geri dönmeyi ve onu da 'oy vermeyi' (hatırının ^solundaki küçük simgeye tıklayın) hatırlamalısınız , sadece yeterli bir üne sahipseniz en kısa sürede 'kabul etmeyin' +15) ...
Kurt Pfeifle 24:12

Yanıtlar:


76

Birimleri belirtin - Bu seçeneği ihmal ettiğimde bir sorun yaşadığımı hatırlıyorum (DPI varsayılan olmasına rağmen), örneğin:

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

GIMP'nin çözünürlüğü okumak için hangi gömülü veri alanlarını kullandığını biliyor musunuz - ImageMagick tarafından kullanılan standart olanları geçersiz kılan kendi özelliğine sahip mi? Örneğin, Photoshop kullanır Photoshop:XResolutionve Photoshop:YResolutionböylece bunları Photoshop için bir yoğunluk ayarını tanıması için ayarlamanız gerekir (ImageMagick bunu yapamaz - ExifTool kullanıyoruz).


2
Daha -density 300önce koymak zorundaydım input.png. PDF'leri dönüştürüyordum. Yine de teşekkürler.
akostadinov

Kullanmam gereken PNG'den TIFF'ye dönüşüm için , seçeneklerin sırasına bakılmaksızın -set units PixelsPerInch -density 300basit -unitsişe yaramadı.
Andrey,

5

Çözünürlükleri okumak için Exiftool kullanabileceğinizi unutmayın. Örneğin, Exiftool '-*resolution*' c.jpggösterebilir

Çözünürlük Birimi: inç X Çözünürlük: 300 Y Çözünürlük: 300

Exiftool ayrıca parametreleri de ayarlayabilir, ancak man sayfasında da belirtildiği gibi Image::ExifTool::TagNames, Ekstra Etiketler XResolution ve YResolution Exiftool tarafından yazılabilir değildir.

ImageMagick'in çözünürlük değiştirme seçenekleri olup olmadığını bilmiyorum, ancak olmasa da şaşırır. Ayrıca, bunun gibi görevleri otomatikleştirmek için GIMP scriptleri yazmak kolaydır ve çözünürlükleri küçük programlarla değiştirmek mümkündür. Örneğin, aşağıdakiler gcc setRes.c -O3 -Wall -o setResbir jpeg dosyasının ilk birkaç baytını okuyan, çözünürlükleri 300 olarak değiştiren ve yeniden yazan bir C programıdır . Gösterildiği gibi program, x86 gibi küçük endian makineleri için sabitleri kullanır. Big-endian makinede çalıştırırsanız o gibi bir mesaj ile sona gerektiğini Error: xyz may be not a .jpg filexyz bile olduğunu jpeg dosyası. Not, sonuçta elde edilen resimleri test etmedim pdflatex; SE'de bir soru sormaya değecekti .

/* 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;
}

1
Bu bana çok yardımcı olmuyor, çünkü PNG ile ilgileniyorum ve JPG veya hatta C hakkında çok fazla ipucu yok. Belki başka biri kullanabilir.
Boris Däppen

Evet, soruya daha fazla dikkat etmeliydim! Tekrar okuduğumda, JPG söz konusu değil, PNG açıkça.
James Waldby - jwpat7 25:12

Evet, başkasının ve ben yapabilirsiniz kullanabilirsiniz: Bir Hex editör benim .jpg dosyasını açtı ve dikey ve yatay yoğunluğu için dokuzuncu ve onbirinci bayt kaydetmiştiniz. Konuşmak için kodunuzu manuel olarak "çalıştırdım".
u_Ltd.

2

Dönüştürmeyi yalnızca meta verileri eklemek için nasıl ikna edeceğimi ve [monokrom] bitmapimi yeniden kodlamamayı nasıl anlayamadım ; dosyayı>% 50 genişletiyordu.

Pngcrush'un (bir ImageMagick aracı değil) aynı zamanda yoğunluk meta verisi de ekleyebileceğini keşfettim . Bu komut satırı, 600dpi'yi işaretler ve dosya boyutunu ~% 10 azaltan diğer optimizasyonlara izin verir:

pngcrush -res 600 in.png out.png

-1

"Görüntü verilerinin gerçek bayt boyutunu değiştirmeden DPI'yı Imagemagick ile değiştirmek istiyorum."

Bu tamamen imkansız!

Çünkü:

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

Ayrıca, gerçekte DPI'nın ne olduğunu anlamış görünmüyorsunuz:

  1. Çıktıların mutlak boyutlarını bilmek veya ekranda veya ekranda göstermek için yalnızca pratik bir değer elde eden tamamen soyut bir değerdir:
    • Aynı 72x72 piksel görüntüyü 1 inç genişliğindeki bir karede 'yazdırabilirsiniz': çıktının çözünürlüğü olacaktır 72dpi.
    • Ayrıca 1/4 inç genişliğindeki bir kareye 'yazdırabilirsiniz': daha sonra çıktının çözünürlüğü olacaktır 288dpi.
    • ( Not: 288dpi1 inç kareye 'yazdırırsanız' , artık aynı görüntü olmaz: yazıcı sürücüsü veya başka bir filtreleme mekanizması aracılığıyla bazı ekstrapolasyonlardan geçecek ve bunun yerine 288x288 piksel görüntü olacak 72x72 piksel görüntü ... )
  2. Her iki çıktı aynı görüntü bilgisine sahip olacak - 288dpi görüntüde birdenbire fazla olmayacak.

Orijinal 72x72 piksel görüntüyü 1 inç genişliğinde bir kare olarak yazdırmak istiyorsanız, ancak adresinde 288dpi, o zaman görüntüyü yeniden ölçeklendirmeniz gerekir (bu durumda yukarı ölçeklendirme). Orijinaldeki her 1 piksel için, yeni, yükseltilmiş görüntünün 4 pikseline ihtiyacınız olacaktır. Şimdi, bu 4 pikselin (3 tanesi yeni pikselin) hangi renk değerine sahip olacağını hesaplamak için kullanılabilecek farklı algoritmalar var:

  • Onlara orijinal pikselin aynısını verebilirsin (ki bu çok "ham" bir algoritmadır,
  • veya orijinal pikselin renk değerinin bir miktarını komşu piksellerin renk değerleriyle yapabilirsiniz.

Her durumda, 288 piksel yüksekliğinde (288x288 piksel) 288 piksel satırdan oluşan daha büyük bir görüntü oluşturuyorsunuz.

“Picture -> Printing Size” uygulamasından geçtiğinizde Gimp sizin için neler yapıyor: gerekli değişiklikleri mutlak piksel boyutlarında yeniden hesaplama işlemini basitleştirerek kullanıcı dostu hale getiriyor. Bu amaç için...

  • ... önce size DPI hakkında bilgi verir çünkü belirli bir yazıcı baskı çözünürlüğünü keyfi olarak değiştiremez (bazıları sadece bir tane değil, belki 2 veya 3 farklı çözünürlük önerebilir). Böylece hangi çözünürlükte yazdırmak istediğinizi sorar. Bu ilk bilgidir.
  • ... o zaman da bilgi ikinci parça için sorar: hangi boyutu (en cm, mmya inch) çıktı kağıdına görünmelidir.

Bu iki bilgi bilgisine göre, Gimp, istenen boşluğu istenen çözünürlükte doldurmak için kullanması gereken toplam piksel sayısını (orijinal piksel sayısından ekstrapolasyon) hesaplar.

Bununla birlikte, daha fazla piksel içererek raster bir görüntüyü büyütmek, ona gerçek bilgi katmaz ve yalnızca kurgusal olana 'kalite' ekler. Bu olabilir bakmak algoritma yukarı ölçekli bir 'iyi' biriyse insan gözünün daha güzel. Ve bazı basit algoritmalar gibi, mevcut pikselleri ikiye, tiz veya dört katına çıkarırsanız, çirkin görünecektir.

Raster görüntüler için,
DPI ayarı yalnızca yazdırma veya görüntüleme bağlamında geçerlidir. Yazıcılar veya monitörler verdikleri için sabit çözünürlükte. Bunun için bilgi sadece ...

  • ... bir yazıcı sürücüsü veya
  • ... yazdırmayı destekleyen bir görüntü işleme uygulaması

bilmem gerek.

Ve ImageMagick'in dokümantasyonu benimle tam uyuşuyor :

-density width
-density widthxheight
Aygıtlara dönüştürmek için görüntünün yatay ve dikey çözünürlüğünü ayarlayın .

Vektör görüntüleri veya dosya formatları için
(PDF veya PostScript gibi), DPI ayarı,bunları rasterleştirme bağlamında son derece önemlidir. Daha yüksek bir DPI, daha fazla resim bilgisini raster formatına aktaracak ve böylece gerçek orijinal kaliteden daha fazla ayrıntı koruyacaktır. Belirli bir büyüklükteki bir vektör görüntüsünü dönüştürürkenmm,cmya dainchdaha yüksek bir DPI ile raster doğrudan görüntüdeki toplam piksel daha yüksek bir sayı olarak düşünülebilecektir.

Ayrıca, ImageMagick 'yazdırmayı' desteklemez. Bunun yerine, yalnızca ImageMagick ...

  • ... dosyaları belirli bir raster biçiminden diğer raster biçimlerine dönüştürür;
  • ... veya raster görüntüleri ölçeklendirir veya ölçeklendirir;
  • ... veya belirli bir algoritmaya göre renk değerlerini değiştirir;
  • ... veya görüntüleri kırpar, örter, ters çevirir, yansıtır;
  • ... ve ne-değil ....

... ancak manipüle edilmiş görüntüleri basmak için farklı bir program kullanmanız gerekir.

Bazı görüntü formatları (TIFF, PNG, ...) bir DPI ayarının dahili olarak meta verilerinde saklanmasını destekler.

Ancak bu, temel raster görüntüsünü değiştirmeyen bir 'ipucu' niteliğinden başka bir şey değildir. Bu keşfi yapmasının nedeni budur:

"Dosyayı kontrol ettiğimde aynı kalıyor."

Bu 'ipucu' muhtemelen yazıcı sürücüleri tarafından veya LaTeX gibi sayfa oluşturma programları tarafından otomatik olarak değerlendirilebilir. Bu tür DPI 'ipuçlarının' yokluğunda (ya da bir şekilde kendilerini LaTeX'in yapmasını beklediği şekilde sunmuyorlarsa), LaTeX'in bir sayfada beklediği şekilde herhangi bir görüntüyü oluşturması için komut verilebilmesi gerekir. için - resmin etrafında sadece biraz daha açık LaTeX kodu gerekiyor!

Diğer bazı görüntü formatları (JPEG (?), BMP, ...) bir DPI ipucunun iç meta verilerinde saklanmasını bile desteklememektedir.

Bu yüzden Gimp sadece "Resim -> Baskı Boyutu" ile yaptıklarını destekliyor, çünkü bir resim basmak istiyor. ImageMagick ile yazdıramazsınız.

Yazdırırken Gimp ile ne yapmak istediğinizi yapmaya devam edin. ImageMagick ile anlam ifade etmiyor.

Ayrıca , aynı konuyu farklı kelimelerle açıklayan bu ek IM belgelendirme pasajına da bakın .


Öyleyse geriye kalan bu:

  • Resminizi Gimp ile değiştirirseniz ve sonucu LaTeX'e eklerseniz, sayfa beklediğiniz gibi görünür.
  • ImageMagick ile görüntüyü 'manipüle' ve ardından LaTeX'te sonucu katıştırırsanız, sayfa görünüyor değil beklediğiniz gibi.

Lütfen yukarıdaki sorunu çözmek için aşağıdakileri sağlayın:

  • ImageMagick yükleme tam sürümü (tam çıkış convert -versionve convert -list configure);
  • (bir bağlantı) orijinal örnek resim;
  • (bir bağlantı) Gimp tarafından manipüle aynı görüntü;
  • (bir bağlantı) ImageMagick tarafından manipüle aynı görüntü.

Bu şekilde sorunu çözmeye yardımcı olabiliriz.

Ancak dikkat: Bu, mevcut konunuzun / başlığınızın sorduğundan farklı bir sorundur: "Görüntü verilerinin gerçek bayt boyutunu değiştirmeden DPI ile Imagemagick ile değiştirmek istiyorum"


Güncelleme

O olduğu için hala ben yukarıda belirtilen bazı ne okuyuculara belli değil, burada bir kez daha girişimidir ...

Bir görüntü dosyasının içinde 'Çözünürlük' veya 'Yoğunluk' olarak belirtilenler , bir meta veri niteliğidir . Dosya tarafından açıklanan gerçek piksel sayısı üzerinde bir etkisi yoktur ve bu açıdan tamamen alakasızdır. Bu, görüntüyü yazdırırken, görüntülerken veya görüntülerken bir yazdırma veya oluşturma aygıtının veya bir uygulamanın izleyebileceği veya izleyemeyeceği bir ipucudur .

Bu amaçla, görüntü dosyasında depolanan birkaç numaradır. Bu sayılar, yazıcılar gibi çıktı aygıtlarına söyler ve görüntünün inç başına kaç nokta gösterilmesi gerektiğini görüntüler. PostScript, PDF, MWF ve SVG gibi vektör biçimleri için, piksel ölçeğine, görüntünün kullandığı gerçek dünya koordinatlarını çizmesini söyler.

Resim meta içindeki ImageMagick'in tarafından da belirtildiği çözünürlük değeri olan bir örnek, DEĞİL bir uygulama tarafından onurlandırıldı Adobe Photoshop olduğunu. Photoshop, istenen bir baskı veya ekran çözünürlüğü ile ilgili ipuçlarını 8bim adlı tescilli bir profilde saklar . ImageMagick, bir görüntü dosyasının meta verilerine bir çözünürlük değişikliği yazmak istendiğinde bile bu profile dokunmuyor. Öte yandan Photoshop, ImageMagick tarafından saklanan tüm ipuçlarını, aksi takdirde kendi 8bim profilini görür görmez, bu amaç için tanımlanan standart meta veri alanında yok sayar .

OP bu başlığı seçmeliydi:

  • 'Görüntüdeki gerçek piksel sayısını değiştirmeden DPI (meta veri çözünürlüğü ipucunu) ImageMagick ile değiştirmek istiyorum'

tüm yanlış anlamaları önlemek için ...


1
"Dosyayı kontrol ettiğimde aynı kalıyor." BU NE İSTİYORUM. BU SÜRPELLEŞTİRDİĞİ METİNDE SÖYLEMEZSİNİZ. LÜTFEN SORULARINIZI OKUYUN… YANLIŞ ... ARGL
Boris Däppen 25:12

6
"Bu tamamen imkansız!" Bu mümkün değil ... sadece resim basıldığında küçülür. Benim
sorumla

5
Ne hakkında konuşuyorsunki. Kullanım davamı sorunun içinde ayrıntılı olarak açıkladım. Soruları sadece unvan ile cevaplarsanız, burada kimseye yardımcı olmazsınız.
Boris Däppen

4
Ölümcül kusurunuz ilk varsayımdı: "alan başına daha fazla piksel <==> görüntü başına daha fazla toplam piksel" Bu yalnızca alanın sabit olması durumunda geçerlidir. Durum bu değil.
Leo Izen,

1
Evet. DPI, yalnızca cihazlara işlendiğinde anlamlıdır. Ayrıca, bu çözünürlük uygun olduğunda, bir görüntü dosyasında saklanabilen bir alan olur. Soru açıkça piksel verisini değiştirmeden bu alanı nasıl değiştireceğimi sordu.
Leo Izen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.