在C ++中用较大的png文件组合较小的png文件

时间:2017-04-18 06:13:58

标签: c++ png

我有一堆已知大小的png图像,它们是较大图像的一部分。我知道要放置图像的位置来构建整个图像,即我知道每个子图像的左上角坐标。如何在C ++中构建更大的图像?有没有可以为我做这个的图书馆?任何示例代码的链接也都很棒。

3 个答案:

答案 0 :(得分:0)

尝试ImageMagick,特别是Magick++ API。

如果您只定位一个平台(比如Windows),可能会有一些不需要库的简单解决方案。

答案 1 :(得分:0)

您可以使用The CImg Library。它是一个轻量级的库,由几个文件组成。主文件是 CImg.h

draw_image 功能可以在当前图像上绘制另一个图像 - 这正是您所需要的。

以下是声明:

template<typename T>
struct CImg {
// ..... other code

//! Draw an image \overloading.
template<typename t>
CImg<T>& draw_image(const int x0, const int y0, const CImg<t>& sprite, const float opacity=1);

// ..... other code
};

(x0 =宽度pos,y0 =行位置是原始图像中要绘制精灵图像的起始位置。

答案 2 :(得分:0)

您可以尝试OpenCV

首先,您必须打开所有小文件(解释为S2931)并将其存储为cv::Mat。打开所有小图像后,通过将它们复制到指定区域,可以将它们全部放在一起形成更大的图像。

当您完成这些图片放在一起时,只需使用上面链接中的imwrite将新图像保存到png文件中。

示例代码将图像水平放置在一起的位置(因此最大行数):

#include <cv.h>
#include <highgui.h>
#include <opencv2/opencv.hpp>

int main(int argc, char *argv[])
{
    // check if arguments were given correctly
    cv::Mat img1 = cv::imread(argv[1]);
    cv::Mat img2 = cv::imread(argv[2]);
    // load more images if necessary
    // If images have alpha channel then use CV_8UC4
    cv::Mat whole = cv::Mat((img1.rows<img2.rows?img2.rows:img1.rows), img1.cols+img2.cols, CV_8UC3);
    img1.copyTo(whole(cv::Rect(0, 0, img1.cols, img1.rows)));
    img2.copyTo(whole(cv::Rect(img1.cols, 0, img2.cols, img2.rows)));
    // add more images if necessary
    imwrite("whole.png", whole);
    return 0;

}