プロが教える店舗&オフィスのセキュリティ対策術

PHPを使用して、画質をあまり落とさず、1秒以下の処理時間で23個の画像を合成する方法(ロジック)を教えて下さい。

次の(1)と(2)は、23枚のPHP画像を合成する処理を自宅PCとレンタルサーバーで行った結果です。

(1)自宅PCで処理
画像の合成をPHPで下記のソースのように組みましたが、横1120×縦2016のPNGファイル(容量は1ファイル当たり約
6.6KB~140KB)を23個合成して一つのファイルにする処理が終了すると、結果として合成された画質はキレイ(10段階中10の画質)ですが、処理時間が5.5秒程かかります。
そこで、合成素材の23個のファイルを全て半分の大きさ横560×縦1008にすると、結果として合成された画像の画質は結構落ちました(10段階中6の画質)が、処理時間は2.5秒程でした。

(2)さくらのレンタルサーバーで処理
上記の(1)のファイル(横560×縦1008)を同じロジックで処理をしたところ、1秒遅くなり3.5秒となりました。
GDの合成を高速化するのは、調べた結果、eacceleratorとKGDしか見当たりませんでした。(KGDを利用する金銭的な余裕がないのでKGDは選択肢から除外しました)
eacceleratorのインストールは、下記リンクのページを参照して行いました。

http://d.hatena.ne.jp/memory_agape/20110626/1309 …

結果は、phpinfoを表示した添付画像となり、処理時間はほぼ一緒です。0.1秒速くなったかどうかの違いでした。



○質問

1.下記のソースのやり方よりも処理が早く終わるやり方をご存知の方はいませんか?

2.処理速度の結果があまり変わらないのは、eacceleratorのインストールが失敗しているからでしょうか?
(eacceleratorのインストールが、成功しているのか失敗しているのか処理時間が変わないので良く分かりません)

※希望としては、画質をあまり落としたくないので、さくらのレンタルサーバーにて横560×縦1008の画像を23個合成して処理時間を1秒以下にしたいです。
また、画像の種類は、使用できる色の種類が多いPNG形式で1秒以下の処理時間を実現したいです。


分かる方は、ご教授願いますm(__)m



■自宅PC
windows vista
xampp/apache 2.2.4
PHP Version 5.2.3

■さくらのレンタルサーバー
UNIX系 OS FreeBSD
Apache 1.3.x
PHP 5.2.17
phpMyAdmin 3.3.10.3
MySQL 5.1
MySQL 文字コード UTF-8
bigdump ver.0.34b

■ソース

http://angelito.sakura.ne.jp/ques.txt

「最も速い画像合成処理を教えて下さい。」の質問画像

A 回答 (3件)

「色鮮かな画像」ってどんな画像のことでしょう?



SVGにはimage要素があって、PNG等の画像を、SVG画像の一部として使うことができます。
http://www.hcn.zaq.ne.jp/___/SVG11-2nd/struct.ht …

また、着せ替えなどだったら、JavascriptやFlash等を使って、クライアント側で並びかえとかを行なうのが普通でしょう。
サーバー側のプログラム(今回の場合なら、あなたが作ろうとしているPHPのスクリプト)では、最初の準備と、完成時の処理くらいしかやらないのが普通です、一秒毎に画像をリロードさせるような凶悪なことはしません。
    • good
    • 0
この回答へのお礼

度々のご回答ありがとうございます。

返事が遅くなってすみませんでした。
アバターのような着せ替えをしたかったのですが、今まで調べて分からず、
こういった質問できる場所でやっとこの方法を知り、他の方法はないものだと
思っていました。
おっしゃっている普通のやり方というのが、とても衝撃的です。

普通とおっしゃっているやり方がどうしても知りたいです。
参考となる書籍やサイトがありましたら、どうか教えて下さい。

お願いしますm(__)m

ちなみに「色鮮かな画像」とは、ヤフーのアバターやGREEのアバターのような、きめ細かくはっきりとした色で表現されている画像のことです。

お礼日時:2011/09/28 11:18

・毎回合成しないといけないのでしょうか?


・23枚全部、毎回必要なのでしょうか?
・入力はPNGでないとだめなのでしょうか?
・出力はPNGでないとだめなのでしょうか?
・1秒以内でないとだめなのでしょうか?

PNGの圧縮は、画像に適した最適化をこれと言ってやっているわけでは無いので、合成処理よりもファイル読み書きや圧縮/伸長に時間がかかっているのだと思います。設定次第では、サイズを犠牲にして速度優先、というのもありますが、劇的に変わるわけでもありません。
今の方法で1秒以内、ってもの凄いハイエンドサーバーでもないと無理なのでは?

> 横1120×縦2016のPNGファイル(容量は1ファイル当たり約6.6KB~140KB)

画像サイズに対して、容量がえらく小さいように思います。ほとんど背景色で「絵」の部分はもっと小さい(100x100とか)とか、二値とか16色とか、そんなことは無いですか?
絵のサイズが小さいなら、1120x2016同士で合成するのではなく、その絵の範囲だけの画像を予め用意して、座標指定して合成するようにすれば、大分処理が減るはずです。

単純な画像なら、SVGのようなベクター型のフォーマットにすれば、サーバーでは合成は一瞬です。


今の方法の固執しないで、根本から考えなおしてはどうです?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

私の理想は、ヤフーのアバターのような鮮やかな画像の合成をストレスを感じない程度の
処理速度で行う事です。
教えていただいたSVGのようなベクター型を調べたところ、色鮮やかな画像とまではいかないと感じました。

毎回23枚の画像を合成するのは、パーツの種類が23種類あるからです。

画像サイズに対して容量が小さいものは、おっしゃる通り背景の画像で、一色で塗りつぶした単純なものです。最終的には、凝った絵の背景にしたいと考えています。

ご相談ですが…

23種類の絵を合成で重ねた場合、同サイズの画像合成の方法しか知らないのですが、
絵の範囲だけの画像を予め用意して、座標指定して合成する方法はどのようなロジックを書くのでしょうか?参考となるサイトのページを教えていただけるだけでもありがたいです。

色鮮やかな画像のファイル読み書きや圧縮/伸長に時間のかからないファイル形式は、どんなものがあるのでしょうか?

すごく参考になるご回答だと感じていますので、もう少しアドバイスを下さい。

お礼日時:2011/09/24 10:28

まず「合成」ってなに?ならべる?重ねる?


それと今のロジックを提示すべきでは?
そもそも23個の画像を毎回動的に合成しなくてはいけない状況って
どうなんでしょう?あらかじめいくつかを合成しておけないのでしょうか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

合成は、同じサイズの23枚のPNG画像を重ねるという意味です。
ロジックは、合成処理部分ですが、質問欄の一番下にリンクを記述しました。

あらかじめいくつかを合成しておくというアドバイスですが、おっしゃる通りだと思います。
合成処理をする度に、23種類の中から変更したいパーツを決めて、23種類のパーツに対して決められた順番で合成(重ねる)するロジックです。
現状は、全身の合成処理だけあり、23種類の画像の合成結果が全身の画像として表示していましたが、顔の合成画面と全身の合成画面で二つに分割すればあらかじめ合成しておくことができるかもしれませんね。

処理が速くできるヒントがまだありましたら、ご教授下さいm(__)m

お礼日時:2011/09/24 10:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!