设置PNG图片DPI 信息,保存为PDF(使用Magick),与OpenCV转换
程序员文章站
2022-06-29 13:34:17
[toc] 任务描述 我有这样一个需求,读取一张格式为PNG 或者 Jpeg 的图片, 保存为可以可以直接打印的大小,要求编为一个小程序。因为通常情况下图像大小如1024 512 是像素尺寸,要想打印出来是需要设置 DPI(dots per inch),意思是每英寸上有多少个点(像素)。为了打印方便 ......
目录
任务描述
我有这样一个需求,读取一张格式为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 <iostream> #include <magick++.h> 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() <<std::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的库。
相关链接
magick++ api:https://www.imagemagick.org/magick++/image++.html
magick++ tutorial:https://www.imagemagick.org/magick++/tutorial/magick++_tutorial.pdf
(cmake 配置magick++))