<2022-05-21 周六>
GraphicsMagick
与boost.gil
的性能比较
粗略对比了一下GraphicsMagick
和boost.gil
缩小同一张图片的性能,做到心中有数。
GraphicsMagick
的代码:
// IMDisplayView.cpp:216
void CIMDisplayView::OnHalfsize()
{
auto beg = std::chrono::steady_clock::now();
Geometry half(50, 50);
half.percent(true);
ScaleImage(half);
auto end = std::chrono::steady_clock::now();
double val = std::chrono::duration<double, std::milli>(end - beg).count();
char log[1024] = { 0 };
sprintf(log, "%fms", val);
OutputDebugStringA(log);
}
boost.gil
的代码:
#pragma once
#include <chrono>
#include <iostream>
//
// Copyright 2005-2007 Adobe Systems Incorporated
//
// Distributed under the Boost Software License, Version 1.0
// See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt
//
#include <boost/gil.hpp>
#include <boost/gil/extension/io/jpeg.hpp>
#include <boost/gil/extension/numeric/sampler.hpp>
#include <boost/gil/extension/numeric/resample.hpp>
// Example for resize_view() in the numeric extension
void t_resize()
{
namespace bg = boost::gil;
bg::rgb8_image_t img;
bg::read_image("test.jpg", img, bg::jpeg_tag{});
// test resize_view
// Scale the image to 960x540 pixels using bilinear resampling
auto beg = std::chrono::steady_clock::now();
bg::rgb8_image_t tohalf(960, 540);
bg::resize_view(bg::const_view(img), bg::view(tohalf), bg::bilinear_sampler{});
auto end = std::chrono::steady_clock::now();
std::cout << std::chrono::duration<double, std::milli>(end - beg).count() << "ms\n";
bg::write_view("out-resize.jpg", bg::const_view(tohalf), bg::jpeg_tag{});
}
因为用的是IMDisplay.exe
工具,所以为了公平起见,boost.gil
的读图和写图的磁盘操作不计算时间,同时注意必须使用release
版本,因为boost.gil
的debug
版本比release
版本慢几个数量级。
GraphicsMagick.ScaleImage() | boost.gil |
---|---|
27.71ms | 17.59ms |
27.42ms | 16.36ms |
27.81ms | 15.18ms |
26.11ms | 19.17ms |
可以看出boost.gil
的性能比GraphicsMagick
最快的ScaleImage()
函数还要快。