[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行です)
宜しくお願いします。
回答(2)
1.

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

一番劣化しないのは、8行目のImageTrueColorToPaletteをトルことだと思います。元の画像はだいたい32ビットだと思いますので、65535だと減色されてしまう気がします。元が16ビットだとしてもResampledした段階で32ビットパレットの色が出ている可能性もあります。JPGなので色数を指定する必要はあまりない気がします。
PHP4.3.1↓にバンドルされているGDだとこの関数は正常に機能しないかもしれませんが、この問題ではないようです。
コメント(4)
>>1
ご回答ありがとうございます。
解決策としてはそれしかないかな的な香りは当初から感じておりました。
当質問ではGDの動作に納得いかないのですよ的な意味合いが込められておりますので、あくまでもGDについて結論を持ちたいわけです。
>>2
//ご無沙汰しておりました。
そもそもパレット指定無しで書いたのですが、私のコードより劣化しない方法がないものかと思いまして。
そんな折、ImageTrueColorToPaletteにて綺麗にリサイズできるようなできないようなウワサを聞きまして。
しかし「一番劣化しないのは」と切り出されているのを見て、あらためてトル方向で固まりました。
本当は、私の知らない「ImageTrueColorToSpecialPalette」とかいう関数でもないものかと薄っすら期待しておりました。
そういう事ってよくありますでしょ。
>>#2
Resampledはうまくできていると思いますので、一度変換してしまうと、自動でそれ以上の品質にするのは難しいです。ImageTrueColorToPaletteは、一般には減色目的なので、品質自体が上がることはないです。アルファチャネルとか入っている画像とか重ねたときでもうまく減色できるように・・・らしいですが、うまくいかないこともあるようです。
妄想関数は私もよくやります。脳内で引数まで想像して、マニュアル探したらなかった、とか・・・w同じことを考えた誰かが作って公開してくれている、ということも稀にあるので、判断は難しいですよね。。。
>1うんなつおさん
劣化させずにリサイズするならImageMagickを使うといい。
>2オニキスさん
GDを使うならパレット指定しないのが一番いい。
あれから色々と調べましたが、やはりご回答の通りです。
どちらもベスト回答という意味での均等分配とさせて頂きます。
>#3
>同じことを考えた誰かが作って公開してくれている
なかったので、その誰かになってみようかなーと考えてます。

