我正在尝试生成 图像魔术师 图片来自 雪迪龙 像素数据。这是到目前为止 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);
有帮助吗?

解决方案

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

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

ImageMagick API 文档可能能够帮助进一步阐明这一点。

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top