2

SDLピクセルデータからImageMagick画像を生成しようとしています。これまでのGIFは次のようになります。(このGIFは、意図的に以下のGIFよりも低速です。)

http://www.starlon.net/images/combo.gif

これがどのように見えるかです。上の画像では、ピクセルが他のピクセルの上に重なっているように見えることに注意してください。

http://www.starlon.net/images/combo2.gif

ここでGIFが実際に作成されます。

void DrvSDL::WriteGif() {
    std::list<Magick::Image> gif;

    for(std::list<Magick::Blob>::iterator it = image_.begin(); it != image_.end(); it++) {
        Magick::Geometry geo(cols_ * pixels.x, rows_ * pixels.y);
        Magick::Image image(*it, geo, 32, "RGB");
        gif.push_back(image);
        LCDError("image");
    }
    for_each(gif.begin(), gif.end(), Magick::animationDelayImage(ani_speed_));
    Magick::writeImages(gif.begin(), gif.end(), gif_file_);
}

そして、ここにブロブが詰め込まれています。

image_.push_back(Magick::Blob(surface_->pixels, rows_ * pixels.y * surface_->pitch));

そして、これが私がSDLサーフェスを初期化する方法です。

surface_ = SDL_SetVideoMode(cols_ * pixels.x, rows_ * pixels.y, 32, SDL_SWSURFACE);
4

2 に答える 2

2

上の画像は通常、バッファの位置がずれていることが原因です。SDLバッファーはおそらくDWORDにアラインされておらず、ImageMagickルーチンはバッファーがDWORDにアラインされていることを期待しています。これはビットマップ処理では非常に一般的です。人気のある画像処理ライブラリ-Leadtoolsは、通常、DWORDで整列されたデータを必要とします。これは主にモノクロと32ビットカラーの場合ですが、どの色深度にも当てはまります。

あなたがする必要があるのは、SDLバッファからDWORDで整列されたビットマップを書き出す、少なくともDWORDで整列されたバッファを作成することです。

ImageMagick APIのドキュメントは、これをさらに明確にするのに役立つ場合があります。

于 2009-12-24T22:01:28.937 に答える
0

試してみたいもう1つのことは、バッファをクリアして、データがすでに存在しないことを確認することです。IMのAPIはよくわかりませんが、他のピクセルの上にオーバーレイされたピクセルは通常、バッファがダーティであることを示しています。

于 2009-12-24T22:07:36.760 に答える