Geração de animação Magick ++ via SDL Pixel Data
-
21-09-2019 - |
Pergunta
Estou tentando gerar Imagemagick imagens de Sdl dados de pixels. Aqui está a aparência do GIF até agora. (Este gif é mais lento que o abaixo de propósito.)
http://www.starlon.net/images/combo.gif
Aqui está a aparência. Observe na imagem acima que os pixels parecem estar sobrepostos em cima de outros pixels.
http://www.starlon.net/images/combo2.gif
Aqui é onde o GIF é realmente criado.
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_);
}
E é aqui que a bolha está embalada.
image_.push_back(Magick::Blob(surface_->pixels, rows_ * pixels.y * surface_->pitch));
E eis como eu inicializo a superfície do SDL.
surface_ = SDL_SetVideoMode(cols_ * pixels.x, rows_ * pixels.y, 32, SDL_SWSURFACE);
Solução
A imagem superior é normalmente causada por um tampão desalinhado. O buffer SDL provavelmente não está alinhado e o Imagemagick As rotinas esperam que o buffer seja alinhado em um DWORD. Isso é muito comum no processamento de bitmap. A Biblioteca de Processamento de Imagens Popular - Leadtools, geralmente, requer dados alinhados do DWORD. Este é principalmente o caso com monocromático e cor de 32 bits, mas pode ser o caso de qualquer profundidade de cor.
O que você precisa fazer é escrever um bitmap alinhado do DWORD do seu buffer SDL ou Pelo menos crie um buffer que esteja alinhado.
A documentação da API ImageMagick pode ajudar a esclarecer isso ainda mais.
Outras dicas
Outra coisa que você pode querer tentar é limpar os buffers para garantir que ainda não haja dados. Eu realmente não sei a API do IM, mas os pixels sobrepostos sobre outros pixels geralmente indicam um buffer sujo.