23

ユーザーが視覚的に複雑なイメージを作成できる PHP システムを構築していますが、最終的な要件は50kB 以下です。

ユーザーは、37 のテンプレート イメージの 1 つにテキストを印刷することを選択できるため、結果は 1 つのフラット イメージになります。

テキストは、任意の色と多数のフォントのいずれかにすることができます。これは、最終的な画像が非常に視覚的に複雑で予測不可能になる可能性があることを意味します (画像の寸法を除く)。

次に、最終的な画像ファイルのサイズが 50kB を超えないようにする必要があります (これは外部要件であり、変更できません)。

最後の要件 (これも外部) は、画像形式が.jpeg、.png、または .gif でなければならないことです。

私はGraphicsMagickのドキュメントを調べましたが、ファイルサイズを設定して圧縮を自動的に計算できることについて言及している場所が見つかりません。

これを圧縮->保存->テスト ループを介してプログラムで実行することを検討しましたが、事前に圧縮に基づいてファイルサイズを計算できるとは限らないため、これはかなりのプロセッサ集約型になると想像できます。これが、GraphicsMagick で問題が既に解決されているかどうかを確認するように求めている理由です。

編集

外部要件がある理由を明確にするために:

ユーザーはこのシステムを利用してフラット イメージを作成し、それを PC に保存します。この画像は、リターゲティング キャンペーンで使用するためにAdrollにアップロードされます。

画像に対するAdroll の要件は次のとおりです。私のシステムでは、728x90、300x250、および 120x600 の画像サイズしか提供されません。

2010年11月27日編集

これは GraphicsMagick では不可能と思われるため、この機能を提供できる可能性のある圧縮ライブラリ (libpng など) と直接接続するなど、他のソリューションを検討したいと考えています。

最後の手段として、これを達成できるアルゴリズムを調べて、自分で実装することもできます。


類推として、そのように傾倒している人のために:

私は A* が検索するものを求めています。明確な開始点と終了点があり、最短時間で可能な限り最適なルートを見つけます。

私が避けたいと思っていたのは、Breadth/Depth First が検索するものでした: 明確な開始点/終了点ですが、局所的な最小値を見つけると最適解にヒットしない可能性があり、計算上完全に吹き飛ばされる可能性があります。

4

9 に答える 9

11

私が知っている目標サイズに圧縮する方法がないため、間接的な解決策を検討することをお勧めします。

  1. 平均圧縮サイズとその標準偏差が特定の品質レベルでどのくらいかを調べるために、(おそらく異なる JPEG 圧縮率で多数の画像を圧縮することによって) いくつかの簡単な統計を行います。
  2. 画像を受け入れるときは、適切な品質で圧縮してみてください。結果のファイルが大きすぎる場合は、品質を下げて再試行してください。必要に応じて、小さすぎる場合は、品質を上げることもできます。
  3. 結果の画像がターゲット サイズに「近い」が、小さい場合は停止します。

ステップ 2 の計算を少し詳しく説明するには、次のようにします。

平均計算サイズ + 3 * 標準偏差 < 目標サイズとなるように開始品質を選択した場合、99.7% の圧縮により、最初の試行で適切に小さいファイルが生成されます (圧縮サイズの正規分布を仮定)。

サーバーの負荷を減らし、ファイルを最大サイズに近づける (制限を「より有効に活用する」) ことのバランスを取りながら、開始時の品質と、必要に応じてそれを増減するロジックを微調整できます。

于 2010-11-27T00:59:03.410 に答える
9

次のパッケージを見てください。

http://www.phpclasses.org/package/3810-PHP-Optimize-images-to-fit-in-a-given-file-size-limit.html

かなりクール - 著者はビールを飲むに値すると思います ;)

実際に 61081 バイトの画像の例 (画像内のファイル サイズを表示する最初の jpeg 画像?):

代替テキスト

于 2010-12-02T14:31:07.240 に答える
1

GraphicMagick の「-limit disk 50mb」を「-list resource」と連携して使用して、プロセスの早い段階でこれをチェックして(または実際にポーリングして)、それに合わせて調整することはできますか?

http://www.graphicsmagick.org/GraphicsMagick.html#details-limit

于 2010-11-26T15:53:19.310 に答える
0

だから、私がこれを正しく理解していれば-あなたはユーザーがあなたが提供するテンプレート画像の1つにテキストを書くことを可能にするシステムを構築しています。それが正しければ、なぜ画像を保存するのですか?ユーザーアクション自体を保存することで、50Kbのサイズ制限を簡単に削除できます。次のようなことができるかもしれません-テキスト(およびそのプロパティと場所)とそれが置かれているテンプレートを保存します。

于 2010-11-24T19:46:29.167 に答える
0

おそらく、あなたは間違った角度から問題を見ています。PNG の使用を選択し、画像に保存されるメタデータを最小化することで、ファイル サイズを最小化できます。これは、PNG がビットマップ構造であるためです。GMagick がテキストをメタデータとして保存しない限り、ファイル サイズに影響はありません。ファイルのサイズに影響を与えるのは、色深度 (これも制御できます) だけです。ファイル サイズをフィルタリングしない非インターレースは、基本的にテンプレート サイズと同じにする必要があります。テンプレートが 50Kb 未満であれば問題ありません。

