将较小的PNG文件组合在C 中的较大PNG文件中

Combine smaller png files in a larger png file in C++

本文关键字:PNG 文件 组合      更新时间:2023-10-16

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

尝试ImageMagick,特别是magick api。

如果您仅针对一个平台(例如Windows(,则可能有简单的解决方案不需要库。

您可以使用CIMG库。这是一个轻巧的库,由几个文件组成。主文件是 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 = width pos,y0 =行位置是原始图像中要绘制 sprite image的起始位置。

您可以尝试OpenCV

首先,您必须打开所有小文件(在此处的教程中解释(并将它们存储为cv::Mat s。所有小图像都打开后,您可以通过将它们复制到指定区域来将它们全部放在更大的图像中。

完成完成这些图像后,只需在上面的链接中使用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;
}