通过 SDL 像素数据生成 Magick++ 动画
-
21-09-2019 - |
题
我正在尝试生成 图像魔术师 图片来自 雪迪龙 像素数据。这是到目前为止 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,但是覆盖在其他像素之上的像素通常表示缓冲区脏了。
不隶属于 StackOverflow