2

C++ CxImage ライブラリに GIF を保存する際に少し問題があります。私はこれを CxImage フォーラムにも投稿しましたが、それらはかなり死んでいるように見えるので、CxImage を使用していて、この問題に遭遇した可能性がある人をここで見つけたいと思っています。

バージョン 7.01 (最新) を使用しています。

GIF を保存すると、常に 17x15 ピクセルで表示され、ほとんどのソフトウェアではこれを表示できません。(Internet Explorer、Windows Explorer、Photoshop 7.0、Irfanview)。他のソフトウェア (MSPaint、MSOffice Photo Editor、および CxImage 自体) がこの問題に対処しています。

深く掘り下げたところ、ximagif.cpp の 698 行目の CxImageGIF::EncodeRGB で発生していることがわかりました。

const int32_t cellw = 17; // <-- This is where the dimensions shown in Win Explorer come from
const int32_t cellh = 15; // <--
CxImageGIF tmp;
for (int32_t y=0;y<head.biHeight;y+=cellh){
    for (int32_t x=0;x<head.biWidth;x+=cellw){
        if ((head.biWidth -x)<cellw) w=head.biWidth -x; else w=cellw;
        if ((head.biHeight-y)<cellh) h=head.biHeight-y; else h=cellh;

        if (w!=tmp.GetWidth() || h!=tmp.GetHeight()) tmp.Create(w,h,8);

        if (IsTransparent()){
            tmp.SetTransIndex(0);
            tmp.SetPaletteColor(0,GetTransColor());
        }

        uint8_t i;
        for (uint32_t j=0;j<h;j++){
            for (uint32_t k=0;k<w;k++){
                i=(uint8_t)(1+k+cellw*j);
                tmp.SetPaletteColor(i,GetPixelColor(x+k,head.biHeight-y-h+j));
                tmp.SetPixelIndex(k,j,tmp.GetNearestIndex(tmp.GetPaletteColor(i)));
            }
        }

        tmp.SetOffset(x,y);
        tmp.EncodeExtension(fp);
        tmp.EncodeBody(fp,true);
    }
}

論理画面記述子は正しい画像サイズに設定されていますが、明らかに、画像は小さな 15x17 データ ブロックにエンコードされます。

GIF標準について私が理解していることから、これはこの方法で行うことができますが、多くのプログラムはこれを適切に理解していないようで、各ブロックがフレーム全体であると想定しています。多分私は間違っている、昨夜GIF標準についてのその部分を読んだところです

これは通常アニメーションに使用されるようで、CxImage はこのフレームのフレーム時間を正しく 0 に設定します。ただし、一部のプログラムでは、デフォルトの GIF タイムアウトを使用してブロックごとに画像を描画します。

cellw と cellh をそれぞれ head.biWidth と head.biHeight に設定して、各フレームを 1 つのブロックにエンコードするようにコードをいじってみましたが、役に立ちませんでした。以前にこの問題に遭遇した人はいますか?

CxImage を使用していなくても、GIF89a に精通している場合でも、GIF 標準の私の解釈が正しいことを確認できますか? Microsoft や Adob​​e が、標準に従って GIF 画像を適切にデコードするコードを作成しないとは信じがたいです。また、画像操作に利用できる最高の C++ ライブラリの 1 つが、GIF のような一般的なファイル形式を不適切または異常にエンコードするとは信じがたいです。

4

0 に答える 0