透過合成した画像からの縮小コピーで黒塗りに!

このQ&Aのポイント
  • PHPの処理によって透過処理した画像と画像を合成して出来た画像(test.png)を単純に小さいサイズのPNG画像としてコピーしたいのですが、黒塗りになってしまい、調べながら思考錯誤してみましたができません。
  • 画像の読み込みにはimagecreatefromjpeg、imagecreatefrompng、imagecreatefromgifの順番で試していますが、正しく読み込めない場合はエラーメッセージを表示しています。
  • リサイズする際には、大きい方の幅を基準に指定したサイズにリサイズするようにしています。画像をコピーする際には、imagecopyresampled関数を使用しています。
回答を見る
  • ベストアンサー

透過合成した画像からの縮小コピーで黒塗りに!

PHPの処理によって透過処理した画像と画像を合成して出来た画像(test.png)を単純に小さいサイズのPNG画像として コピーしたいのですが、黒塗りになってしまい、調べながら思考錯誤してみましたができません。 分かる方、どうかお知恵を貸して下さい。 下記は、黒塗りになってしまうソースです。 <?php $img = 'http://www.angelito.biz/test.png' ; // 読み込む画像のアドレス $size = 100 ; // リサイズするサイズ (大きい方の幅をこれに合わせる) if (!($irc = @imagecreatefromjpeg($img))) // jpeg として読み込んでみる if (!($irc = @imagecreatefrompng($img))) // png として読み込んでみる $irc = @imagecreatefromgif($img) ; // gif として読み込んでみる if (!$irc) { // 画像が正しく読み込めなかったときの処理 echo '×' ; exit ; } if (imagesx($irc) > imagesy($irc)) { $rrc = imagecreate($size, $size * imagesy($irc) / imagesx($irc)) ; } else { $rrc = imagecreate($size * imagesx($irc) / imagesy($irc), $size) ; } imagecopyresampled($rrc, $irc, 0, 0, 0, 0, imagesx($rrc), imagesy($rrc), imagesx($irc), imagesy($irc)) ; // jpgeg 画像として出力 header('Content-type: image/png') ; imagepng($rrc) ; ?> ■環境 windows vista xampp/apache 2.2.4 PHP Version 5.2.3

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

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

  • ベストアンサー
回答No.1

元のPNG画像の透過色を取得して、リサンプルした画像に色指定してやってその色を透過色にしてやれば良いと思います。 <?php //$rrc = imagecreateをした後で。 $tscolor = imagecolortransparent($irc); if($tscolor !== -1){ $tscolor = imagecolorsforindex($irc, $tscolor); $tsindex = imagecolorallocate($rrc, $tscolor['red'], $tscolor['green'], $tscolor['blue']); imagecolortransparent($rrc, $tsindex); } ?>

yanagihk
質問者

お礼

ご回答ありがとうございました。 そのまま使ったところ、うまくいきました。 これから、なぜうまくいったのかを自分なりに調べて勉強しようと思います。 本当にありがとうございました。

