Генерация анимации Magick++ с использованием пиксельных данных SDL

Я пытаюсь создать изображения 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_);
}

И вот где упакован 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);

person Scott    schedule 24.12.2009    source источник


Ответы (2)


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

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

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

person Community    schedule 24.12.2009
comment
Что вы подразумеваете под выравниванием по DWORD? - person Scott; 25.12.2009
comment
Не берите в голову. Я понял. Формат должен быть RAW вместо RGB. - person Scott; 25.12.2009

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

person Blindy    schedule 24.12.2009