Генерация анимации Magick ++ с использованием пиксельных данных SDL
-
21-09-2019 - |
Вопрос
Я пытаюсь генерировать Магия изображений изображения из 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.
surface_ = SDL_SetVideoMode(cols_ * pixels.x, rows_ * pixels.y, 32, SDL_SWSURFACE);
Решение
Верхнее изображение обычно возникает из-за смещенного буфера.Буфер SDL, вероятно, не выровнен по DWORD, и Магия изображений подпрограммы ожидают, что буфер будет выровнен по DWORD.Это очень распространено при обработке растровых изображений.Популярная библиотека обработки изображений Leadtools, как правило, требует данных, выровненных по DWORD.В основном это касается монохромного и 32-битного цвета, но может иметь место для любой глубины цвета.
Что вам нужно сделать, это записать растровое изображение, выровненное по DWORD, из вашего SDL-буфера или по крайней мере, создайте буфер, выровненный по DWORD.
Документация ImageMagick API может помочь прояснить это дополнительно.
Другие советы
Еще одна вещь, которую вы, возможно, захотите попробовать, - это очистить буферы, чтобы убедиться, что там уже нет никаких данных.Я действительно не знаю API IM, но пиксели, наложенные поверх других пикселей, обычно указывают на загрязненный буфер.