【问题标题】:Magick++ animation generation via SDL pixel data通过 SDL 像素数据生成 Magick++ 动画
【发布时间】:2009-12-24 10:05:46
【问题描述】:

我正在尝试从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);

【问题讨论】:

    标签: c++ imagemagick sdl magick++


    【解决方案1】:

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

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

    ImageMagick API 文档可能有助于进一步阐明这一点。

    【讨论】:

    • “双字对齐”是什么意思?
    • 没关系。我想到了。格式需要是 RAW 而不是 RGB。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-09-22
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多