ImageMagick 将 jpg 图像转换为 gif 速度慢
ImageMagick convert jpg images to gif slow
我正在使用 Magick++(IM 7.0.3 platform:CentOS Linux 7.0 版) 将图像转换为 gif。我从文件创建图像对象,问题是当我将 9 个 png 文件(每个 50kb)转换为 gif 时,它只需要 50 毫秒。但是当它变成 9 个 jpg 文件(每个 20kb)时,它需要 1900ms。背后的原因是什么?如何使用 jpg 文件使其更快?
for(int i = 2; i < argc-1; i++)
{
// I pass the file path from command line
cout << argv[i] << endl;
Image img(argv[i]);
img.animationDelay(delay);
img.magick("GIF");
frames.push_back(img);
}
long mergestart = getCurrentTime();
Magick::Blob tmpBlob;
Magick::writeImages(frames.begin(), frames.end(), &tmpBlob);
我猜测 PNG 文件要么是调色板要么包含相对较少的颜色,而 JPEG 文件将有数千种颜色,因此 ImageMagick 将被迫做更多的事情努力减少和优化 GIF 可以包含的相对较小的 256 色调色板的颜色。
通过运行检查我对你的文件的理论:
identify -verbose Any.PNG
和
identify -verbose Any.JPG
并查看 Number of colours
。
或者,您可以使用此命令来计算颜色:
identify -format %k AnyImage.png
如果因为要处理数以千计的文件而想让它更快,可以使用多线程,或类似 GNU Parallel 的方法来同时完成更多工作。
我正在使用 Magick++(IM 7.0.3 platform:CentOS Linux 7.0 版) 将图像转换为 gif。我从文件创建图像对象,问题是当我将 9 个 png 文件(每个 50kb)转换为 gif 时,它只需要 50 毫秒。但是当它变成 9 个 jpg 文件(每个 20kb)时,它需要 1900ms。背后的原因是什么?如何使用 jpg 文件使其更快?
for(int i = 2; i < argc-1; i++)
{
// I pass the file path from command line
cout << argv[i] << endl;
Image img(argv[i]);
img.animationDelay(delay);
img.magick("GIF");
frames.push_back(img);
}
long mergestart = getCurrentTime();
Magick::Blob tmpBlob;
Magick::writeImages(frames.begin(), frames.end(), &tmpBlob);
我猜测 PNG 文件要么是调色板要么包含相对较少的颜色,而 JPEG 文件将有数千种颜色,因此 ImageMagick 将被迫做更多的事情努力减少和优化 GIF 可以包含的相对较小的 256 色调色板的颜色。
通过运行检查我对你的文件的理论:
identify -verbose Any.PNG
和
identify -verbose Any.JPG
并查看 Number of colours
。
或者,您可以使用此命令来计算颜色:
identify -format %k AnyImage.png
如果因为要处理数以千计的文件而想让它更快,可以使用多线程,或类似 GNU Parallel 的方法来同时完成更多工作。