CGI-BBS > 画像処理 > ImageMagick > 減色後のGIFファイルサイズが、変に肥大してしまう現象について


(株)友林堂
(株)友林堂


質問者 ぴろぴ  投稿日 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で再保存したときのファイルサイズと
同等のモノにするにはどうしたらよいのでしょうか?

同じような現象を経験された方いらっしゃいますでしょうか?

諸先輩方、御指南いただければ幸いです。
宜しくお願いします。

プロバイダ参照:
サーバのOS:(未選択)
パソコンのOS:(未選択)
エディタ:
FTPソフト:
サーバ移転:していない
改造:(未選択)
CGI習熟度:(未選択)

質問者 ぴろぴ  [削除]  投稿日 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裏技