最速の画像合成処理方法とは?

このQ&Aのポイント
  • PHPを使用して、画質を落とさずに1秒以下の処理時間で23個の画像を合成する方法を教えてください。
  • 自宅PCとさくらのレンタルサーバーでの合成処理の結果を比較したところ、処理時間に差がありました。
  • eacceleratorのインストールによる高速化が失敗している可能性があります。それ以外の高速化方法についても教えてください。
回答を見る
  • ベストアンサー

最も速い画像合成処理を教えて下さい。

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/1309094440 結果は、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

  • PHP
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

「色鮮かな画像」ってどんな画像のことでしょう? SVGにはimage要素があって、PNG等の画像を、SVG画像の一部として使うことができます。 http://www.hcn.zaq.ne.jp/___/SVG11-2nd/struct.html#ImageElement また、着せ替えなどだったら、JavascriptやFlash等を使って、クライアント側で並びかえとかを行なうのが普通でしょう。 サーバー側のプログラム(今回の場合なら、あなたが作ろうとしているPHPのスクリプト)では、最初の準備と、完成時の処理くらいしかやらないのが普通です、一秒毎に画像をリロードさせるような凶悪なことはしません。

yanagihk
質問者

お礼

度々のご回答ありがとうございます。 返事が遅くなってすみませんでした。 アバターのような着せ替えをしたかったのですが、今まで調べて分からず、 こういった質問できる場所でやっとこの方法を知り、他の方法はないものだと 思っていました。 おっしゃっている普通のやり方というのが、とても衝撃的です。 普通とおっしゃっているやり方がどうしても知りたいです。 参考となる書籍やサイトがありましたら、どうか教えて下さい。 お願いしますm(__)m ちなみに「色鮮かな画像」とは、ヤフーのアバターやGREEのアバターのような、きめ細かくはっきりとした色で表現されている画像のことです。

その他の回答 (2)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

・毎回合成しないといけないのでしょうか? ・23枚全部、毎回必要なのでしょうか? ・入力はPNGでないとだめなのでしょうか? ・出力はPNGでないとだめなのでしょうか? ・1秒以内でないとだめなのでしょうか? PNGの圧縮は、画像に適した最適化をこれと言ってやっているわけでは無いので、合成処理よりもファイル読み書きや圧縮/伸長に時間がかかっているのだと思います。設定次第では、サイズを犠牲にして速度優先、というのもありますが、劇的に変わるわけでもありません。 今の方法で1秒以内、ってもの凄いハイエンドサーバーでもないと無理なのでは? > 横1120×縦2016のPNGファイル(容量は1ファイル当たり約6.6KB~140KB) 画像サイズに対して、容量がえらく小さいように思います。ほとんど背景色で「絵」の部分はもっと小さい(100x100とか)とか、二値とか16色とか、そんなことは無いですか? 絵のサイズが小さいなら、1120x2016同士で合成するのではなく、その絵の範囲だけの画像を予め用意して、座標指定して合成するようにすれば、大分処理が減るはずです。 単純な画像なら、SVGのようなベクター型のフォーマットにすれば、サーバーでは合成は一瞬です。 今の方法の固執しないで、根本から考えなおしてはどうです?

yanagihk
質問者

お礼

ご回答ありがとうございます。 私の理想は、ヤフーのアバターのような鮮やかな画像の合成をストレスを感じない程度の 処理速度で行う事です。 教えていただいたSVGのようなベクター型を調べたところ、色鮮やかな画像とまではいかないと感じました。 毎回23枚の画像を合成するのは、パーツの種類が23種類あるからです。 画像サイズに対して容量が小さいものは、おっしゃる通り背景の画像で、一色で塗りつぶした単純なものです。最終的には、凝った絵の背景にしたいと考えています。 ご相談ですが… 23種類の絵を合成で重ねた場合、同サイズの画像合成の方法しか知らないのですが、 絵の範囲だけの画像を予め用意して、座標指定して合成する方法はどのようなロジックを書くのでしょうか?参考となるサイトのページを教えていただけるだけでもありがたいです。 色鮮やかな画像のファイル読み書きや圧縮/伸長に時間のかからないファイル形式は、どんなものがあるのでしょうか? すごく参考になるご回答だと感じていますので、もう少しアドバイスを下さい。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

