2012-02-20 19 views
1

私は現在、画像のフォルダを最適化するコマンドラインから実行されるPHPアプリケーションに取り組んでいます。回避方法PHPで既に最適化されている画像を最適化しますか?

PHPアプリケーションは、他のImage Optimizerのラッパーであり、ディレクトリを繰り返してすべての画像を取得し、最適な結果を得るために適切なプログラムを実行します。以下は

は、私が使用するとどのようなそれぞれが

imagemagickは、ファイルの種類を決定し、アニメーションGIFを最適化するために
gifsicleをPNG形式に非アニメーションGIFのを変換するために...使用されるプログラムですPNG画像0123を最適化するためにJPG画像
pngcrushを最適化する
画像
pngquant

にPNG8形式に私の問題をPNG画像を最適化するために、PNG8形式
pngoutPNG画像を最適化するために:私は上で実行したら、1-10の画像では、すべてが、しかし、滑らかで、かなり速く走ります10以上の画像を持つ大きなフォルダでは、実際には遅くなります。私は本当にこれを回避する良い解決策はありませんが、助けとなるのは、イメージが既に最適化されていることを避けることです。したがって、100個のイメージを含むフォルダがあり、そのフォルダを最適化して5個の新しいイメージを追加する場合は、オプティマイザを再実行します。その後、105枚の画像を最適化しなければなりません。以前の100枚がすでに最適化されているので、5枚の新しい画像を最適化することを目標にしています。新しい画像が画像フォルダに追加されると、これだけでパフォーマンスが大幅に向上します。

単純な解決策は、画像を新しいフォルダにコピーまたは移動することです。単純な解決策の問題は、これらの画像がウェブやウェブサイトで使用されていることです。 - ウェブサイトのソースコードにリンクされ、画像へのパスを変更することは、それを複雑にし、場合によってはそれを破る可能性があります。

私が持っていたアイディアには次のものがあります:既に処理されたすべてのイメージをリストする画像ファイルのデータベースに何らかの種類のテキストファイルデータベースを書きます。したがって、アプリケーションが実行されると、既にそのファイルにあります。もう一つのアイデアは、最適化されていることを示すために名前に何らかの識別を付けるためにファイル名を忠実にすることでした.3番目の考えは最適化された各最終ファイルを最終的な宛先フォルダに移動することです。アイデア2と3は、ウェブサイトのソースコード内のすべての画像パスリンクを壊すため、良いものではありません。

この問題の適切な解決方法を考えてもらえますか?共有してください。

答えて

3

メタデータ
最適化後の各画像のメタ情報にフラグを付けることができます。最初にそのフラグをチェックし、それがなければ進んでください。 exif_read_data()を使用してデータを読み取ることができます。多分like thisと書いてください。

上記はJPG用です。 PNGのMetdataも可能です。this question,and this oneをご覧ください。

私はGIFはわからないんだけど、あなたは間違いなくconvert them to PNGsして、メタデータを追加することができます...私はmeta data extraction toolsはGIFを許可するので、彼らは、彼ら自身のメタ情報を持っているかなり確信しているが。

データベースサポート
もう1つの解決策は、イメージに関する情報をMySQLデータベースに保存することです。このように、最適化を微調整すると、どの画像でどの最適化が試されたかを把握することができます。あなたは、あなたが選んだ任意のパラメータに従って最適化する画像を選ぶことができます。あなたはこれの管理パネルを構築することができます。この方法は簡単な実験を可能にする。

上記の2つの方法を組み合わせることもできます。

最大ファイルサイズ
これは、スペースを節約するためのものですので、あなたはプログラムのみ、特定のファイルのサイズよりも大きい画像上で動作可能性があります。理想的には、コンプレッサーを一度実行すると、すべての画像がこのファイルサイズ以下になり、それ以降は大きすぎる新しく追加された画像だけが変更されます。私はコンプレッサーが任意のファイルサイズ以下の任意のイメージを取得する必要があるため、これは実装の面でどれほど実用的かわかりません。画像のサイズに応じて最大ファイルサイズを決めることができます.....

+0

これは実際に私の最初のアイデアでしたが、私はこれがjpgイメージのためにしか機能しないと信じていましたか?ほとんどの場合、私のウェブ画像のほとんどはpngとgifになります。ほとんどの場合、これらのファイルに変換されます。私はちょうど私が間違っている可能性があるので、私が正しいと言いましたが、私はそれが動作するとは思わない理由ですので、私が言ったことを100%確信していません。また、画像のフォルダに含まれるファイルをリストするために、ある種の単一ファイルDBでない限り、データベースを避けたいです。 – JasonDavis

+0

@jason - PNGにもメタデータがあります。私は答えに2つのリンクを追加しました。 –

+0

フォローアップをありがとう、より多くの研究の後、私はある種のデータベース/ファイルを持っているのに夢中です。好ましくは、既に処理された画像をリストすることができ、次に最適化されていない画像上で実行される画像フォルダ内にあるファイルは、実行の最後にこのリストファイルを更新して、処理される。私の主な理由は、何百ものファイルがある場合、exifとメタデータを取得するためにこれらのファイルの一部を読み込む必要があり、ファイル/ dbが少し速いかもしれないと思います。このアプローチの考えは? – JasonDavis

0

私の頭の中にある考えは、単純な解決策をより複雑なものに混ぜることです。画像を最適化するときは、別のフォルダに移動します。元のイメージフォルダにアクセスするときには、.htaccessファイルでこれらのリンクをキャプチャし、最適化されたフォルダセクション内に同じイメージが存在するかどうかを確認できる領域にルーティングします(最適化、移動、次に進む)。

私はsimpleソリューションと言っていることを知っていますが、これはちょっと複雑な解決策ですが、その解決策は問題へのスケーラブルなアプローチを提供することです。


編集:もう一つ

あなたはレベルのセキュリティを追加することができますので、当然の必要性のthats場合、私は(すべてではない画像が誰もが見ることができる)MySQLデータベースのアイデアが好きです。しかし、それはまたあなたのリンクの問題(ハードコードされたもの)をあまり問題にしません。すべてのリンクは単一のファイルであり、その中からdbからイメージを取得し、唯一の変更は生成される変数を取得するためです。これにより、プロジェクトのスケーラビリティが大幅に向上し、設計変更が容易になります。

+1

.htaccessリダイレクトではひどい考えではありませんが、長期的に見ると、このようなサーバのパフォーマンスが低下する可能性はありませんか? MySQL DBを使って画像や画像のパスを保存することは、私の状況では良い考えではありません。私はこれを使って私が構築するすべてのウェブサイトでこれを使うつもりです。そのようなイメージだけのDBは見られませんでした。偉大なアイデアパフォーマンスの賢明さのようには思えません。パフォーマンスは可能です – JasonDavis

+0

セキュリティ要件がない場合は、ちょうどいいです。ちょうどいいプライバシーポリシーがあります。 – Michael

1

最も簡単な方法は、各画像の最終変更時刻を確認することです。スクリプトが最後に実行された後にイメージが変更された場合は、この特定のイメージでイメージを実行する必要があります。 スクリプトの実行時のタイムスタンプは、簡単なテキストファイルに簡単に保存できます。

+0

私は最後に実行された日時を持つフォルダ内の単純なテキストファイルとその+1に対して各画像をチェックする – JasonDavis

関連する問題