Создание анимации Magick ++ с использованием данных пикселей SDL - PullRequest
2 голосов
/ 24 декабря 2009

Я пытаюсь сгенерировать 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_);
}

А вот где находится большая капля.

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 ]

2 голосов
/ 25 декабря 2009

Верхнее изображение обычно вызывается неправильным выравниванием буфера. Буфер SDL, вероятно, не выровнен по DWORD, а подпрограммы ImageMagick ожидают, что буфер будет выровнен по DWORD. Это очень распространено в обработке растровых изображений. Популярная библиотека обработки изображений - Leadtools, как правило, требует данных, выровненных по DWORD. Это в основном относится к монохромному и 32-битному цветам, но может применяться к любой глубине цвета.

Что вам нужно сделать, это вывести выровненное по DWORD растровое изображение из буфера SDL или по крайней мере создать буфер, выровненный по DWORD.

Документация по ImageMagick API может помочь прояснить это.

0 голосов
/ 25 декабря 2009

Еще одна вещь, которую вы можете попробовать, это очистить буферы, чтобы убедиться, что там нет никаких данных. Я действительно не знаю API IM, но пиксели, наложенные поверх других пикселей, обычно указывают на грязный буфер.

...