通过SDL像素数据生成Magick ++动画

时间:2009-12-24 10:05:47

标签: c++ imagemagick sdl magick++

我正在尝试从ImageMagick像素数据生成SDL张图片。这是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_);
}

这就是Blob打包的地方。

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);

2 个答案:

答案 0 :(得分:2)

顶部图像通常由未对齐的缓冲区引起。 SDL缓冲区可能不是DWORD对齐的,ImageMagick例程期望缓冲区在DWORD上对齐。这在位图处理中非常常见。流行的图像处理库 - Leadtools通常需要DWORD对齐的数据。这主要是单色和32位颜色,但任何颜色深度都可以。

您需要做的是从SDL缓冲区中写出一个DWORD对齐的位图,至少创建一个DWORD对齐的缓冲区。

ImageMagick API文档可能有助于进一步澄清这一点。

答案 1 :(得分:0)

您可能想要尝试的另一件事是清除缓冲区以确保其中没有任何数据。我真的不知道IM的API,但覆盖在其他像素之上的像素通常表示脏缓冲区。