于 2010-12-02T21:53:11.577 に答える
0

画像の結果のファイルサイズを自動的に決定する方法を知りません-それは画像を生成するライブラリのタスクです。自分で圧縮を実装しない限り、結果のサイズを事前に計算することはできません。

できることは、統計データ (画像の高さと幅、およびファイル サイズとさまざまな圧縮オプション) を収集し、そのデータに基づいて新しい画像の見積もりを行うことです。

例:

  • 50k jpg、100x200 圧縮 30k
  • 100k jpg、100x200 圧縮 60k

-> 100x202px の画像を 59k で取得すると、圧縮サイズはおよそ 35k と推定されます。

于 2010-11-23T10:30:57.443 に答える
0

最初に 24 ビットの .png を試してください。それが適合する場合、それは最高の品質になり、完了です。または、いくつかの典型的な画像をテストして、どれも適合しない場合は、その形式を考慮から完全に除外することもできます。

.gif と .jpg の場合は、最適なものを検索する必要があります。どちらも十分な確実性で予測することはできず、どちらのアルゴリズムも固定ビット レートのエンコーディングには適していません。二分探索を使用して、最適なものを見つけることができます。あらかじめ決められたリストから圧縮係数を選択して、実行する必要があるテスト圧縮の回数を制限できます。たとえば、.jpg 圧縮係数のリストが 4、6、8、12、18、27、44、66 の場合、多くても 4 回のテスト圧縮を行う必要があります。

.gif とパレット化された .png はよく似ているため、一方を選択して他方を忘れる必要があります。

圧縮結果に基づいて .gif/.png と .jpg のどちらかを選択するのは難しいでしょう。各プロセスによって導入されるアーティファクトは完全に異なります。繰り返しますが、多くのテスト画像を目標サイズに圧縮し、眼球テストに基づいていずれかの形式を排除することで最善の結果が得られる場合があります。

于 2010-12-02T03:49:57.540 に答える
0

ターゲットファイルサイズに達するまでループするというプログラムによるオプションが一般的な答えのようですが、 .jpeg 圧縮でこれを行うには 2 つの方法があります


Kuo, Chun-ming による特許取得済みの方法があるため、それを利用した商業的な実行可能性については確信が持てません。

jpeg 画像の圧縮率を調整する方法および電子機器

これは、次の式に基づいています。

log(NSF) = (log(SF1 / SF2) / log(FileSize1 / FileSize2)) * log(Target / FileSize1) + log(SF1)

どこ

SF1 is a first compression parameter
SF2 is a second compression parameter
FileSize1 is the size of the image compressed with SF1
FileSize2 is the size of the image compressed with SF2
Target is the target file size
NSF is the target compression parameter.

SF1、SF2、および NSF が 0 ~ 1 または 0 ~ 100 などの範囲にあるかどうか、および FileSize1、FileSize2、および Target がバイト単位、キロバイト単位などであるかどうかは明確ではありません。ここで正しい組み合わせを試して見つけてください。正しい単位を出します。


2 番目の方法は、MIT の Ricky D. Nguyen によるものです。

JPEG トランスコードのレート制御とビット割り当て

彼は、圧縮が行われている間に、圧縮に使用されるデータを変更することを提案しています。このオプションは、実際の圧縮コード自体を変更する必要があるため、実装が現実的ではない場合があります。


これらの両方の例から、特定の目標ファイル サイズで .jpeg ファイルを保存することは確かに可能です。

于 2010-12-02T02:14:21.133 に答える
0

特定の画像の最終的なサイズを縮小する方法は 3 つしかありません。

  1. 解像度を下げる
  2. 色深度を減らす
  3. 画像の複雑さを軽減

最初の 2 つはあなたの管理下にあります。アップロードされた画像のファイル サイズが制限を超えている場合は、次に小さい使用可能なサイズに縮小して、それに収まるかどうかを確認できます。ターゲット解像度が 3 つしかないことを考えると、これはそれほど高くはありません。ただし、「大きい」サイズを利用できるようにする必要がある場合は、オプション 3 が残されます。

画像の複雑さを軽減することは厄介な獣です。ピクセル間の「ノイズ」を減らして、同じ色のより大きな領域を生成することを試みることができます。これにより、GIF/PNG 画像が非常にうまく圧縮されます。単純なぼかしフィルターでこれを実現できますが、画像内の細かい活字/テキストの読みやすさを損なう可能性もあります。JPG ターゲットの場合、圧縮品質を下げることを試みることができますが、品質を下げすぎると画像が台無しになる可能性があります。単純なサーバー側の変換でこれを処理できない場合、最初に作成したアーティストが画像を再作成する必要があります。

これを自動化するために私が見ることができる唯一の実用的な方法は、あなたが言及した圧縮保存テストループです。最終的な画像は比較的小さいため、サーバーへの負担はそれほど大きくありません。gif/png の保存は軽量な操作です。JPG 圧縮はより多くの CPU パワーを必要としますが、繰り返しになりますが、小さな画像の場合、最新のサーバーは 1 秒または 2 秒で 10 枚または 20 枚のテスト画像を実行するのに問題はありません。

于 2010-11-26T03:46:51.917 に答える