Magick ++ generación de la animación a través de los datos de píxeles SDL
-
21-09-2019 - |
Pregunta
Estoy tratando de generar imágenes ImageMagick de los datos SDL píxeles. Esto es lo que el GIF se ve como hasta ahora. (Este GIF es más lenta que la de abajo a propósito.)
http://www.starlon.net/images/combo.gif
Esto es lo que se supone que debe ser similar. Nótese en la imagen superior que los píxeles parecen estar sobrepuesto en la parte superior de otros píxeles.
http://www.starlon.net/images/combo2.gif
Aquí es donde el GIF se crea realmente.
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_);
}
Y aquí es donde está empaquetado el Blob.
image_.push_back(Magick::Blob(surface_->pixels, rows_ * pixels.y * surface_->pitch));
Y aquí es cómo inicializar la superficie SDL.
surface_ = SDL_SetVideoMode(cols_ * pixels.x, rows_ * pixels.y, 32, SDL_SWSURFACE);
Solución
La imagen superior es causado normalmente por un tampón de desalineado. El buffer de SDL es probable que no DWORD alineado y el ImageMagick rutinas esperar el búfer para alinearse en una DWORD. Esto es muy común en el procesamiento de mapa de bits. El popular biblioteca de procesamiento de imágenes - LeadTools, comúnmente, requiere datos DWORD alineado. Esto es sobre todo caso con monocromo y 32 bits de color, pero puede ser el caso para cualquier profundidad de color.
Lo que hay que hacer es escribir un mapa de bits alineados DWORD de su memoria intermedia SDL o al menos crear un búfer que está alineado DWORD.
La documentación de la API ImageMagick puede ser capaz de ayudar a aclarar más a fondo.
Otros consejos
Otra cosa que puede que desee probar es limpiar las memorias intermedias para asegurarse de que no hay ningún dato que ya están allí. Realmente no sé API de mensajería instantánea, pero píxeles superpuestos en la parte superior de otros píxeles por lo general indica un buffer sucia.