PHPによる画像処理でPNG形式の画像が正しく表示されない問題の解決方法

このQ&Aのポイント
  • PHPを使用してJPG形式の画像をPNG形式に変換しようとしていますが、表示される画像が正しくない問題が発生しています。
  • 問題のPHPスクリプトでは、imagecreatefromjpeg関数を使用してJPG画像を読み込み、imagecreatetruecolor関数を使用して新しい画像を作成しています。
  • 画像を変換する際には、imagecopyresized関数を使用してJPG画像を新しい画像にリサイズしていますが、このプロセスで表示が正しくない問題が発生しています。
回答を見る
  • ベストアンサー

PHPによる画像処理

PHPを使ってJPG形式の画像をPNG形式に変換しようとしていますが、画像が添付のスクリーンショットのようなものになってしまいます。 以下がPHPスクリプトです。 ちゃんとPNG形式の画像を表示させるにはどうしたらよいのでしょうか。 詳しい方、どうかご教授ください。お願いします。 <?php $fpath='pictures/DSCN1458.JPG'; $scimg=imagecreatefromjpeg(realpath($fpath)); $cpimg=imagecreatetruecolor(200,150); $cl=imagecolorallocate($cpimg,255,0,0); imagecopyresized($cpimg, $scimg, 0,0,0,0,imagesx($cpimg),imagesy($cpimg), imagesx($scimg),imagesy($scimg)); header('Content-type', 'image/png'); imagepng($cpimg); imagedestroy($scimg); imagedestroy($cpimg); ?> <html> <head><title>image transform</title></head> <body > </body> </html>

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

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

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5083/13282)
回答No.1

header文の書き方が間違っています。 正しくは header('Content-type: image/png'); になります。 この間違いでブラウザはPNG画像では無くHTMLファイルを受け取ったと勘違いしています。 また imagedestroy($cpimg); より後は不要ですから、「?>」も含めて削除しましょう。 そうしないと画像データの中にHTMLのタグや余計な改行が混ざってしまい、ブラウザが正常に画像として処理できなくなります。

papashiroSooke
質問者

お礼

早速にご回答を頂き、有難うございます。 ご指摘の部分を訂正して実行しましたら、ちゃんと画像が表示されました。 良い勉強になりました。

関連するQ&A

  • 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
  • 透過合成した画像からの縮小コピーで黒塗りに!

    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
  • GD(php)での image関数 イメージ関数でブラウザ出力が出来ない

    下記ソースのimage.phpというファイルを作りました。 直接http://url/image.phpでアクセスすると画像が表示されません。 <? header("Content-Type: image/png"); $image = imagecreate(120,120); $black = imagecolorallocate($image,0,0,128); $yellow = imagecolorallocate($image,255,255,0); imageline($image,10, 60, 110, 60, $yellow); imagepng($image); imagedestroy($image); ?> imagepng($image);を imagepng($image,"test.png"); に変えたら、正しく同フォルダーにtest.pngが出力され、こちらは問題ないファイルとなっています。今回の処理ではphpを画像ファイルとして扱いたいのですが、 このケースで考えられる原因教えてください。 参考までにtest.htmlに <html><head><title>test</title> <img src="image.php"></body></html> と書いても結果は同じく画像表示が出来ませんでした。 <html><head><title>test</title> <img src="test.png"></body></html> では表示出来ます。

    • 締切済み
    • PHP
  • PHPのアニュアル17章をみて

    x.phpを <?php Header("Content-type:image/png"); $string=implode($argv," ");//変更場所 $im=imageCreateFromPng("x.png"); $orange=ImageColorAllocate($im,220,210, 60); $px=(imagesx($im)-7.5*strlen($string))/2; ImageString($im,3,$px,9,$string,$orange); ImagePng($im); ImageDestroy($im); ?> としx.htmlを <html><body> <img src="x.php?text"/> </body></html> とし画像x.pngとx.htmlとx.phpを /var/www/html/において 外部のPCからブラウザでx.htmlを呼び出したのですが絵が出ません $string=implode($argv," ");//変更場所 を $string="text"; に変更すれば絵が出ます このままでは引数を引き渡すことができません どうしたらいいのでしょうか?

    • ベストアンサー
    • 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
  • PHPの画像処理

    PHP学習者です。 画像ディレクトリー内の画像をサイズを変えて表示するプログラムを作りましたが、JPG形式は表示されてもPNG形式やGIFが表示されません。 関係すると思われるコードの一部を掲載します。コードがおかしいのか、あるいは何かPNGのためにはしておくことがあるのか、詳しい方どうか教えてください。お願いします。 //*************************************************** public function getImage() // create thumbnail image to be sent to browser //*************************************************** { header("content-type:$this->mimetype"); switch($this->imageproperties[2]){ case IMAGETYPE_JPEG: imagejpeg($this->image,"",$this->quality); break; case IMAGETYPE_GIF: imagegif($this->image,""); break; case IMAGETYPE_PNG: imagepng($this->image,"", $this->quality); break; default: die("could not create image"); } // end case ; }

    • ベストアンサー
    • 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
  • イメージ関数の使い方について

    ローカルテスト環境で、簡易画像掲示板を自分で作ってみたいと思い、まずimage関数がどういったものかphpマニュアルで見てました。 imagecreatetruecolor()を調べていて、実際どんなものか動かしてみようと思い、マニュアルのサンプルコードのメッセージ部分だけ変えてやってみました。以下がコードの内容です。 <?php header ("Content-type: image/png"); $im = @imagecreatetruecolor(120, 20) or die("新しいイメージストリームを作成できませんでした。"); $text_color = imagecolorallocate($im, 233, 14, 91); imagestring($im, 1, 5, 5, "ここが表示されるテキスト", $text_color); imagepng($im); imagedestroy($im); ?> しかし、これを実行してみても画像が×印になって表示されません。 imagecreatetruecolor()とかimagepng()とかちゃんと動いているのかと思い、自分なりに確認してみようと、コードを少し変えました。 まずimagecreatetruecolor()は成功時に画像リソースIDを返すと書いてあったのでprint文で出力して確認できないかと思いやってみました(返される値がarrayとかstoringじゃないので、出力できないのではと思いましたがとにかくやってみました。) つぎにimagepng()は失敗した場合に FALSE を返すって書いてあったので、失敗したら"false"と出力させてみようと思いました。 以下がそのコードです。 <?php header ("Content-type: image/png"); $im = @imagecreatetruecolor(120, 20) or die("新しいイメージストリームを作成できませんでした。"); print($im); $flag=imagepng($im); if($flag==false){ print("false");} imagedestroy($im); ?> これを試してみましたが、出力結果は同じでした。 なんか反応があるかもとおもい、一応imagecreatetruecolor(120, 20)の前の@マークをはずしてみたりもしましたが別にエラーが表示されるわけでもなく、ただ画像が表示されないだけです。 phpinfoのgdのところは、 GD Support enabled GD Version bundled (2.0.34 compatible) FreeType Support enabled FreeType Linkage with freetype FreeType Version 2.1.9 T1Lib Support enabled GIF Read Support enabled GIF Create Support enabled JPG Support enabled PNG Support enabled WBMP Support enabled XBM Support enabled になっています。 php.iniのmemory_limit は32Mになってます。memory_limitを-1にしたらちゃんと表示されるかもと思ったのですがやはり×印のままでした。 C:\xampp\php\extの中にphp_gd2.dllがあるのも一応確認しました。 動作環境はwindows vistaにxampp1.6.5で、phpのバージョンは5.2.5です。マニュアルを見た限りでは、windowsではphp.iniのphp_gd2.dllのコメントを外すだけでちゃんと動作すると思っていたのですが、他に抜けていることがありましたらアドバイスをお願いします。

    • ベストアンサー
    • PHP
  • PHPで半透明画像を作りたい

    半透明の画像(全てのピクセルのalphaが50の画像)を作りたいのですがうまくいきません。 元画像を$imとして、透明の背景($bg)を作成し、その上に alpha=50でコピーすれば、半透明になるか・・・と思ったのですが、 黒っぽい画像になってしまいます。 ($bgが透明ではなく、黒画像になっているようです。) 半透明の画像を作りたいときは、どのようにすれば作成できますでしょうか? $bg = imagecreatetruecolor(100, 100); imagefill($bg,0,0,imagecolorallocatealpha($bg,0,0,0,127)); imagecopymerge($bg, $im, 0, 0, 0, 0, 100, 100, 50); imagealphablending($bg, false); imagesavealpha($bg, true); header('Content-type: image/png'); imagepng($bg);

    • 締切済み
    • PHP
  • PHPによる画像の生成による色の変化

    お世話になっております。 PHPでアップロードしたjpg画像を縮小して生成しているのですが、色がおかしくなってしまいます。 (全ての画像が荘ではないのですが、変わるものは元の画像とはまったく違った青の強い色になってしまう。) ソースはこんな感じなのですが、何かおかしい部分があったらお教えいただけますでしょうか。 また、何か画像処理を加えてあるものを使用するとこのような経験がある方いらっしゃいましたらよろしくお願いいたします。 version 4.3.8です。 ******************** function imgjpg($_val1,$_val2,$_val3) { $size=GetImageSize("$_val1"); $image_in = ImageCreateFromJpeg("$_val1"); //縦長か横長か計算 $ratio = $size[0] / $size[1]; if($ratio > 1){ //横長の場合 $image_out = ImageCreate($_val3,$_val3 / $ratio); imagecopyresized($image_out,$image_in,0,0,0,0,$_val3,$_val3 / $ratio,$size[0],$size[1]); } else {//縦長の場合 $image_out = ImageCreate($_val3 * $ratio,$_val3); imagecopyresized($image_out,$image_in,0,0,0,0,$_val3 * $ratio,$_val3,$size[0],$size[1]); } ImageJPEG($image_out,$_val2); ImageDestroy($image_in); ImageDestroy($image_out); ********************

    • ベストアンサー
    • PHP

専門家に質問してみよう