es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo establecer un intervalo en milisegundos entre los cuadros de un gif con Imagemagick++

Creando un Gif utilizando ImageMagick 6.9.7.4.

Convierto un vector de QImage en un tipo de imagen de ImageMagick y creo un gif utilizando el método estático. Pero el gif resultante es muy rápido, ¿cómo puedo establecer un intervalo entre los cuadros o hacer que el gif sea más lento?

std::vector listOfImages;
for (QImage &image:m_listOfImages)
{
qDebug()<< image.size();
{
listOfImages.push_back(QImageToImage(image));
}
}
qDebug()<< listOfImages.size();
QString gifName=QDateTime::currentDateTime().toString(QStringLiteral(“hh-mm-ss”))+”.gif”;
Magick::writeImages(listOfImages.begin(), listOfImages.end(), gifName.toStdString());
qDebug()<< “Hecho”;

y QImage a Magick::Image

Magick::Image DspPresenter::QImageToImage(QImage &qimage)
{
qDebug() << “toImage:” << qimage.width() << qimage.height();

const Magick::Geometry geometry(qimage.width(), qimage.height());
const Magick::ColorRGB color(0.5, 0.2, 0.3);
Magick::Image newImage(geometry, color);
double scale = 1 / 256.0;
newImage.modifyImage();
Magick::PixelPacket  *pixels;
Magick::ColorRGB mgc;
for (int y = 0; y < qimage.height(); ++y)
{
    pixels = newImage.setPixels(0, y, newImage.columns(), 1);
    for (int x = 0; x < qimage.width(); ++x)
    {
        QColor pix = qimage.pixel(x, y);
        mgc.red(scale *pix.red());
        mgc.green(scale *pix.green());
        mgc.blue(scale *pix.blue());
        *pixels++ = mgc;
    }
    newImage.syncPixels();
}
return newImage;

}

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para agregar un intervalo entre los marcos en el gif resultante, debes establecer el tiempo de retraso para cada marco. Puedes hacer esto creando un vector de tiempos de retraso, donde cada valor corresponde al tiempo de retraso para cada marco en el vector listOfImages.

    Aquí está el código actualizado para establecer un tiempo de retraso de 100 ms para cada marco:

    std::vector<magick::image> listOfImages;
    std::vector<int> delayTimes;
    
    for (QImage &image : m_listOfImages)
    {
        qDebug() << image.size();
        listOfImages.push_back(QImageToImage(image));
        delayTimes.push_back(100); // 100 ms de tiempo de retraso para cada marco
    }
    
    qDebug() << listOfImages.size();
    
    QString gifName = QDateTime::currentDateTime().toString(QStringLiteral("hh-mm-ss")) + ".gif";
    
    // Establece el tiempo de retraso para cada marco antes de escribir las imágenes
    for (int i = 0; i < listOfImages.size(); i++)
    {
        listOfImages[i].animationDelay(delayTimes[i]);
    }
    
    Magick::writeImages(listOfImages.begin(), listOfImages.end(), gifName.toStdString());
    
    qDebug() << "Listo";
    

    En el bucle for que crea el vector listOfImages, también agregamos tiempos de retraso para cada marco al vector delayTimes. Luego, antes de escribir las imágenes para crear el gif, establecemos el tiempo de retraso para cada marco utilizando el método animationDelay de Magick::Image.

    Esto debería resultar en un gif más lento con un tiempo de retraso de 100 ms entre los marcos. Ajusta el tiempo de retraso a tu preferencia.

Comments are closed.