重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

宜しくお願いします。
※ローカル環境です。
(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);

A 回答 (5件)

元の画像サイズのまま表示される原因は「ImageJPEG($image);」で元の画像を出力しているからです。


「ImageJPEG($new_image);」で縮小した画像を出力できます。

画像の種類判別は、下記の関数で出来ます。

・exif_imagetype($filename)
http://jp2.php.net/manual/ja/function.exif-image …

・getimagesize($filename) の戻り値で2番目要素
http://jp2.php.net/manual/ja/function.getimagesi …

下記の関数なら、自動判別で画像を読み込むことが出来ます。

・imagecreatefromstring(file_get_contents($filename))
http://jp2.php.net/manual/ja/function.imagecreat …

この回答への補足

回答有難うございます!お蔭様で、解決できました! 
ただ、画像の種類判別は、 getimagesize()  を利用しようと思いますが、

現在、下記のように pathinfo を記述しております。
これだとダメでしょうか?

$imgpass = pathinfo($file_path);
$extension = $imgpass['extension']; //拡張子のみを取得

補足日時:2011/04/16 10:58
    • good
    • 0
この回答へのお礼

結局のところ、問題は解決いたしました。
色々と有難うございました。

お礼日時:2011/04/17 01:51

>header("Content-type~・・・・は、とても重要なものだと思いますが、


>勉強不足のため、その確固たる意味合いを知らないのが、
>こういった疑問に繋がっているのだと思います。
正直言ってヘッダこれはphp以前のhttpの仕様の問題。
phpやるなら知っていて当然のこと。

header()関数はそのヘッダを送信する関数。
    • good
    • 0
この回答へのお礼

有難うございます。
お蔭様で、随分まえに勉強したことをおさらいすることができました。
概ね理解していた通りで、再認識することができました。

お礼日時:2011/04/17 01:49

参考までに。



・image_type_to_mime_type($imagetype)
http://jp2.php.net/manual/ja/function.image-type …

・image_type_to_extension($imagetype)
http://jp2.php.net/manual/ja/function.image-type …
    • good
    • 0
この回答へのお礼

bx2さん、
追加の回答有難うございます。

お礼日時:2011/04/17 01:51

書き忘れたけど画像を出力するなら前もって


header("Content-type: image/画像形式");
としてヘッダを書いた方がいいよ。

この回答への補足

header("Content-type~・・・・ っという物をつけるのは、
なんとなくその意味がわかる程度で、正直なところ勉強不足です。
実はこの件に関しても疑問がありました。

今回の質問に記載したコードは、リサイズした画像を単にブラウザに出力する
だけのものになっています。
でも、実際は、特定のディレクトリにファイル名をつけて保存するようにします。
そして、Smartyにて開発しておりますので、
テンプレート側(HTML)に、その保存データーを<img>タグで引っ張ってきて表示させようと思っております。
そのため、
他のサイトでも、header("Content-type~・・・・ をつけるようにということを、
記載されていることが殆どですが、
今回のケースでは、
1、データーとしてディレクトリに保存
2、Smartyとの連携で、HTMLテンプレートに出力
という2つの観点から、phpファイルにheader("Content-type~・・・・を
書くのはおかしいのではと思い、記述しておりません。

header("Content-type~・・・・は、とても重要なものだと思いますが、
勉強不足のため、その確固たる意味合いを知らないのが、
こういった疑問に繋がっているのだと思います。

補足日時:2011/04/16 14:53
    • good
    • 0

>現在、下記のように pathinfo を記述しております。


>これだとダメでしょうか?
>$imgpass = pathinfo($file_path);
>$extension = $imgpass['extension']; //拡張子のみを取得
これだと拡張子が偽装されていたり間違った拡張子になっていた場合には
判断できないですよね。
    • good
    • 0
この回答へのお礼

回答有難う御座います。
なるほど、では、
getimagesize() にて画像データーの配列を取得するようにします。

その後、
ifにてgif、jpg、pngを判定い、振り分けます。

お礼日時:2011/04/16 14:34

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