1257775062 php の imagecopyresampled の画質に関しての質問です。

投稿画像を収納する際に、画面表示用に imagecopyresampled を利用しようとしていますが、検索したサイトで表示されている画質とはほど遠いものしか出力されません。(使用色数が落ちたような感じです)どこに問題があるのかご教授ください。

$upload_file_name = "../member/upload_img/".$match_str;
move_uploaded_file($_FILES['img_upload_file']['tmp_name'],$upload_file_name);
$img_info = getimagesize($upload_file_name);
$img_resource = imagecreatefromjpeg($upload_file_name);
if($img_info[0] - $img_info[1] < 0){
$img_width = "height";
$x = $img_info[0]/$img_info[1];
$img_resample = imagecreatetruecolor(480*$x,480);
imagecopyresampled($img_resample,$img_resource,0,0,0,0,480*$x,480,$img_info[0],$img_info[1]);
}else{
$img_width = "width";
$x = $img_info[1]/$img_info[0];
$img_resample = imagecreate(480,480*$x);
imagecopyresampled($img_resample,$img_resource,0,0,0,0,480,480*$x,$img_info[0],$img_info[1]);
}
header('Content-Type: image/jpeg');
imagejpeg($img_resample,"../member/upload_img/resample.jpg",75);

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2009/11/09 22:57:45
  • 終了:2009/11/10 17:50:12

ベストアンサー

id:rouge_2008 No.2

rouge_2008回答回数594ベストアンサー獲得回数3512009/11/10 04:46:29

ポイント100pt

http://noongoro.main.jp/note/note0052.html

 なんか、かなりジャギジャギして色の少ない画像です。どうやら、imagecopyresampled()関数の解説によると、

注意: パレットイメージの制限(255+1色)による問題があります。 カラーの再サンプリングやフィルタリングには通常は255色以上の色が必要となります。再サンプルするピクセルとその色を計算するために ある種の近似計算が使用されます。パレットに新しい色を割り当てようとして失敗すると、(理論的に)最も近い色が選択されます。 それは必ずしも常に可視色とは限りません。そのため、空白(あるいは不可視な)といった不可思議な結果がもたらされます。 この問題を回避するには、imagecreatetruecolor()で 生成されるようなTrueカラーイメージを目的のイメージとして 使用してください。

 とのこと。imagecreate()関数は、GIFやPNG8形式の画像の処理に適しているが、JPEG形式には向いていないようです。というわけで、imagecreatetruecolor()関数を使いました。

else~の処理の方で、imagecreate関数を使用しているのが原因のようです。

上記ページの解説によると、imagecreate関数は256色までしか対応していないようですので、imagecreatetruecolor関数を使用しましょう。

今回の事とは関係ありませんが、処理の一番最後にimagedestroy関数でメモリの開放をした方が良さそうです。(※この事も上記ページに記載されています。)

※今回の例の場合は最後の行に以下の2行を追加します。

imagedestroy($img_resource);
imagedestroy($img_resample);
id:AKI-NAMI

わぁ~恥ずかしいです。

rouge 2008 様ありがとうございます。

一度モードに入ってしまうと、なかなか気がつきません。

それから、気になってはいましたが、デストロイのご指摘はありがたかったです。

2009/11/10 17:46:45

その他の回答(2件)

id:scrap49 No.1

scrap49回答回数18ベストアンサー獲得回数42009/11/10 00:18:41

imagejpeg関数の第3引数でクオリティを指定できます。

とりあえず最高画質の100にしてみる。

ファイルサイズがかなり大きくなるので、Disk容量が気になるなら

画質とファイルサイズのバランスするところまで下げていく。

http://d.hatena.ne.jp/m383m/20081030/1225374750

id:AKI-NAMI

100に設定してもファイルサイズが倍になっただけで、見た目の変化はありませんでした。

2009/11/10 02:06:09
id:rouge_2008 No.2

rouge_2008回答回数594ベストアンサー獲得回数3512009/11/10 04:46:29ここでベストアンサー

ポイント100pt

http://noongoro.main.jp/note/note0052.html

 なんか、かなりジャギジャギして色の少ない画像です。どうやら、imagecopyresampled()関数の解説によると、

注意: パレットイメージの制限(255+1色)による問題があります。 カラーの再サンプリングやフィルタリングには通常は255色以上の色が必要となります。再サンプルするピクセルとその色を計算するために ある種の近似計算が使用されます。パレットに新しい色を割り当てようとして失敗すると、(理論的に)最も近い色が選択されます。 それは必ずしも常に可視色とは限りません。そのため、空白(あるいは不可視な)といった不可思議な結果がもたらされます。 この問題を回避するには、imagecreatetruecolor()で 生成されるようなTrueカラーイメージを目的のイメージとして 使用してください。

 とのこと。imagecreate()関数は、GIFやPNG8形式の画像の処理に適しているが、JPEG形式には向いていないようです。というわけで、imagecreatetruecolor()関数を使いました。

else~の処理の方で、imagecreate関数を使用しているのが原因のようです。

上記ページの解説によると、imagecreate関数は256色までしか対応していないようですので、imagecreatetruecolor関数を使用しましょう。

今回の事とは関係ありませんが、処理の一番最後にimagedestroy関数でメモリの開放をした方が良さそうです。(※この事も上記ページに記載されています。)

※今回の例の場合は最後の行に以下の2行を追加します。

imagedestroy($img_resource);
imagedestroy($img_resample);
id:AKI-NAMI

わぁ~恥ずかしいです。

rouge 2008 様ありがとうございます。

一度モードに入ってしまうと、なかなか気がつきません。

それから、気になってはいましたが、デストロイのご指摘はありがたかったです。

2009/11/10 17:46:45
id:Numeric No.3

Numeric回答回数83ベストアンサー獲得回数182009/11/10 12:08:57

ポイント25pt

13行目が"imagecreate"になっています。

$img_resample = imagecreate(480,480*$x);

以下のように変更すればOKです。

$img_resample = imagecreatetruecolor(480,480*$x);

参考

imagecreate — パレットを使用する新規画像を作成する

imagecreatetruecolor — TrueColor イメージを新規に作成する

id:AKI-NAMI

2番目の方と同じご指摘でした。ありがとうございます。

2009/11/10 17:47:46

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません