![]() |
カレッヂ |
質問者 ぴろぴ
投稿日 11/29(土) 12:43:07
ImageMagickで、ICON画像を自動作成しようとしていますが GIF保存の際に、変な現象にぶちあたってしまいました。。。 以下、具体例になります。 ある画像(320*320pix 256colors PNG形式)を読込み、 リサイズ(33*33pix)後、32colors に減色(quantize)。 それをGIF形式で保存すると1.5k位のファイルが出来上がる。 予測よりも遥かに出力されたファイルサイズが大きいので、 これを、PHOTOSHOPで読込み、32colorsのまま(パレットは弄らない) で再保存すると、ファイルサイズが 0.5k以下になる。 最後を、JPEG保存にすると、逆にPHOTOSHOPよりも小さいものが出来る傾向 にあるようです。(同一のquality設定で) ImageMagickで『減色 & GIF保存』の際に、 余計なリソース(?)等が付加されてしまうようなことはないのでしょうか? IMAGEMAGIKからの最終出力をPHOTOSHOPで再保存したときのファイルサイズと 同等のモノにするにはどうしたらよいのでしょうか? 同じような現象を経験された方いらっしゃいますでしょうか? 諸先輩方、御指南いただければ幸いです。 宜しくお願いします。
プロバイダ参照: |
質問者 ぴろぴ
[削除]
投稿日 11/29(土) 12:58:21
自己レスです^^; どうやら、現行のIMAGEMAGIKはLZW圧縮に非対応(?)のようなので PHOTOSHOPで作成するGIFよりも IMAGEMAGIKで作成するGIFが大きくなるのは "LZW非圧縮" 故に当然の結果のようです。 GIF-LZWライセンスの切れる来年までは jpeg保存でやり過ごすしかないようですね。。。 GDならLZW圧縮のGIFが生成出来るんでしょうか。。。? |
回答者 1円切手
[削除]
投稿日 2004/1/9(金) 16:17:05
> GDならLZW圧縮のGIFが生成出来るんでしょうか。。。? GD もライセンスを持っているなら、圧縮できるライブラリを作成するように指定して 圧縮可能なライブラリを作成し使用することが可能です。 ライセンスが無くても、コンパイル、実行できますが 訴えられる可能性もあるでしょう。 # ImageMagick も同じ |
回答者 灰田
[削除]
投稿日 2004/1/15(木) 12:31:32
ぴろぴ 様 はじめまして。同じようなトラブルで悩んでいて、 情報を探していたところこのページにたどり着きました。 ImageMagick でファイルサイズが妙に大きくなる現象ですが、 LZW 圧縮のせいなのでしょうか? そちらでは gif ファイルが 肥大化するとのことですが、こちらでは jpeg -> png 変換で 出力された png ファイルが妙に大きくなってしまいます。 ImageMagick 以外で処理すると小さくなるので今はそれで回避していますが 周知のとおり png ファイルは LZW を利用していないため、 LZW 圧縮の問題というより ImageMagick の問題な気がします。 参考までに、 こちらのOSの種類とImageMagickのバージョンです。 OS:FreeBSD 5.1-Release ImageMagick: 5.5.7-11 portsからインストール 私の回避策: > pngtogd from.png temp.gd && gdtopng temp.gd from.png && rm temp.gd -- haida http://site.homedns.org/ |
回答者 1円切手
[削除]
投稿日 2004/1/15(木) 18:43:48
> 肥大化するとのことですが、こちらでは jpeg -> png 変換で > 出力された png ファイルが妙に大きくなってしまいます。 試してみました。 % wget http://www.birdy.co.jp/sakuma-nobuko/o2004.1.5.jpg --18:31:40-- http://www.birdy.co.jp/sakuma-nobuko/o2004.1.5.jpg => `o2004.1.5.jpg' Connecting to proxy.example.co.jp:8080... connected! Proxy request sent, awaiting response... 200 OK Length: 141,885 [image/jpeg] 0K .......... .......... .......... .......... .......... 36% @ 714.29 KB/s 50K .......... .......... .......... .......... .......... 72% @ 877.19 KB/s 100K .......... .......... .......... ........ 100% @ 410.21 KB/s 18:31:41 (624.14 KB/s) - `o2004.1.5.jpg' saved [141885/141885] % convert -quality 100 o2004.1.5.jpg o2004.1.5.IMagick.png % pngtogd o2004.1.5.IMagick.png o2004.1.5.gd % gdtopng o2004.1.5.gd o2004.1.5.gd.png % ls -l o2004.1.5.IMagick.png o2004.1.5.gd o2004.1.5.gd.png o2004.1.5.jpg -rw-r--r-- 1 ossan ossan 988836 Jan 15 18:32 o2004.1.5.IMagick.png -rw-r--r-- 1 ossan ossan 2410823 Jan 15 18:32 o2004.1.5.gd -rw-r--r-- 1 ossan ossan 1015930 Jan 15 18:32 o2004.1.5.gd.png -rw-r--r-- 1 ossan ossan 141885 Jan 5 13:28 o2004.1.5.jpg jpeg ==[ImakeMagick]==> png (966k) png ==[gd]==> gd (2.3M) ==[gd]==> png (992k) 手元では ImageMagick の方が小さくなっているようです。 |
回答者 1円切手
[削除]
投稿日 2004/1/15(木) 19:15:48
仲村です(FreeBSD な方のようなので名前の方が分かるかも) 私の環境を書き忘れました。 FreeBSD 5.1-RELEASE-p11 i386 ImageMagick-5.5.7.14 (12/18/03 Q16)(ports) gd-2.0.15_1,1 (ports) です。 |
回答者 灰田
[削除]
投稿日 2004/1/15(木) 23:16:04
仲村さん 返信ありがとうございます。 残念ながら、初めて伺うお名前でした。 よろしくお願いします。 ところで、よく読み返してみましたが、ぴろぴさんの問題とは 微妙に違うような感じがしてきました。。 GIF は LZW 圧縮がかかっているかいないかはファイルサイズに影響しますしね…。 勝手で申し訳ありませんが、以下はimagemagickのファイル肥大について述べます。 仲村さんの手順を追って処理したところ 正常に(肥大化せず)処理が完了しました。 ところが、やはりこちらのプログラムではトラブっています。 当方の処理を説明しますと、PerlMagick で JPEGやPNGなどの画像から 一部を切り出し、減色、正規化して png 形式で出力します。 このとき新しく生成されたpngファイルが、肥大化しています。 その場合、pngtogd -> gdtopng の変換結果は以下のようになります。 リンク先の画像( dame.png ) http://site.homedns.org/~kazh/cgi-bin/image.cgi?c6f636d32696e607f647e246164716f24616d656e207e676 > pngtogd dame.png hoge.gd > gdtopng hoge.gd dame2.png > ll total 102 -rw-r--r-- 1 kazh kazh 73857 Jan 15 22:17 dame.png -rw-r--r-- 1 kazh kazh 3067 Jan 15 22:32 dame2.png -rw-r--r-- 1 kazh kazh 23437 Jan 15 22:32 hoge.gd それで、 gif(LZW)ファイルで出力して giftogd2 -> gd2togif もやってみたんですが、 ここもファイルサイズに差がついてしまいました。 > giftogd2 from.gif temp.gd2 128 2 > gd2togif temp.gd2 to.gif > ll total 24 -rw-r--r-- 1 www www 12697 Jan 15 22:56 from.gif -rw-r--r-- 1 kazh www 2457 Jan 15 23:12 temp.gd2 -rw-r--r-- 1 kazh www 5007 Jan 15 23:12 to.gif 元ファイルにゴミが付いているように思えるのですが、 取りあえず ImageMagick のバージョンがあがっているようですので、 新しいのを入れて、同じプログラムを実行してみます。 |
回答者 1円切手
[削除]
投稿日 2004/1/16(金) 00:31:34
とりあえず気づいたところだけ。 > convert -quality 100 -verbose dame.png dame3.png > ls -l dame* -rw-r--r-- 1 ossan ossan 73857 Jan 15 23:33 dame.png <== ダウンロードしたファイル -rw-r--r-- 1 ossan ossan 3067 Jan 15 23:34 dame2.png <== gd で変換したファイル -rw-r--r-- 1 ossan ossan 73844 Jan 15 23:40 dame3.png <== 手元の ImageMagick で変換したファイル (-quality 100 付き) > identify dame* dame.png PNG 140x160+110+156 PseudoClass 4c 8-bit 72.1kb 0.203u 0:01 dame2.png[1] PNG 140x160+0+0 PseudoClass 4c 8-bit 3.0kb 0.023u 0:01 dame3.png[2] PNG 140x160+110+156 PseudoClass 4c 8-bit 72.1kb 0.195u 0:01 ここで気づくのは、identifyの結果が gdでは「+0+0」に対して ImageMagick では「+110+156」となっていること。 多分、切り出し前の画像からのオフセットだと思います。 ==> こういうのは初めて見るので想像ですが、表示領域は指定されているけど、 ファイルには全体の画像のデータが残っている状態なんでは無いでしょうか。 で、どうやって要らない部分を消すのか...調べてみます(^^; # gimp 1.2 for win で見るとバグなのか、オフセットされずに表示されます(^^; |
回答者 1円切手
[削除]
投稿日 2004/1/16(金) 01:51:31
良く分からないので、perl で書いてみました (o2004.1.5.jpg は、上で wget したもの) > cat Conv.pl #!/usr/local/bin/perl -Tw use strict; use Image::Magick; my $image = Image::Magick->new; $image->Read('o2004.1.5.jpg'); $image->Crop(geometry=>'94x70+295+510'); $image->Write(filename=>'o2004.1.5.PMagick.png', quality=>'100'); > pngtogd o2004.1.5.PMagick.png o2004.1.5.PMagick.gd > gdtopng o2004.1.5.PMagick.gd o2004.1.5.PMagick.gd.png > ls -ltr o2004.1.5.P* -rw-r--r-- 1 ossan ossan 10931 Jan 16 00:55 o2004.1.5.PMagick.png <== PerlMagick -rw-r--r-- 1 ossan ossan 26331 Jan 16 00:55 o2004.1.5.PMagick.gd -rw-r--r-- 1 ossan ossan 11089 Jan 16 00:55 o2004.1.5.PMagick.gd.png <== GD う〜ん、やっぱり PerlMagick の方が小さいのですが??? > identify o2004.1.5.PMagick.png o2004.1.5.PMagick.gd.png o2004.1.5.PMagick.png PNG 94x70+295+510 DirectClass 8-bit 10.7kb 0.031u 0:01 o2004.1.5.PMagick.gd.png[1] PNG 94x70+0+0 DirectClass 8-bit 10.8kb 0.016u 0:01 オフセットは残っているみたいですねぇ... で、灰田さんのファイルをもう一度見てみると > identify -verbose dame.png | grep -i profile Found a generic profile, type APP1 Profile-APP1: 64654 bytes なんか、プロファイルとかいうのが 64kほど付いてきてますね。(デジカメで撮ると付いてくることが多いようです) my $image->Read('dame.png'); $image->Profile(); $image->Write(filename=>'dame.PMagickXX.png', quality=>'100'); で、 > ls -l dame* -rw-r--r-- 1 ossan ossan 73857 Jan 15 23:33 dame.png <== 灰田さんのファイル -rw-r--r-- 1 ossan ossan 3067 Jan 15 23:34 dame2.png <== GD で変換 -rw-r--r-- 1 ossan ossan 3112 Jan 16 01:43 dame.PMagickXX.png <== PerlMagick で Profile() したファイル ちょっと大きいですが、これなら許容範囲ではないでしょうか。 |
回答者 灰田
[削除]
投稿日 2004/1/16(金) 03:34:51
完璧です!! identify と profile なるコマンドが大切だったんですね〜。 勉強になりました。 ほんの気持ちですが、花の写真を贈ります。 よろしければお持ち下さい。 http://site.homedns.org/~kazh/cgi-bin/image.cgi?c6f636d3478616e6b637e23c7e2ccb4a5b4a3ff213037343139303438323f536f637d6f637e207e676 ありがとうございました! |
回答者 1円切手
[削除]
投稿日 2004/1/16(金) 04:27:26
> identify と profile なるコマンドが大切だったんですね〜。 Profile は本当はプロファイルを設定する関数なんですが、引数が無いと Profile を消すという副作用があるらしいです。 最初、マニュアルを見ると $image->Write(filename=>'xxx',Strip) で、消えそうに 思ったんですが、駄目でした... > ほんの気持ちですが、花の写真を贈ります。 おぉ、自動的に壁紙を差し替えるようにしているので、それに追加せていただきますm(_o_)m |
回答者 灰田
[削除]
投稿日 2004/1/16(金) 04:50:50
ですよね!なんか Strip は 5.5.7には実装されていないみたいで。 Strip()を書いたらエラーになってしまって…。 代用に Profile() を使えるらしい、とのことで http://www.imagemagick.org/www/perl.html にあるマニュアルを見ると > add or remove ICC or IPTC image profile; > name is formal name (e.g. ICC or filename; > set profile to undef to remove profile と書いてあって、素直に $image->Profile( profile=>"undef" ); とまでは書いたんですけどね(>_<) エラーでした。 いやー。情けない。 でも Profile() でできるなら確かに Strip() も不要な感じですね〜。 携帯で画像を見たいなぁと思って、いろいろ試行錯誤してたんです。 データ容量は¥にも直結するので…よかったよかった。^^ |
回答者 rescue
[削除]
投稿日 2004/1/28(水) 13:46:44
お世話になっております。あることの原因を探るためにGoogleでいろいろ文献を 探していたらこの記事が検索にひっかかり、見てみたら技の裏だったので びっくりしました。身近に貴重な資料があったとは…。profileについては 私も悩んでいたことだったので、大変参考になりました。直接関係ないのかも しれませんが、何か同様の理由で解決できることがあればと思って、 新規質問を書きました。 http://www.rescue.ne.jp/CGI-BBS/image/magic/20040128134313.shtml もし理由が分かれば上記のページで教えていただければ幸いです。 |
返信(回答)する
Web裏技 |