• 締切済み

PHP+GDで

質問させて頂きます。 以下のやり方でサムネイルを作成しています。 $src=imagecreatefromjpeg($dirname . $file); $dst=imagecreatetruecolor($swidth,$sheight); imagecopyresized($dst,$src,0,0,0,0,$swidth,$sheight,$width,$height); imagejpeg($dst, $dirname2 . $file); サムネイル作成する時に、縦横の大小、サイズの大きさに関係なく たまにサムネイル画像が黒くなってしまう現象が発生しています。 回避する方法を探しているのですが中々見つからずに困っています。 もしなにか良い方法を知っている方がいたら 知恵をお貸し下さい。 よろしくお願いします。

みんなの回答

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

imagecopyresized( )の代わりに imagecopyresampled( )を使ってみてはどうでしょう

kairyuu
質問者

補足

ご回答ありがとう御座います。試しましたが変わらずでした。 追加です。 調べてみたのですが、どうも画像の情報が欠落しているらしく(JEPGマーカーセギュメントが少ない)、その所為で黒くなっているみたいです。画像の方を治せば問題はないのですが、バッチとして組み込んでいるのでできるだけプログラム上で解決したいと考えております。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • imagecreatetruecolor()関数でのエラー

    imagecreatetruecolor()関数を使用するのですが どうしてもエラーが起きてしまい、使用できません。 そのソースですが $img1tmp = $_FILES['img1']['tmp_name']; list($width,$height)=getimagesize($img1tmp); header ("Content-type: image/jpeg"); $src=@imagecreatefromjpeg($img1tmp); $dst=@imagecreatetruecolor($cwidht1,$cheight1) or die ("Cannot Initialize new GD image stream"); imagecopyresized($dst,$src,0,0,0,0,$cwidth1,$cheight1,$width,$height); $boRtn1=imagejpeg($dst,「保存場所.ファイル名」); となってます。 各変数には、ちゃんと数値等は指定されています。 GDライブラリも問題なくインストールされているのですがimagecreatetruecolor()関数が動かず、上記で指定しているCannot Initialize new GD image streamが 表示されてしまいます。 どうぞ、よろしくお願い致します。

    • 締切済み
    • PHP
  • PHP Version 4.3.9で画像を

    表示させたいのですが以下の関数 imagecreatefromjpeg imagecreatetruecolor imagecopyresized imagejpeg を使うと次のようなエラーが発生します (imagecreatefromjpeg以外でも同じ) Fatal error: Call to undefined function: imagecreatefromjpeg() in /var/www/html/postgres/bbs3/bbs3.php on line 32 どうしたらこれらの関数を使えるようになるのでしょうか?

    • ベストアンサー
    • PHP
  • PHPの関数の使い方が分かりません。

    お世話になります。 目的は、関数で縮小した画像を4枚、座標を指定して表示させることです。 以下のような、PHPのプログラムを組んで、実行したのですが、 画像が1枚だけ縮小された状態で表示され、うまく行きません。 <?php //4つの同じサイズの縮小画像を表示させたい。 for ($i = 0; $i < 4; $i++) { // ファイルと新規サイズ $filename = 'pr-01.jpg'; //同フォルダ内の画像ファイル名 $percent = 0.2; //縦横比0.2倍のサイズへ。 // コンテントタイプ header('Content-Type: image/jpeg'); // 新規サイズを取得します list($width, $height) = getimagesize($filename); $newwidth = $width * $percent; $newheight = $height * $percent; // 読み込み $thumb = imagecreatetruecolor($newwidth, $newheight); $source = imagecreatefromjpeg($filename); // リサイズ imagecopyresized($thumb, $source, $i*100, $i*100, 0, 0, $newwidth, $newheight, $width, $height); // 出力 imagejpeg($thumb); } ?> これについて、教えて下さい。 お願い致します。

    • ベストアンサー
    • PHP
  • PHPでGDライブラリを使って縮小した画像を直接表示したい

    PHPでGDライブラリを使って、「image.jpg」という画像(800x222のJPEGファイル)を、GETで渡した幅に縮小させたくて、次のように書きました。 -----reimage.php--------------------- <?php header("Content-Type:image/jpeg"); $old_width=800; $old_height=222; $width = htmlspecialchars($_GET['w']); $height = ($old_height / $old_width) * $width; $source = imagecreatefromjpeg("image.jpg"); $re_image = imagecreatetruecolor($width,$height); imagecopyresampled($re_image,$source, 0, 0, 0, 0,$width, $height, $old_width, $old_height); imagejpeg($re_image); imagedestroy($re_image); ?> -------------------------- 他のHTMLファイルから <img src="reimage.php?w=480"> などとすると縮小された画像が表示されるのですが、直接「reimage.php?w=480」を開くと、文字化けした文字列が並んでいるばかりで画像が表示されません。 firefoxでMIMEタイプを見てみると、「text/html」になっています。 >header("Content-Type:image/jpeg"); の部分がうまくいっていないのだと思いましたが、どう直せばいいのか分かりません。 なお、サーバーはxreaの広告免除を使っています。 まだPHPを勉強し始めて日が浅いので、見当違いなことを聞いているかも知れませんが、よろしくおねがいします。

    • ベストアンサー
    • 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
  • アップロードされたファイルを縮小したい

    アップロードされたファイルが200*200よりも大きかった場合、200*200に縮小したいのですが、 エラーが出てしまい困っています。 $filename="test.jpg"; $width="200"; $height="200"; $size = getimagesize($filename); if ($size[0] > $width || $size[1] > $height) { header ("Content-type: image/jpeg"); $src_im = imagecreatefromjpeg($filename); $dst_im = imagecreate($width, $height); imagecopyresampled ( $dst_im, $src_im, 0, 0, 0, 0, $width, $height, $size[0], $size[1]); imagejpeg ($dis_im , $filename); } 以上のように記述したところ、以下のようなエラーが出ました。 Warning: imagejpeg(): supplied argument is not a valid Image resource in /var/*****/***.php on line 171 きちんと動作させるにはどうしたら良いでしょうか? アドバイスをお願いします(*- -)(*_ _)

    • ベストアンサー
    • PHP
  • [PHP]GDを利用した画像リサイズについて

    [PHP]GDを利用した画像リサイズについて GDを利用した画像リサイズ処理を行うクラスを作ったのですが、 以下のようなエラー(文字化け)が出てしまい画像出力することができません。 有識者の方、どうか知恵をお貸しください。宜しくお願い致します。 ????JFIF??;CREATOR: gd-jpeg v1.0 (using IJG JPEG v70), quality = 75 ??C    $.' ",#(7),01444'9=82<.342??C  2!!22222222222222222222222222222222222222222222222222??II"?? ???}!1AQa"q2???#B??R??$3br? %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz??????????????????????????????????????????????????????????????????????????? ???w!1AQaq"2?B???? #3R?br? -------- 以下省略 ---------- ◆作成したPHPファイル ・test.php <?php require_once 'Image.php'; $path = './400x300.jpg'; $r = new Image($path, 75); $r->resize(75); ?> ・Images.php <?php class Image{ var $new_width; var $path; function Image($path, $new_width){ @header("Content-type: image/jpeg"); $this->path = $path; $this->new_width = $new_width; } function resize(){ global $new_width; global $path; // 画像パス $image = imagecreatefromjpeg($this->path); // 画像のサイズを取得 $width = 150; $height = 150; $rate = $this->new_width / $width; $new_height = $rate * $height; $thumb = imagecreatetruecolor($this->new_width, $new_height); imagecopyresized($thumb, $image, 0, 0, 0, 0, $this->new_width, $new_height, $width, $height); // imagecopyresampled($thumb, $image_path, 0, 0, 0, 0, $this->new_width, $new_height, $width, $height); imagejpeg($thumb, null, 75); imagedestroy($image); } } ?> ◆環境と状況 ・サーバ:WindowsXP(XAMPPを利用してローカル環境を構築) ・phpinfo()にて、GD Support=enabled、JPEG Support=enabledを確認 ・ステップ実行(デバック)にてimagejpeg($thumb, null, 75);まで問題なく実行可能。  ※imagejpeg($thumb, null, 75);実行後上記文字列が出力される。 ・コメントアウト個所のimagecopyresampledでも動作結果は同じ。 ・参考にしたサイト  http://goodjob.boy.jp/chirashinoura/id/79.html 恐れ入りますが、ご回答お願い致します。

    • ベストアンサー
    • PHP
  • phpで困ってます

    下記のphpで、写真をサーバーにアップロードして、2種類にリサイズして保存し、ファイル名をテキストで保存しようとしてるのですが、ファイル名をテキストで保存する部分file_put_contents($name_file,$name_log); にエラーがでます。写真はリサイズされ保存されています。何度か見直しているのですが、原因が分かりません。エラーの原因を教えていただきたいと思い、投稿しました。よろしくお願いします。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>画像ファイルアップロード</title> </head> <body> <?php // 名前保存のテキストファイル $name_file = "name.txt"; // 名前保存のテキストファイル読み込み用の配列 $name_log = array(); // 名前保存のテキストファイルを読み込み用の配列に読み込む if (file_exists($name_file)) { $name_log = file( $name_file ); } // 保存画像の保存先のディレクトリ $dir_l = 'uploads_l/'; // サムネイル画像の保存先のディレクトリ $dir_s = 'uploads_s/'; for ( $i=0; $i<count($_FILES['filename']['tmp_name']); $i++ ) { // ファイル名の取り出し $file_name = $_FILES['filename']['name'][$i]; // ファイル(MIME)タイプの取り出し $file_type = $_FILES['filename']['type'][$i]; // 一時ファイル名の取り出し $temp_name = $_FILES['filename']['tmp_name'][$i]; // 重複しないように日付をヘッダにする $head = date("YmdHis"); // 保存先のファイル名 $upload_name_l = $dir_l . $head ."-". $file_name; // サムネイル画像の保存先のファイル名 $upload_name_s = $dir_s . $head ."-". $file_name; // JPEG形式のファイルをアップロードする if (($file_type == 'image/jpeg') || ($file_type == 'image/pjpeg')) { // アップロード(移動) $result = move_uploaded_file($temp_name, $upload_name_l); if ($result) { // アップロードの成功 // アップロードされた画像情報を取り出す $image_size = getimagesize($upload_name_l); // アップロードされた画像の幅と高さを取り出す $width = $image_size[0]; $height = $image_size[1]; // 保存画像の幅と高さを決める $width_l = 480; $height_l = round($width_l*$height/$width); // サムネイル画像の幅と高さを決める $width_s = 60; $height_s = round($width_s*$height/$width); // アップロードされた画像を取り出す $image = imagecreatefromjpeg($upload_name_l); // 保存画像の大きさの画像を新規作成 $image_l = imagecreatetruecolor($width_l,$height_l); // アップロードされた画像から保存画像を作成 $result_l = imagecopyresampled( $image_l, $image, 0,0, 0,0, $width_l,$height_l, $width,$height); if ($result_l) { // 保存画像作成成功 // 保存画像の保存 if (imagejpeg($image_l,$upload_name_l)) { echo ' ->保存画像保存';                                      $add_name = $upload_name_l;                array_push($name_log, $add_name); } else { echo ' ->保存画像保存失敗'; } } else { // 保存画像作成失敗 echo ' ->保存画像作成失敗'; } // サムネイルの大きさの画像を新規作成 $image_s = imagecreatetruecolor($width_s,$height_s); // アップロードされた画像からサムネイル画像を作成 $result_s = imagecopyresampled( $image_s, $image, 0,0, 0,0, $width_s,$height_s, $width,$height); if ($result_s) { // サムネイル画像作成成功 // サムネイル画像の保存 if (imagejpeg($image_s,$upload_name_s)) { echo ' ->サムネイル画像保存'; } else { echo ' ->サムネイル画像保存失敗'; } } else { // サムネイル画像作成失敗 echo ' ->サムネイル画像作成失敗'; } // 画像の破棄 imagedestroy($image); imagedestroy($image_l); imagedestroy($image_s); } else { // アップロードの失敗 echo '■アップロード失敗'; } } else { // JPEG形式以外のファイルはアップロードしない echo '■JPEG形式の画像をアップロードしてください。'; } }     //ファイルへ保存 file_put_contents($name_file,$name_log); ?> </body> </html>

    • ベストアンサー
    • PHP
  • PHPバッファリングで出力した文字列をセッションで

    こんんばんは。この度もよろしくお願いします。 phpを勉強中の者です。 GDを使って画像をリサイズし、ブラウザに表示したり、データベースに保存したりしたいです。そこで、質問なのですが、バッファリングで出力した文字列をセッションで使うことはできないのでしょうか? 以下のようにしてみましたが、別ページで引き継ぎできません。 セッションで使うためにはどうすれば良いのでしょうか。 そもそもセッションでは使うことができない……まるっきり私の理解が間違っているのでしょうか。 よろしくお願いします。 $filename = 'test.jpg'; $percent = 0.5; list($width, $height) = getimagesize($filename); $new_width = $width * $percent; $new_height = $height * $percent; $image_p = imagecreatetruecolor($new_width, $new_height); $image = imagecreatefromjpeg($filename); imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height); ob_start(); imagejpeg ($image_p); $img = ob_get_contents(); ob_end_clean(); $_SESSION['img'] = $img; ←できません!

    • ベストアンサー
    • PHP
  • imagejpegで表示されない。

    ◆環境◆ PHP Version 5.1.6 apache : 2.x GD Support: enabled GD Version: bundled (2.0.28 compatible) FreeType Support : enabled FreeType Linkage : with TTF library FreeType Version : 1.4 GIF Read Support : enabled GIF Create Support : enabled JPG Support : enabled PNG Support : enabled WBMP Support : enabled XBM Support : enabled ◆質問◆ 既にアップロードされた画像をサムネイルして、表示したいのですが、 バイナリ表示までは出来たのですが、画像が表示できません。 ※$imgにはhttp://www.xxxx.com/image/abcといったファイル名までの絶対パスを取得した文字列が入ります。 <?php $new_img = $img."_thumb.jpg"; $old_img = $img.".jpg"; if(is_dir($img)){ unlink($new_img); }else{ mkdir($img); } list($old_width, $old_height, $old_type, $old_attr) = getimagesize($old_img); //縮小のサイズ $thumbwidth=93; $thumbheight=30; //画像の縮小 $src_im = imagecreatefromjpeg($old_img);//元の画像 $dst_im = imagecreatetruecolor($thumbwidth, $thumbheight);//縮小画像 imagecopyresampled($dst_im,$src_im,0,0,0,0,$thumbwidth,$thumbheight,$old_width,$old_height); imagejpeg($dst_im,$new_img); ?> 一番最後の imagejpeg($dst_im,$new_img); を imagejpeg($dst_im); にするとバイナリが表示されるのですが、 imagejpeg($dst_im,$new_img); にすると何も表示されなくなってしまいます。。 $new_imgのURLにアクセスしても画像が生成されていないようです。 header('Content-type: image/jpeg');を追記すれば良いのか!とも思ったのですが、 追記後にページを見るとサイトのURLが表示されるだけになってしまったり・・。 色々試してみましたが、万策尽き、ご質問させて頂きました。 何か根本的な事が間違っている様な気もしますが、 ご教授願えたらと思います。 何卒よろしくお願い致します。

    • ベストアンサー
    • PHP