0

「fileminimizer suite」ソフトウェアのように、写真の縮尺や品質を落とさずに写真のサイズを縮小できる PHP クラスまたは API が必要です。

4

1 に答える 1

1

画像のファイル サイズを小さくすることは、簡単なことではありません。

JPEG 形式は損失が多く、すでにかなり最適化されています。あなたはそれで何かをすることができますが、「品質の損失」と見なされる可能性のある調整が必要です. 基本的に高周波ノイズを低減したい。ImageMagick (およびその PHP ラッパー) が適切な選択かもしれません。また、冗長または不要な APPn ブロック (Exif メタデータなど) をいくつか削除して、最大で数キロバイトを削減することもできます。

編集:たとえば、あなたが言及したサイトは同様の手法を採用しています。私は2つの画像だけをチェックしました:

http://www.image-compressor.com/images/gallery/429724_36675180.jpg
http://www.image-compressor.com/images/gallery/429724_36675180_bestquality.jpg

2 番目の画像の品質係数の推定値は 87 に相当し、元のファイルには 60 Kb の APP データが含まれており、表示には役に立ちません。これは、jpegtran ユーティリティ (JPEG ツールの一部) を使用しているためです。

jpegtran -copy none -outfile 429724_36675180_stripped.jpg 429724_36675180.jpg

pixel-identicalで、サイズが 221624 から 166123 バイトに減少したファイルが得られます。これが、「Exif およびその他の APPn チャンク ストリッピング」で私が意味したことです。この場合の「品質を低下させずに」とは、「どのような方法でもピクセルに触れない期間」を意味しますが、jpegtran は 60 Kb の節約をもたらします。

ほとんど知覚できない方法で一部のピクセルに触れても、誰も気付かない可能性が高い場合は、さらに多くのことが可能になります。

簡単で汚れた周波数分析に基づく私の勝手な推測では、www.image-compressor ソフトウェアは、ローカル分散と PSNR に基づく「知覚品質メトリック」を使用し、二分法またはニュートン収束のいずれかによって「良好な」再圧縮係数をゼロにします。 (品質係数が 60 未満ではあまり役に立ちません。また、60 から 99 の間では、品質とサイズの曲線が Newton-Raphson に適しています)。

この結果は、 「「品質の損失」と見なされる可能性のある調整が必要」と言ったときに話していたことです。これが許容できる場合は、たとえば次のコマンドを実行できます。

djpeg -dct float < 429724_36675180.jpg \
| cjpeg -optimize -dct float -maxmemory 4096 -quality 89 \
  -outfile 429724_36675180_remade.jpg

そして見よ、APPn データが削除され、品質が 89 にダイヤルダウンされた状態で、サイズが 36082 の www.image-compressor に対してサイズが 35820 バイトのファイルが作成されます (実装の癖により、マイレージは異なる場合があります)。 JPEGライブラリの)。djpeg/cjpeg から導入された歪みは、イメージ コンプレッサーの歪みと同等です (ImageMagick によって報告された PSNR 45.4279 対 45.8822)。

要約すると、www-im-comp に似たものが必要な場合は、JPEG ツールをインストールできます (おそらく /apt-get install jpegtools/ のようなものです。Linux ディストリビューションを確認してください。ただし、ツールは Windows と MacOS に存在します)。また)走る

shell_exec("djpeg -dct float < $INPUTFILE "
          ."| cjpeg -optimize -dct float -maxmemory 4096 -quality $QUALITY "
          ."-outfile $OUTPUTFILE");

次に、Imagick を使用して INPUT と OUTPUT の違いを確認します。

http://www.php.net/manual/en/imagick.compareimagechannels.php

(または、shell_exec を介してImageMagick の比較ユーティリティを使用できます)。image-compressor と非常によく似た結果が得られることを期待しています。

===

PNG 形式の場合、情報を並べ替えて、ピクセルごとに同一で小さい画像を取得するいくつかのユーティリティを使用すると、もう少しうまくいくことができます。画像がどの程度最適化されていないかによって、節約できる金額はゼロから 15% までの範囲になります。PNGCRUSH、PngOPT、PNG-Gauntlet などをご覧ください。

これらのユーティリティは、不要な色を削除してパレット サイズを縮小することもできます。

次に、画像自体の高エントロピーの視覚的に無関係なソースをいくつか削除して、圧縮率を高めることができます。いくつかの「スポット リムーバー」アルゴリズムを使用することができますが、ここでも ImageMagick が役に立ちます。PHP 拡張機能の C 処理コアで一度やったことがありますが、パラメーターの調整は本当に金メッキの雌犬でした。ImageMagick もそうなることを期待しています。トリミングが少なすぎると何も得られません。トリミングが多すぎると、平坦でポスタライズされた画像が残ります。

残念ながら、これを行うための汎用の既製のクラスはありません。ImageMagick の API をパイロットするか、pngout などのユーティリティを shell_exec する必要があります。

EDIT : 完全を期すために、PNG とほぼ同じ概念が GIF に適用されます。実際には、GIF87a の方がオーバーヘッドが少ない非常に小さなファイル除いて、ほとんどの場合、GIF よりも PNG を使用する方が適しています。しかし、そのようなバイトピッキングが必要な場合は、Web ページのグラフィックスを「スプライト」することを検討します。この方法で取得できる HTTP とラウンドトリップのオーバーヘッドは、小さな GIF87a ファイルを使用して得られると考えられるものよりも優先されます。

于 2012-07-18T18:33:32.090 に答える