まず「合成」ってなに?ならべる?重ねる? それと今のロジックを提示すべきでは? そもそも23個の画像を毎回動的に合成しなくてはいけない状況って どうなんでしょう?あらかじめいくつかを合成しておけないのでしょうか?

yanagihk
質問者

お礼

ご回答ありがとうございます。 合成は、同じサイズの23枚のPNG画像を重ねるという意味です。 ロジックは、合成処理部分ですが、質問欄の一番下にリンクを記述しました。 あらかじめいくつかを合成しておくというアドバイスですが、おっしゃる通りだと思います。 合成処理をする度に、23種類の中から変更したいパーツを決めて、23種類のパーツに対して決められた順番で合成(重ねる)するロジックです。 現状は、全身の合成処理だけあり、23種類の画像の合成結果が全身の画像として表示していましたが、顔の合成画面と全身の合成画面で二つに分割すればあらかじめ合成しておくことができるかもしれませんね。 処理が速くできるヒントがまだありましたら、ご教授下さいm(__)m

関連するQ&A

  • PHPで行う最速の画像合成を教えて下さい。

    PHPを使用して、画質をあまり落とさず、1秒以下の処理時間で23個の画像を合成する方法(ロジック)を教えて下さい。 画像の合成をPHPで下記のソースのように組みましたが、横1120×縦2016のPNGファイル(容量は1ファイル当たり約 6.6KB~140KB)を23個合成して一つのファイルにする処理が終了すると、結果として合成された画質はキレイ(10段階中10の画質)ですが、処理時間が5.5秒程かかります。 そこで、合成素材の23個のファイルを全て半分の大きさ横560×縦1008にすると、結果として合成された画像の画質は結構落ちました(10段階中6の画質)が、処理時間は2.5秒程で終わりました。 希望としては、画質をあまり落としたくないので、小さくても横560×縦1008の画像を23個合成して処理時間を1秒以下にしたいのですが、以下のソースのやり方よりも処理が早く終わる やり方をご存知の方はいませんか? ご存知の方は、ご教授願います。 ちなみに、画像の種類は、使用できる色の種類が多いPNG形式で1秒以下の処理時間を実現したいです。 宜しくお願い致しますm(__)m ■環境 windows vista xampp/apache 2.2.4 PHP Version 5.2.3 //23個のファイルをロード $img1 = imagecreatefrompng(一個目のファイル); $img2 = imagecreatefrompng(二個目のファイル); ~ $img23 = imagecreatefrompng(23個目のファイル); //(白)の色を作成 $white1 = imagecolorallocate($img1, 255, 255, 255); $white2 = imagecolorallocate($img2, 255, 255, 255); ~ $white23 = imagecolorallocate($img23, 255, 255, 255); //白色を透過色へ imagecolortransparent($img1, $white1); imagecolortransparent($img2, $white2); ~ imagecolortransparent($img23, $white23); //それらをひとつの画像に統合($img1を背景とすると。) imagecopymerge($img1, $img2, 0, 0, 0, 0, 1120, 2016, 100); imagecopymerge($img1, $img3, 0, 0, 0, 0, 1120, 2016, 100); ~ imagecopymerge($img1, $img23, 0, 0, 0, 0, 1120, 2016, 100); //マージした後いらなくなった画像リソースをとりあえず解放 imagedestroy($img2); ~ imagedestroy($img23); imagepng($img1,出力ファイル名); imagedestroy($img1);

    • ベストアンサー
    • PHP
  • 複数画像の合成について

    複数画像の合成について質問させていただきます。 25個の画像を縦5列、横5列で並べて合成。一つの画像を作りたいと思っております。 個別の画像サイズの縦横は150×150ピクセル前後。合成後の全体が縦横750×750ピクセル前後の想定です。 J trim の画像連結やGIMPなどで試してみたのですが操作に手間取りました。 もっと簡単な操作で。たとえば(縦5列横5列 計25個)入力すると25のマスが現れて、あとは1つ目のマスにはこの画像、2つ目のマスにはこの画像、とドラッグするだけで25個の画像がすぐに合成される。というような操作ができるソフトやアイデアがありましたら、ご教示いただけたら幸いです。 ※無料のソフトであればありがたいです。

  • 画像ファイルの合成

    perlで画像ファイルの合成はできますか? もしできるのであれば、その方法を教えてください。 やりたいことは、サーバに背景用の画像ファイルがあり、アップロードしたファイルとその背景用の画像ファイルを合成してサーバに格納したいです。 perlで画像ファイルを扱う方法が全くわからず、できるかどうかもわかりません。 アドバイス、よろしくお願いします。

  • GDでPNG画像の合成を試みているのですが、imagedestroyを

    GDでPNG画像の合成を試みているのですが、imagedestroyを使用しても画像がメモリから解放されていないのか 一度表示したPNG画像と同じファイル名で表示すると最初に表示した画像内容が表示されてしまいます。 例)最初の表示(表示ファイル名:test_img.png) → 一旦別の画面に遷移する。→同じファイル(test_img.png)の内容を更新→2度目の表示(表示ファイル名:test_img.png)で最初の画像内容で表示されてしまう。 2度目の表示をした際にキーボードのF5(更新)キーを押すと更新されたtest_img.pngが表示されます。 F5(更新)キーを押さずに同じファイル名であっても最新のファイルの内容を表示したいのですが、原因が全く分かりません。 分かる方がいましたら、お知恵を貸して下さい。 ちなみに画像を合成する処理のソースを抜粋して少し手を加えたものが下記のものです。下記のソース(sample.php)を使って次のようなテストを行いました。 最初の処理では下記のソースを実行します。次に下記のソースの $img2 = imagecreatefrompng("http://beauty-program.com/base_hair.png");の行の指定ファイルをtest3.pngに変更して実行します。 表示内容は変わりませんが、F5(更新)キーを押すと表示内容が最新のものとなり変わります。 ※下記のソースを実行して思うのは、単純にF5(更新)キーを押さないと処理が再実行されないのではないかと思いました。 しかし、実際に動かすソースについては、ファイル作成後、画面を遷移して同じファイル名を表示するので、 下記のソースでのテストのようにF5(更新)キーを押さなければ最新のファイル内容で再実行されないとは考えにくいです。 実際に動かすソースは、次のような順番で画像の合成や表示をしますが、更新したファイル内容で画面に表示するには、F5(更新)キーを押す必要があります。 (1)下記のような画像の合成処理でファイルを作り、一旦別の画面を経由してから、作成したファイルを画面に表示する。 (2)別の画像を合成して同じファイル名で内容を更新し、一旦別の画面を経由してから、作成したファイルを画面に表示する。 (3)表示するファイル名が同じであると、なぜか最初(上記(1)で表示したもの)の内容が表示される。 (4)F5(更新)キーを押すと表示内容が最新のもの(上記(2)で更新したファイルの内容)となり変わる。 ソース http://beauty-program.com/sample.txt ※ソースを見る場合は、上記リンクをクリックすると実行結果が表示されますが、画像が表示された画面で「右クリック→ソースを表示」でご覧下さい。 ■環境 windows vista xampp/apache 2.2.4 PHP Version 5.2.3

    • ベストアンサー
    • PHP
  • 画像の合成について

    [A]の画像に[B]の画像を取り込んで合成した[C]の画像を 造りたい。ソフトを教えてください。 ポイント1.ファイル形式はできるだけ多くに対応する。 ポイント2.[B]はドラッグ&ドロップで[A]の任意の位置に      挿入できる。 ポイント3.[B]の拡大/縮小と透明度を加減したい。 イメージ:[A]=《桜のある風景》       [B]=《桜のはなびら》       [C]=《桜から大小さまざまな花びらが散る風情》 有料/フリー 問いません。 なお、画像ソフトを使用するのは初めてです。 デジカメ写真をPCに取り込んで、印刷することはできます。 よろしくお願いします。

  • PHP4 透過画像を合成する方法を教えてください。

    php4で、画像処理についてです。 画像Aと背景画像Bの二つがあり、 背景画像Bの上に画像Aをのせ、 新しい画像として出力する。 ※画像A、Bはpngファイルです。 (gifで合成すると画像のふちが粗くなるのでpngでやりたい) imagecopymergeで、合成まではできたのですが、 画像Aのpngの透過がうまくいきません。 photoshopなどで画像を書き出すときは透過されているのですが、 合成すると、透過されていない状態になってしまいます。 imagesavealphaとかが関係あるのでしょうか? 何卒よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 実際のphpの運用について

    すいません。今htmlで書いただけのサイトを持っているのですが、 (今使っているさくらサーバーのレンタルサーバーでphpは使えます) 今度フォームを作り、phpで処理して出力するプログラムを作りました。 内容は自分で取った写真を日付順や季節順で並び替えるphpです。 (チェックボックスなどで選択し、画像を並び替えるプログラムです) 私は、phpは初めてで、今手元にあるのは test.html・・フォームなどを設置した通常のwebsitです。 test2.php・・フォームで送られた値を処理して結果を出力するプログラムです。 この二つをとりあえず、フリーソフトのffftpでアップしてみた所、上手く動きました。 たださくらのレンタルサーバーで「php.ini 設定ファイル編集」という項目があるのですが、これは 何もしなくて良いのでしょうか? 白紙の記述ページみたいなものなのですが・・。 とりあえずphpを動かすだけならphpのファイルごとアップロードしてしまえば良いものなのでしょうか?

    • ベストアンサー
    • PHP
  • 重ねて合成した画像を1枚の画像として保存したい

    ゲーム作成支援として、キャラチップを合成しています。 透過PNG画像を複数枚重ね合わせた物を、JavaScriptで合成させて表示させるまでは出来てます。 ちなみに、URLは[h]ttp://him2.sakura.ne.jp/labo/ma.htmlです。 現在、キャプチャソフトを使ってローカルに画像を保存する形式ですが、[h]ttp://www.famitsu.com/freegame/tool/chibi/index1.htmlにあるような【この画像をダウンロード】のボタンを実装して、1枚のPNG画像として保存させたいのです。 PHPを使ってるらしいのはページソースで分かりましたが、PHP初心者なので、どのようなPHPを設置すればいいか分かりません。 過去の質問も見ましたが、該当するのがなかったので、どなたか分かり易くご教授下さい。

    • 締切済み
    • PHP
  • 30秒ごとに処理をさせることが可能なサーバーは?

    処理的には簡単なPHPプログラム(数秒で終わるようなもの)を30秒ごとに処理させたいと考えています。 システム的には簡単で、負荷もかからないものなので何とか安価なレンタルサーバーで設定できないかと探しています。 cronによる設定でも以下のような設定にすれば可能であるということも教えて頂いているのですが、このような設定ができる(専用・VPSサーバーでないもの)レンタルサーバー会社が見つかりません。どなたかご存知ないでしょうか? * * * * * コマンド & sleep 30 ; コマンド cron以外にwatchという命令も使えると可能らしいのですが、このような設定ができる(専用・VPSサーバーでないもの)レンタルサーバー会社はあるでしょうか?

    • ベストアンサー
    • PHP
  • Cronで同じ処理を複数同時に実行するには?

    PHPで作ったWebサービスがあります。 ユーザーが100人いたとします。 この100ユーザーそれぞれのデータを、毎日0時(例えば)になると処理をするというCronを作りたいです。 PHPファイルは1ユーザー分の処理をするので、Cronで毎日0時に指定すると1人分の処理しかできません。 ではユーザー毎にCronを100個作るのは得策ではないと思います。 「一つのCron実行で100人分処理すれば?」というご意見もあるかもしれませんが、 1人分の処理が3~30秒かかるので、レンタルサーバーの1実行当たりの動作時間を超えてしまう問題があります。 毎日0時に100人分の処理を実行するのは無理なのでしょうか? そもそも共用のレンタルサーバーレベルでは、100人分の同時処理というのは現実的ではないでしょうか? そうすると、1人ずつ処理していくと、30秒×100人=50分の処理時間が必要になります。 こういう場合はどのように設計すれば良いのでしょうか? どうぞよろしくお願い致します。

    • ベストアンサー
    • PHP

専門家に質問してみよう