GNU/Linux >> Linux の 問題 >  >> Linux

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

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

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

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


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

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

Exiftool はパラメーターを設定することもできますが、man ページ Image::ExifTool::TagNames に記載されているように の場合、Exiftool はエクストラ タグ XResolution と YResolution を書き込むことができません。

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

改宗者を説得する方法がわかりませんでした メタデータのみを追加し、[モノクロ] ビットマップを再エンコードしない。ファイルを 50% 以上拡大していました。

pngcrush を発見しました (ImageMagick ツールではありません) は、密度メタデータを追加することもできます。このコマンド ラインは 600dpi をマークし、他の最適化を許可して、ファイル サイズを ~10% 削減しました:

pngcrush -res 600 in.png out.png

Linux
  1. クイックヒント:ImageMagickを使用してコマンドラインで画像を変換する

  2. ファイル内の環境変数を実際の値に置き換えますか?

  3. Linuxはサイズ0のファイルを削除します

  1. statコマンドを使用してLinuxのファイルステータスを確認します

  2. Linuxtacコマンドの使用を開始する

  3. ファイルの ctime または Change time 属性の設定/変更

  1. Linuxターミナルでリダイレクトを使用して、どこからでもデータを読み書きできます

  2. N番目に若いファイルをリストする方法(Lsを解析せずに!)?

  3. Btrfsでデータをコピーせずにファイルを複製するにはどうすればよいですか?