目录
任务描述
我有这样一个需求,读取一张格式为png 或者 jpeg 的图片, 保存为可以可以直接打印的大小,要求编为一个小程序。因为通常情况下图像大小如1024*512 是像素尺寸,要想打印出来是需要设置 dpi(dots per inch),意思是每英寸上有多少个点(像素)。为了打印方便还可以保存为pdf。
解决方案
magick++
magick++ 是著名开源图片处理库imagemagick提供的 c++库。在命令行可以直接使用相关 imagemagick 的命令直接完成上述任务。要是c++编程完成需要调用 magick++ 的api。
ubuntu 安装magic++库很简单:
sudo apt-get install libmagick++-dev
下面给出例程
talk is cheap, show me the code.
c++ 代码:
#include
#include
int main(int argc, char **argv)
{
magick::initializemagick(*argv);
magick::image image;
try{
image.read("./patternsboard1.png"); // read an image from directory
image.resolutionunits(magick::pixelspercentimeterresolution); // 设置分辨率单位为 像素/厘米
image.density("120x120"); // 纵、横分辨率都是 120 px/cm
image.write("./patternsboard3.pdf"); // 保存为pdf
}catch(magick::exception &erro_){
std::cout<< "caught exception:" << erro_.what() <<:endl>
return 1;
}
return 0;
}
使用 cmakelists.txt. 可以参考
project(try_magickpp)
cmake_minimum_required(version 2.8)
find_package(imagemagick components magick++)
include_directories(${imagemagick_include_dirs})
aux_source_directory(. src_list)
add_executable(${project_name} ${src_list})
target_link_libraries(${project_name} ${imagemagick_libraries})
如此,可以看到读入的图片文件保存为 pdf,并且设置的dpi,可以打印出想要的大小。
与 opencv 配合
我们有从 opencv 处理后的cv::mat ,下面提供 从cv::mat 转为 magick::image (magick++ 的image类).
cv::mat cvimage;
cvimage = cv::imread("./patternsboard1.png" ,cv::imread_grayscale);
magick::image image(cvimage.cols,cvimage.rows,"i",magickcore::charpixel, (char *)cvimage.data);
当然,如果要使用这段代码是需include opencv的头,并且需要在cmakelists.txt 中指明链接opencv的库。
相关链接
(cmake 配置magick++))
如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!