人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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);

1257775062
●拡大する

●質問者: AKI-NAMI
●カテゴリ:ウェブ制作
✍キーワード:.jpg JPEG PHP いもの サイト
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● scrap49
●0ポイント

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

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

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

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

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

◎質問者からの返答

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


2 ● rouge_2008
●100ポイント ベストアンサー

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);
◎質問者からの返答

わぁ?恥ずかしいです。

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

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

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


3 ● Numeric
●25ポイント

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

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

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

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

参考

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

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

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