画像データの実際のバイトサイズを変更せずにImageMagickでDPIを変更したい


45

GIMPには、私がやりたいことをする非常に簡単な方法があります。ドイツ語のダイアログのみがインストールされていますが、翻訳を試みます。私はPicture -> PrintingSize、値を変更してから調整することについて話しているのですがX-ResolutionY-ResolutionこれはいわゆるDPI値として知られています。デフォルトのフォーマットを選択することもできますPixel/Inch。(ドイツ語ではダイアログがBild -> Druckgrößeあり、そこにX-AuflösungありますY-Auflösung

OK、多くの場合72デフォルト値があります。たとえば300、これらを変更すると、コンピューター上で画像が同じままになるという効果がありますが、印刷すると、見ると小さくなりますが、すべての詳細はまだあります-小さい印刷された紙の解像度が高い(ただし、サイズが小さい...これで十分です)。

LaTeXで作業しているとき、またはpdflatex最近のUbuntu-Machineのコマンドで正確に言えば、私はしばしばそれをしています。上記のプロセスをGIMPで手動で実行しているときは、すべて正常に機能します。結果のPDFでは画像は小さく表示されますが、印刷品質は高くなります。

私がやろうとしているのは、GIMPに入ってDPI値を調整するプロセスを自動化することです。ImageMagickは優れていることが知られており、他の多くのタスクに使用したため、このツールで目標を達成しようとしました。しかし、それは私が望むことをしません。

多くのことを試した後、私はこれが実際に私の友人でなければならないコマンドだと思う:

convert input.png -density 300 output.png

これでDPIが300に設定されるはずです。Webのあらゆる場所を読むことができるからです。うまくいくようです。しかし、ファイルをチェックしても同じままです(編集:上で説明したように、これは私が期待するものです)。

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

このコマンドを使用すると、それは私が望んでいたことをしたようです:

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

おもしろいことに、input.png私を混乱させるのと同じ出力が来るので...これは見るべき間違ったパラメータかもしれませんか?

しかし、今でpdflatexは画像でTeXをレンダリングすると、まだ大きくてぼやけています。また、GIMPで画像を再度開くと、DPI値がの72代わりに設定されます300。したがって、実際にはまったく効果がありませんでした。

ここで問題は何ですか。完全に間違っていますか?すべてがGIMPで問題なく動作するので、私はそんなに間違ってはいけません。

これで助けてくれてありがとう。また、Linuxシステムで簡単に実行できる他の自動化されたソリューションも受け入れています。


user1694803:マーティン・ウィルソンの答えに戻って、それを「賛成」することも忘れないでください(^彼の答えの左側にある小さなアイコンをクリックしてください)。 +15)...
カートファイフル

回答:


76

単位を指定します-このオプションを省略したときに問題が発生したことを覚えているようです(ただし、DPIをデフォルトにする必要があります)。

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

GIMPが解像度を読み取るために使用する埋め込みデータフィールドを知っていますか?ImageMagickで使用される標準データフィールドをオーバーライドする独自のデータフィールドがありますか?例えば、Photoshopの用途Photoshop:XResolutionPhotoshop:YResolutionあなたがPhotoshopは濃度設定を(ImageMagickのは、これを行うことはできません-私たちは、ExifToolを使用)を認識するためにこれらを設定する必要がありそう。


2
-density 300前に置く必要がありましたinput.png。PDFを変換していました。とにかくありがとう。
アコスタディノフ

PNGからTIFFへの変換では、オプションの順序に関係なく-set units PixelsPerInch -density 300、simple -unitsは機能しませんでした。
アンドレイ

5

Exiftoolを使用して解像度を読み取ることができることに注意してください。例えば、Exiftool '-*resolution*' c.jpg表示される場合があります

解像度単位:インチX解像度:300 Y解像度:300

Exiftoolはパラメーターを設定することもできますが、マニュアルページImage::ExifTool::TagNamesに記載されているように、Exiftoolでは追加タグXResolutionおよびYResolutionを書き込みできません。

ImageMagickに解像度を変更するオプションがあるかどうかはわかりませんが、ない場合は驚くでしょう。また、このようなタスクを自動化するGIMPスクリプトを記述するのは簡単であり、小さなプログラムで解像度を変更することもできます。たとえば、次は、gcc setRes.c -O3 -Wall -o setResjpegファイルの最初の数バイトを読み取り、解像度を300に変更し、それらを書き換えるCプログラム(経由でコンパイル可能)です。示されているプログラムは、x86などのリトルエンディアンマシンに定数を使用しています。ビッグエンディアンのマシンで実行すると、Error: xyz may be not a .jpg filexyz jpegファイルであっても、などのメッセージで終了するはずです。注:結果の画像はを介してテストしていませんpdflatextex 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;
}

1
私はPNGを扱っており、JPGやCの手がかりもあまりないので、これはあまり役に立ちません。それは私が役に立つ知識を「深く」することです。他の誰かが使用できるかもしれません。
ボリスDäppen12年

はい、質問にもっと注意を払うべきでした!再読しても、JPGは言及されておらず、PNGは明らかに言及されています。
ジェームズウォルドビー-jwpat7

はい、私は他の誰かであり、それ使用できます。.jpgファイルを16進エディターで開き、9番目と11番目のバイトを垂直および水平密度用に編集しました。つまり、コードを手動で「実行」しました。
u_Ltd。

2

変換を説得してメタデータのみを追加し、[モノクロ]ビットマップを再エンコードしないようにする方法を理解できませんでした。50%を超えるファイルを展開していました。

pngcrush(ImageMagickツールではない)も密度メタデータを追加できることを発見しました。このコマンドラインは600dpiとマークし、他の最適化を可能にします。これにより、ファイルサイズが10%減少しました。

pngcrush -res 600 in.png out.png

-1

「画像データの実際のバイトサイズを変更せずに、ImagemagickでDPIを変更したい。」

これは完全に不可能です!

なぜなら:

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

また、実際のDPIが何であるかを理解していないようです。

  1. これは完全に抽象的な値であり、印刷物の絶対サイズを知っているか、画面またはモニターでレンダリングしている状況でのみ実用的な値を取得します。
    • 1インチ幅の正方形にまったく同じ72x72ピクセルの画像を「印刷」できます。印刷の解像度はになり72dpiます。
    • 1/4インチ幅の正方形にも「印刷」できます。印刷の解像度はになり288dpiます。
    • 注:288dpi1インチの正方形に「印刷」すると、同じ画像ではなくなります:プリンタードライバーまたはその他のフィルタリングメカニズムを介して外挿が行われ、代わりに288x288ピクセルの画像になります72x72ピクセルの画像...
  2. どちらのプリントアウトにもまったく同じ画像情報が含まれます。288dpiの画像には、突然多くの情報が含まれることはありません。

