欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

设置PNG图片DPI 信息,保存为PDF(使用Magick),与OpenCV转换

程序员文章站 2023-11-17 22:47:52
[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的库。

相关链接


  1. (cmake 配置magick++))