12

Python で ImageMagick の convert ユーティリティを使用して、さまざまなサイズのサムネイルを効率的に生成しようとしています。一部の画像ファイルは非常に大きい (~15MB JPG)。

次のように、フルサイズの画像を取得し、フルサイズの画像からさまざまなサムネイルを生成する方法があります。

convert sample_image.jpg -resize 1024x768  sample_image-1024x768.jpg
convert sample_image.jpg -resize 800x600   sample_image-800x600.jpg
convert sample_image.jpg -resize 400x300   sample_image-400x300.jpg
convert sample_image.jpg -resize 200x150   sample_image-200x150.jpg

しかし、別の方法は、画像のサイズを互いに変更することです。

convert sample_image.jpg           -resize 1024x768  sample_image-1024x768.jpg
convert sample_image-1024x768.jpg  -resize 800x600   sample_image-800x600.jpg
convert sample_image-800x600.jpg   -resize 400x300   sample_image-400x300.jpg
convert sample_image-400x300.jpg   -resize 200x150   sample_image-200x150.jpg

これを行うことの欠点、またはおそらくより良い方法はありますか? これでかなり効率化できそうです。

結果として、プロセスを高速化するために convert が使用するフラグまたは「トリック」はありますか?

4

5 に答える 5

18

ImageMagick には、大きな画像を処理したい場合や、同じオリジナルから異なる出力を作成したい場合に、速度を最適化するのに役立ついくつかのトリックがあります。

  1. ImageMagick の機能を利用すると、入力イメージを名前付きメモリ プログラム レジスタmpr:{name}に一時的に保存できます。このレジスタから、後で (処理中に) ハードディスクから行うよりもはるかに高速にデータを読み取ることができます。

  2. 必要なさまざまな出力サイズを書き出す1 つのプロセスですべてのサイズ変更操作を実行します。

さらに良いニュースは、これらの両方を 1 つのコマンドに結合できることです。

したがって、すべてのコンテキスト切り替えオーバーヘッドを伴う複数のプロセスを実行する必要はありません。すべてを一度に実行してください。

次の例では、元の画像から 2 つの別々の領域をトリミングし、それらからサイズ変更されたサムネイルを作成します。これは、IM が 1 つのコマンドラインで実行できるさまざまな操作の数を示すためです。もちろん、要求したサイズも出力します。(もちろん、トリミング パラメータを機能させるには、非常に大きなサイズの入力画像が必要です)。

convert                           \
  huge-original.jpg               \
 -quality 80                      \
 -colorspace rgb                  \
 +profile '*'                     \
 -filter Lanczos                  \
 -write mpr:copy-of-huge-original \
 +delete                          \
  mpr:copy-of-huge-original -crop '3000x2000+0+480'   -resize '200x125!>' -write thumb1-extract.jpg +delete \
  mpr:copy-of-huge-original -crop '2000x1500+280+220' -resize '75x75!>'   -write thumb2-extract.jpg +delete \
  mpr:copy-of-huge-original -resize '1024x768'  -write sample-1024x768.jpg +delete \
  mpr:copy-of-huge-original -resize '800x600'   -write sample-800x600.jpg  +delete \
  mpr:copy-of-huge-original -resize '400x300'   -write sample-400x300.jpg  +delete \
  mpr:copy-of-huge-original -resize '200x150'   -write sample-200x150.jpg  +delete \
  mpr:copy-of-huge-original -resize '163x163!>' -write sample-163x163.jpg

アップデート

私は今、@JonathanOng からの質問を見ただけです: How to stream the output to <stdout>?

stdout へのフォーマットも JPEG にしたいと仮定すると、これを試すことができます。

convert                           \
  huge-original.jpg               \
 -quality 80                      \
 -colorspace rgb                  \
 +profile '*'                     \
 -filter Lanczos                  \
 +write mpr:copy-of-huge-original \
  mpr:copy-of-huge-original -crop '3000x2000+0+480'   -resize '200x125!>' +write thumb1-extract.jpg \
  mpr:copy-of-huge-original -crop '2000x1500+280+220' -resize '75x75!>'   +write thumb2-extract.jpg \
  mpr:copy-of-huge-original -resize '1024x768'  +write jpeg:- \
  mpr:copy-of-huge-original -resize '800x600'   +write jpeg:- \
  mpr:copy-of-huge-original -resize '400x300'   +write jpeg:- \
  mpr:copy-of-huge-original -resize '200x150'   +write jpeg:- \
  mpr:copy-of-huge-original -resize '163x163!>' +write jpeg:-

このようにして、各バリアントは stdout に移動します。この連続する画像の流れをどのように扱うかは、あなた次第です...

書く代わりに を-write filename +delete使用できることに注意+write filenameしてください。それは同じ効果に相当します。

于 2012-10-02T10:44:40.633 に答える
0

私の見解では、テストの結果、1024x768 から 800x600 へのサイズ変更はアルゴリズムの再スケーリングには適していません。整数 (2) の倍数のため、次のサイズ変更はより簡単です。

したがって、品質上の理由から、個人的には、これの方が優れています。

convert sample_image.jpg -resize 1024x768  sample_image-1024x768.jpg
convert sample_image.jpg -resize 800x600   sample_image-800x600.jpg
convert sample_image-800x600.jpg   -resize 400x300   sample_image-400x300.jpg
convert sample_image-400x300.jpg   -resize 200x150   sample_image-200x150.jpg
于 2012-08-30T22:23:46.513 に答える
0

〜50MBのJPGファイルをサムネイル化しています。最大の違い (最大 5 倍のスピードアップ) をもたらした 1 つのオプションは、入力ファイル名のの"-define jpeg:size 128x128"でした。ここに示す例:

http://www.imagemagick.org/Usage/formats/#jpg_read

...大きな違いがありました:

convert -define jpeg:size=128x128 jpeg_large.jpg -thumbnail 64x64  jpeg_thumbnail.jpg

-define jpeg:size を使用すると、ImageMagick は必要なだけのデータをディスクから読み込むことができます。これにより、非常に大きな画像の読み込み時間が大幅に短縮されます。

リンクされたページが示唆するように、エイリアシングを避けるために、最終的なサムネイル サイズの 2 倍の jpeg:size= を使用します。

ここで説明されている -thumbnail オプション:

http://www.imagemagick.org/Usage/resize/#thumbnail

...画像をサンプリングしてストリップし、プロセスをさらに高速化します。

于 2017-01-12T17:36:43.430 に答える