解決済

clip!clip!
Ads By Google

[PHP]GDライブラリについて。
ImageTrueColorToPaletteで65535色に指定しても256色になってしまいます。

JPG画像のアップロードスクリプトを作成中です。
最大幅を超えていたら劣化させずにリサイズしたいのです。
ところが、ImageTrueColorToPaletteでパレットを65535色に指定しても256色になってしまいます。
PHPマニュアルに「期待通りにうまくいきません」と書いてあるので諦めかけましたが、こんな時こそナレッジ頼みです。

00:$length = 222;
01:$size   = getImageSize($resource);
02:if($size[0] > $length){
03:    $width   = $length;
04:    $high    = $length / $size[0] * $size[1];
05:    $img_in  = ImageCreateFromJPEG($resource);
06:    $img_out = ImageCreateTruecolor($width,$high);
07:    ImageCopyResampled
       ($img_out,$img_in,0,0,0,0,
        $width,$high,$size[0],$size[1]);
08:    ImageTrueColorToPalette($img_out,TRUE,65535);
09:    ImageJPEG($img_out,$save_path);
10:    ImageDestroy($img_in);
11:    ImageDestroy($img_out);
12:}

(PHP5/GD2.1.9)

リサンプリング前にパレットを指定してもダメでした。
7行目はレイアウトを考慮した改行です。(コードは1行です)
宜しくお願いします。

2006-06-19 09:01の質問
Palette  True  To  Image  Color  
TRUE
歌ネットによる歌詞情報です
www.uta-net.com/user/phplib/J-Word.php
この質問と回答を読んで役に立った場合は「役に立つ質問」に投票してください。投票が多い質問は、役に立つ質問一覧に掲載され、より多くの人に見てもらうことができます。

回答(2)

1.

2006-06-19 10:16:03みんなナイスな
GDを使うのはいまさら感があるので、ImageMagickを使うのがいいのではないでしょうか?


でも、GDのバージョンは違いますが同じ答えに落ち着きました。

2.

2006-06-19 17:52:58みんなナイスな
#ご無沙汰しております。
一番劣化しないのは、8行目のImageTrueColorToPaletteをトルことだと思います。元の画像はだいたい32ビットだと思いますので、65535だと減色されてしまう気がします。元が16ビットだとしてもResampledした段階で32ビットパレットの色が出ている可能性もあります。JPGなので色数を指定する必要はあまりない気がします。

PHP4.3.1↓にバンドルされているGDだとこの関数は正常に機能しないかもしれませんが、この問題ではないようです。
回答レベル : 回答
Ads By Google

コメント(4)

#1.  
2006-06-19 22:27:04

>>1
ご回答ありがとうございます。
解決策としてはそれしかないかな的な香りは当初から感じておりました。
当質問ではGDの動作に納得いかないのですよ的な意味合いが込められておりますので、あくまでもGDについて結論を持ちたいわけです。

#2.  
2006-06-19 22:46:17

>>2
//ご無沙汰しておりました。
そもそもパレット指定無しで書いたのですが、私のコードより劣化しない方法がないものかと思いまして。
そんな折、ImageTrueColorToPaletteにて綺麗にリサイズできるようなできないようなウワサを聞きまして。
しかし「一番劣化しないのは」と切り出されているのを見て、あらためてトル方向で固まりました。

本当は、私の知らない「ImageTrueColorToSpecialPalette」とかいう関数でもないものかと薄っすら期待しておりました。
そういう事ってよくありますでしょ。

2006-06-20 05:37:16

>>#2
Resampledはうまくできていると思いますので、一度変換してしまうと、自動でそれ以上の品質にするのは難しいです。ImageTrueColorToPaletteは、一般には減色目的なので、品質自体が上がることはないです。アルファチャネルとか入っている画像とか重ねたときでもうまく減色できるように・・・らしいですが、うまくいかないこともあるようです。

妄想関数は私もよくやります。脳内で引数まで想像して、マニュアル探したらなかった、とか・・・w同じことを考えた誰かが作って公開してくれている、ということも稀にあるので、判断は難しいですよね。。。

#4.  
2006-06-21 06:57:18

>1うんなつおさん
劣化させずにリサイズするならImageMagickを使うといい。
>2オニキスさん
GDを使うならパレット指定しないのが一番いい。

あれから色々と調べましたが、やはりご回答の通りです。
どちらもベスト回答という意味での均等分配とさせて頂きます。

>#3
>同じことを考えた誰かが作って公開してくれている

なかったので、その誰かになってみようかなーと考えてます。

トラックバック(2)

トラックバックURL: