如何使用ImageMagick++设置GIF动图各帧之间的毫秒间隔
ImageMagick C++ 生成GIF调整播放速度解决方案
要调整GIF播放速度,只需要给每一个Magick::Image帧对象设置animationDelay属性即可,该属性的单位为1/100秒,数值越大帧间隔越长、GIF播放速度越慢。
你之前生成的GIF播放过快,是因为没有主动设置animationDelay,ImageMagick默认使用极小的间隔值,因此会出现快进的效果。
代码修改方案
你可以直接在生成帧列表的循环中统一设置间隔,调整后的代码如下:
std::vector<Magick::Image> listOfImages; for (QImage &image:m_listOfImages) { qDebug()<< image.size(); Magick::Image magickImg = QImageToImage(image); // 示例设置为每帧间隔100ms,可根据需求调整数值:如要500ms间隔填50,1秒间隔填100 magickImg.animationDelay(10); listOfImages.push_back(magickImg); } // 可选配置:设置GIF无限循环播放,0代表无限循环,填正整数则对应循环次数 if (!listOfImages.empty()) { listOfImages[0].animationIterations(0); } qDebug()<< listOfImages.size(); QString gifName=QDateTime::currentDateTime().toString(QStringLiteral("hh-mm-ss"))+".gif"; Magick::writeImages(listOfImages.begin(), listOfImages.end(), gifName.toStdString()); qDebug()<< "Done";
如果希望在转换图像时直接配置间隔,也可以修改QImageToImage函数,在返回图像前添加配置即可:
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(); } // 在这里设置每帧的间隔时长 newImage.animationDelay(10); return newImage; }
内容的提问来源于stack exchange,提问作者user10609288
相关产品推荐
相关产品推荐