あなたが広い広場、しかしで1インチのように、元の72x72ピクセルの画像を印刷したい場合は288dpi、あなたがする必要があります再スケール(それをスケールアップし、この場合には)画像を。オリジナルの1ピクセルごとに、4ピクセルの新しいアップスケールされた画像が必要です。これらの4つのピクセル(そのうちの3つの新しいピクセル)に必要な色の値を計算するために使用できるさまざまなアルゴリズムがあります。

  • 元のピクセルと同じように指定できます(これは非常に「生の」アルゴリズムで、
  • または、元のピクセルの色の値を隣接するピクセルの色の値と平均化することもできます。

いずれにせよ、あなたはそれぞれ288ピクセルの高さ(288x288ピクセル)の288行のピクセルで構成される大きな画像を作成しています。

「画像->印刷サイズ」を実行したときにGimpが行うこと:絶対ピクセルサイズの必要な変更を再計算するプロセスを簡素化し、ユーザーフレンドリーにします。この目的のために...

  • ...最初にDPIについて尋ねられるのは、特定のプリンターが印刷解像度を任意に変更できないためです(1つだけでなく、2つまたは3つの異なる解像度を提供できるものもあります)。そのため、どの解像度で印刷するかを尋ねられます。それが最初の情報です。
  • ...次に、2番目の情報も要求します。どのサイズ(cmmmまたはinch)で印刷物を紙に表示するかです。

これら2つの情報に従って、Gimpは要求された解像度で要求されたスペースを埋めるために使用する必要のあるピクセルの総数を計算します(元のピクセル数から外挿します)。

ただし、ピクセル数を増やしてラスターイメージを拡大しても、実際の情報は追加されず、架空の「品質」が追加されるだけです。スケールアップアルゴリズムが「良い」アルゴリズムである場合、人間の目にはより良く見えるかもしれませ。単純なアルゴリズムのように、既存のピクセルを2倍、3倍、4倍にすると、見苦しくなります。

ラスターイメージの場合
、DPI設定は印刷または表示のコンテキストにのみ関係します。プリンターまたはモニターが与えられた、固定された解像度のため。そのため、それだけの情報です...

  • ...プリンタドライバまたは
  • ...印刷をサポートする画像処理アプリケーション

知っておく必要があります。

そして、ImageMagickのドキュメントは私と完全に一致しています。

-density width
-density widthxheight
デバイスレンダリングするための画像の水平および垂直解像度を設定します。


ただし、ベクター画像またはファイル形式(PDFやPostScriptなど)の場合、DPI設定は、それらをラスタライズするコンテキストで非常に重要です。DPIを高くすると、より多くの画像情報がラスター形式に転送されるため、実際の元の品質からより多くの詳細が保持されます。特定のサイズのベクター画像をmmcmまたはinchより高いDPIを持つラスターに変換する場合、画像内の合計ピクセル数が多くなります。

また、ImageMagickは「印刷」をサポートしていません。代わりに、ImageMagickのみ...

  • ...ファイルを特定のラスタ形式から他のラスタ形式に変換します。
  • ...または、ラスターイメージを縮小または拡大します。
  • ...または特定のアルゴリズムに従って色の値を変更します。
  • ...または画像を切り取り、オーバーレイし、反転し、ミラーリングします。
  • ...そして何でもない....

...しかし、操作された画像を印刷するには、別のプログラムを使用する必要があります。

一部の画像形式(TIFF、PNGなど)は、メタデータにDPI設定を内部的に保存することをサポートしています。

ただし、これは、基になるラスターイメージを変更しない「ヒント」属性にすぎません。それがこの発見をした理由です:

「ファイルをチェックしても同じままです。」

この「ヒント」は、プリンタードライバーまたはLaTeXなどのページ作成プログラムによって自動的に評価される可能性があります。そのようなDPIの「ヒント」がない場合(または、LaTeXが期待する方法で何らかの形で自分自身を提示しない場合)、LaTeXは、ページ上の特定の画像を期待どおりにレンダリングするように命令される必要があります〜-画像の周りにもっと明示的なLaTeXコードが必要です!

他の画像形式(JPEG(?)、BMP、...)は、内部メタデータでのDPIヒントの保存さえサポートしていません。

そのため、Gimpはイメージを印刷するため、「Picture-> Printing Size」で表示される内容のみをサポートします。ImageMagickでは、印刷できません。

印刷するときは、Gimpでやりたいことをやり続けてください。ImageMagickでは意味がありません。

この追加のIMドキュメントスニペットも参照してください。これは、まったく同じトピックを異なる言葉で説明しています。


残っているのはこれです:

  • Gimpで画像を「操作」し、その結果をLaTeXに埋め込むと、ページは期待どおりに見えます。
  • ImageMagickで画像を「操作」し、その結果をLaTeXに埋め込んだ場合、ページは期待したようには見えません

上記の問題を解決するには、以下を提供してください。

  • ImageMagickインストールの正確なバージョン(convert -versionおよびの完全な出力convert -list configure);
  • (へのリンク)元のサンプル画像。
  • (へのリンク)Gimpによって操作される同じ画像。
  • (へのリンク)ImageMagickによって操作される同じ画像。

これにより、問題の解決に役立ちます。

ただし、これは現在の件名/見出しで求められている問題とは異なる問題です「画像データの実際のバイトサイズを変更せずにImagemagickでDPIを変更したい」


更新

上で述べたことはまだ一部の読者には明らかではないので、ここでもう1つの試みがあります...

画像ファイル内で「解像度」または「密度」と記載されているものはすべてメタデータ属性です。ファイルによって記述される実際のピクセルの数には影響がなく、この点ではまったく関係ありません。これは、画像を印刷、レンダリング、または表示するときに、印刷またはレンダリングデバイスまたはアプリケーションが従う場合と従わない場合がある単なるヒントです。

この目的のために、それは画像ファイル内に保存されているほんの数個の数字です。これらの数値は、プリンタなどの出力デバイスに通知し、1インチあたりの画像の表示ドット数(またはピクセル数)を表示します。PostScript、PDF、MWF、SVGなどのベクター形式の場合、画像で使用される現実世界の座標を描画するようピクセルスケールに指示します。

画像メタデータ内のImageMagickによって示された解像度値がアプリケーションによって尊重されない 1つの例は、Adobe Photoshopです。Photoshopは、希望する印刷または表示解像度に関するヒントを8bimという独自のプロファイルに保存します。ImageMagickは、解像度の変更を画像ファイルのメタデータに書き込むように求められた場合でも、このプロファイルには影響しません。一方、Photoshopは、独自の8bimプロファイルが表示されるとすぐに、この目的のために定義された標準のメタデータフィールドにImageMagickによって保存されたすべての解像度ヒントを無視します。

OPは見出しを選択する必要があります。

  • 「画像の実際のピクセル数を変更せずに、ImageMagickでDPI(メタデータ解像度のヒント)を変更したい」

すべての誤解を避けるために...


1
「ファイルをチェックしても同じままです。」これは私が望んでいることです。私はこれが私を驚かせるとテキストで言っていません。もう一度私の質問を読んでください...ゆっくり... ARGL
ボリス・デッペン

6
「これは完全に不可能です!」いいえ、それは可能です...それは、印刷時に画像が縮小するだけです。私は私の質問で非常に詳細に説明
ボリスDäppen12年6

5
何を言ってるの?質問の中でユースケースを詳細に説明しました。タイトルだけで質問に答える場合、あなたはここの誰かの助けにはなりません。
ボリスDäppen12年

4
あなたの致命的な欠陥は最初の仮定でした:「エリアあたりのピクセル数が多い<==>イメージあたりの総ピクセル数が多い」これは、エリアが一定の場合にのみ当てはまります。これはそうではありません。
レオIzen

1
はい。DPIは、デバイスにレンダリングされる場合にのみ意味があります。また、この解像度が関連する場合に画像ファイルに保存できるフィールドもあります。質問は、ピクセルデータを変更せずにこのフィールドを変更する方法を明確に尋ねました。
レオIzen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.