関連するQ&A

  • phpでbmpとして読み込む方法

    if (!($irc = @imagecreatefromjpeg($img))) if (!($irc = @imagecreatefrompng($img))) $irc = @imagecreatefromgif($img) ; jpeg,png,gifは上記の方法で読み込めるのですが、bmpを読み込むにはどうしたらいいかわかりません。 どなたかご教授ください。 お願いいたします。

    • 締切済み
    • PHP
  • 画像アップロードの拡張子制限

    いつもお世話になっています。 現在画像アップローダーを作っているのですがサイズ制限を100KBまで、拡張子は「gif.jpeg.jpg.png」のみに限定したいのですが可能でしょうか? 拡張子を意図的に偽装してくる場合でもエラーを表示させるようにしたいと思っています。 【現在のソース】 <?php //保存名 $pict_id = aaaa; //画像のコピー copy($_FILES["userfile"]["tmp_name"],"./photo/$pict_id.jpg"); //画像のリサイズ $img = "http://www.xxxxx.jp/photo/$pict_id.jpg"; // 読み込む画像のアドレス $outfile = "./photo/$pict_id.jpg"; $size = 145 ; // リサイズするサイズ (大きい方の幅をこれに合わせる) if (!($irc = @imagecreatefromjpeg($img))) // jpeg として読み込んでみる if (!($irc = @imagecreatefrompng($img))) // png として読み込んでみる $irc = @imagecreatefromgif($img) ; // gif として読み込んでみる if (!$irc) { // 画像が正しく読み込めなかったときの処理 // エラー画面へ $headerLink = "./error.html"; header("Location: ".$headerLink); } if (imagesx($irc) > imagesy($irc)) { $rrc = imagecreatetruecolor($size, $size * imagesy($irc) / imagesx($irc)) ; } else { $rrc = imagecreatetruecolor($size * imagesx($irc) / imagesy($irc), $size) ; } imagecopyresampled($rrc, $irc, 0, 0, 0, 0, imagesx($rrc), imagesy($rrc), imagesx($irc), imagesy($irc)) ; //保存 imagejpeg( $rrc , $outfile ); //出力 header("Content-type: image/jpeg"); // ロケーション $headerLink = "./ok.html"; header("Location: ".$headerLink); ?>

    • 締切済み
    • PHP
  • PHPで画像縮小

    質問します。自分は今PHPで画像の縮小をしようと思っています。 しかしうまくいきません。 コードは <htm> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>画像縮小</title> </head> <body> <?php $size = getimagesize("dl_button.png"); $image_in = imagecreatefrompng("dl_button.png"); $image_out = imagecreate( 90, 90 ); imagecopyresized( $image_out, $image_in, 0, 0, 0, 0, 90, 90, $size[ 0 ], $size[ 1 ] ); imagepng($image_out,"small.png"); imagedestroy( $image_in ); imagedestroy( $image_out ); ?> <img src = "dl_button.png" border = "0"> <img src = "small.png" border = "0"> </body> </html> となっています。 今のままだとエラーが出て、 「small.pngが見あたらない」と言われてしまいます。 ディレクトリは index.phpとdl_button.pngが同じ場所にあります。

    • ベストアンサー
    • PHP
  • 画像処理GD×

    はじめまして。 下記は入力された1つの画像を指定したサイズで一部をコピーし 分割しpng形式にしていくプログラムです。 GDを使って処理していたのですが… GD,imagemagick等は使わないで処理する条件にすることになってしまいました。 ↓↓処理 入力された画像のsizeを調べる---getimagesize getimagesizeで画像の種類を判断し if(gifだったら) { $imgOrg = imagecreatefromgif(入力された画像) } if(jpeg,pngだったら…) {…} $max横=画像size[0] / 256; $max縦=画像size[1] / 256; for($i<MAX横になるまで) { for($x<MAX縦になるまで) { $img = imagecreate(256,256); imagecopy($img, $imgOrg , 0 , 0 ,$i * 256, $x * 256, 256, 256); } $name = $i.$x."xxx.png"; imagepng($img, $name); //main処理 } こんな感じなのですが、これをGDを使わないでやると… imagecreatefrom[gif,jpeg,png] imagecopy imagepng を使う処理ができなくなり、 変わりの処理を1日調べたのですが GD等を使った例しかサイトに載ってなくて行き詰っています。 GDを使わずに変わりの処理でできるのか、それともできないのか 初心者なのでおかしいとこがあるかもしれませんがよろしくお願いします。

    • 締切済み
    • PHP
  • PHP GD 画像が縮小できない

    宜しくお願いします。 ※ローカル環境です。 (WinXP PHP5 Smarty PEAR MySQL ※GDはインストされています。) 下記のコードで、サーバーにもともと上げてある画像(jpeg)を縮小して、 それをブラウザに表示させようと思います。 ですが、縮小されずに、元の画像サイズのまま表示されてしまいます。 おかしな点をご指摘下さいませ。 また、(1)で、 jpegファイルを取り込むコードがありますが、これは、 もし画像がGIFであったりPNGの場合を顧慮するなら、 取り込む際にそれぞれを判定するのが基本でしょうか? もし、今回のようにサバー元の画像をリサイズするのであれば、拡張子もわかっていますので、 jpegファイルだけのことを考えればいいですが、 たとえば、任意のアップロードされたファイルを扱う場合は、上記3種類を判定すして処理すべきですよね? 以上、2点を回答下さいませ。 // -- (1) // 画像を読み込む。 $file_path = "http://www元画像.com/img/aa.jpg"; $image = ImageCreateFromJPEG($file_path); //JPEGファイルを読み込む /*********** $image = ImageCreateFromGIF($file_path); //GIFファイルを読み込む $image = ImageCreateFromPNG($file_path); //PNGファイルを読み込む ************/ // -- (2) // 画像のサイズを取得。 $width = ImageSX($image); //横幅(ピクセル) $height = ImageSY($image); //縦幅(ピクセル) // -- (3) // 縮小した画像のサイズを決める。 $new_width = 100; $rate = $new_width/$width; //圧縮比 $new_height = $rate*$height; // -- (4) // 空の画像を作成する。 $new_image = ImageCreateTrueColor($new_width, $new_height); // -- (5) // サンプリングしなおす  ImageCopyResampled($new_image,$image,0,0,0,0,$new_width,$new_height,$width,$height); // -- (6) // ブラウザに出力する場合。 ImageJPEG($image); //ImageJPEG($image,'simpletext.jpg'); //ImageGIF($image); //環境によっては使えない //ImagePNG($image); // -- (7) // メモリを解放する。 imagedestroy ($new_image); imagedestroy ($image);

    • ベストアンサー
    • PHP
  • 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
  • DBに格納された画像データを縮小して表示したい

    PHP5+MySQL5です。 DB内のBLOBカラムに、Base64エンコードされた画像データが格納されています。 これを、サムネイル用に縮小して表示したいのですが、widthとheightで小さくするのではなく、ファイルサイズも小さくしてブラウザに渡したいと考えています。 (小さくした画像は保存しません) そこで、DBから取得した画像データを「imagecopyresampled」で再サンプリングしつつ小さくしたいと思いましたが、画面には何も表示されませんでした。 以下、ソースを簡潔に記載します。 $db_img = "DBから画像データを取得"; //600x600の画像 $old_img = base64_decode($db_img); $new_img = imagecreatetruecolor(200,200); //200x200のサムネイル画像を作成 $thumbnail = imagecopyresampled($new_img,$db_img,0,0,0,0,200,200,600,600); print $thumbnail; $old_imgの処理が間違っているのだろうと思うのですが、どのように処理すればいいのかわかりませんでした。 この場合、どのように処理すればいいのか教えていただけないでしょうか? 宜しくお願いします。

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

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

    • ベストアンサー
    • PHP
  • 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
  • PHP+GDについて

    PHPでGDを用いてPNGファイルを生成するスクリプトを作成したのですが、うまく動作しません。 <?php $filename = "G".date("Ymdhis").".png"; $im = imagecreate(550, 250) or die ("画像の作成に失敗しました"); $bg = imagecolorallocate($im, 255,255,255); $trans = imagecolortransparent($im, $bg); imageline($im, 60,0,60,140, $trans); $filedir="graph_img/".$filename; imagepng ($im,$filedir); imagedestroy($im); echo "作成完了!"; ?> このスクリプトを実行すると、PNGファイルは生成されるんですが、ファイルサイズが0で、スクリプトの実行がそこで中断されてしまいます。 何かよい解決方法はないでしょうか?よろしくお願いいたします。

    • 締切済み
    • PHP

専門家に質問してみよう