2

我正在尝试从SDL像素数据生成ImageMagick图像。这是到目前为止 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);
4

2 回答 2

2

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

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

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

于 2009-12-24T22:01:28.937 回答
0

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

于 2009-12-24T22:07:36.760 回答