c++语言如何将一张bmp图片贴到另一张bmp图片中

在c++语言中,如何将一张bmp图片贴到另一张bmp图片中?
或者如何将一张bmp的数据导入正在绘制的bmp图片的数组中,最后导出新的bmp图片?

BMP文件保存的是原始RGB像素,可以不用任何图像处理的库,示例代码如下

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

typedef struct _bmp_image{
    int width;
    int height;
    int pixellen; //像素长度
    int datalen; //文件长度    
    uint8_t* pixel; //像素
    uint8_t* data; //文件内容    
}bmp_image;

//加载bmp图像
bmp_image* load_bmp_image(const char* filename){
    int memsz, filesz;
    bmp_image* img = NULL;    
    FILE* f = fopen(filename, "rb");
    if(!f)return NULL;    
    fseek(f, 0, SEEK_END);    
    filesz = ftell(f);
    rewind(f);
    memsz = sizeof(bmp_image) + filesz;
    img = (bmp_image*)malloc(memsz);
    if(!img){fclose(f);return NULL;}
    img->data = (uint8_t*)img + sizeof(bmp_image);
    img->datalen = filesz;
    fread(img->data, 1, img->datalen, f);
    fclose(f);
    img->width = *(uint32_t*)(img->data + 18);
    img->height = *(uint32_t*)(img->data + 22);
    img->pixel = img->data + *(uint32_t*)(img->data + 10);
    img->pixellen = *(uint32_t*)(img->data + 2) - *(uint32_t*)(img->data + 10);
    return img;    
}

//保存bmp图像
int save_bmp_image(const bmp_image* img, const char* filename){
    FILE* f = fopen(filename, "wb");
    if(!f)return -1;
    fwrite(img->data, 1, img->datalen, f);
    fclose(f);
    return 0;
}

//图像合并 (目标大图像, 小图像, x, y)(小图像不能超出大图像范围)
void merge_bmp_image(bmp_image* dst, const bmp_image* src, int x, int y){
    int i, maxh, maxw, dstx, dsty;
    uint8_t* ptr;    
    int dstlinew = dst->pixellen / dst->height;
    int srclinew = src->pixellen / src->height;
    dstx = x;
    dsty = dst->height - y - src->height;
    maxw = src->width;
    maxh = src->height;
    ptr = dst->pixel + dsty * dstlinew;
    for (i = 0; i < maxh; i++){
        memcpy(ptr + dstx * 3, src->pixel + srclinew * i, maxw * 3);
        ptr += dstlinew;        
    }    
}

int main(){
    //将logo.bmp合并到background.bmp上,位置为100,50,保存为new.bmp
    bmp_image* background = load_bmp_image("background.bmp");
    bmp_image* logo = load_bmp_image("logo.bmp");    
    merge_bmp_image(background, logo, 100, 50);
    save_bmp_image(background, "new.bmp");
    return 0;
}

c++也有opencv库,操作图片就是小菜,这个也许能帮到你
https://www.cnblogs.com/horacle/p/13167749.html

望采纳!!!

参考这篇文章:https://blog.csdn.net/elloop/article/details/50458613

下面是一个使用 OpenCV 的简单示例:

#include <opencv2/opencv.hpp>

int main() {
    cv::Mat img1 = cv::imread("img1.bmp");
    cv::Mat img2 = cv::imread("img2.bmp");

    cv::Mat img3 = img1.clone();
    cv::Rect roi(100, 100, img2.cols, img2.rows);
    img2.copyTo(img3(roi));

    cv::imwrite("img3.bmp", img3);
    return 0;
}

上面的代码将 img2.bmp 放到 img1.bmp 的 (100, 100) 坐标处,最后将结果保存为 img3.bmp。


如果要在绘制 BMP 图片时使用数组,可以使用 OpenCV 的 cv::Mat 类型来读取和保存 BMP 图片,并使用其中的 data 指针来访问图像数据。

示例代码如下:

#include <opencv2/opencv.hpp>

int main() {
    cv::Mat img1 = cv::imread("img1.bmp", cv::IMREAD_COLOR);
    cv::Mat img2 = cv::imread("img2.bmp", cv::IMREAD_COLOR);

    // 访问像素数据
    for (int y = 0; y < img1.rows; ++y) {
        for (int x = 0; x < img1.cols; ++x) {
            cv::Vec3b &pixel1 = img1.at<cv::Vec3b>(y, x);
            cv::Vec3b &pixel2 = img2.at<cv::Vec3b>(y, x);
            pixel1 = pixel1 * 0.7 + pixel2 * 0.3;
        }
    }

    cv::imwrite("img3.bmp", img1);
    return 0;
}

上面的代码将 img1.bmp 和 img2.bmp 合并为 img3.bmp。

使用opencv的rect框出一个范围即你要贴的范围,范围大小就定为贴入图的长宽,然后将要贴入图的数据拷贝到待贴入图的此范围内。

想要实现图片的合并、蒙版等操作,建议你配置opencv库来实现,这是配置教程
实例演示,将四张图合并在一起进行输出,代码如下,请做参考:
若有帮助,还望采纳,点击回答右侧采纳即可。

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>//图像融合
#include <opencv2/xfeatures2d.hpp>//拼接算法
#include <opencv2/calib3d.hpp>
#include <opencv2/imgproc.hpp>
 
using namespace std;
using namespace cv;
using namespace cv::xfeatures2d;
 
void example()
{
    Mat img1 = imread("D:/img/b1.png");
    Mat img2 = imread("D:/img/b2.png");
    Mat img3 = imread("D:/img/b3.png");
    Mat img4 = imread("D:/img/b4.png");
 
    imshow("img1",img1);
    imshow("img2",img2);
    imshow("img3",img3);
    imshow("img4",img4);
 
    //带顺序容器vector
    vector<Mat>images;
    images.push_back(img1);
    images.push_back(img2);
    images.push_back(img3);
    images.push_back(img4);
 
    //用来保存最终拼接图
    Mat result;
 
    //false 不使用GPU加速
    Stitcher sti = Stitcher::createDefault(false);
    //将向量容器中所有的图片按照顺序进行拼接,结果保存在result中
    Stitcher::Status sta = sti.stitch(images,result);
 
    if(sta != Stitcher::OK)
    {
        cout<<"canot Stitcher"<<endl;
    }
 
    imshow("result",result);
 
    waitKey(0);
}
 
int main()
{
    example();
    return 0;
}

在 C 语言中将一张 BMP 图片贴到另一张 BMP 图片中,需要进行如下步骤:

使用读入函数(例如 fread())读取两张图片的位图数据。

使用双重循环遍历两张图片的位图数据。

在遍历过程中,对两张图片进行像素值运算(例如加法、减法等),将第一张图片的像素值贴到第二张图片的对应位置上。

使用写入函数(例如 fwrite())将处理后的图片数据写入新的文件中。

最后释放已申请的内存,关闭文件。

请注意,这只是一个简单的示例。具体的实现还需要考虑文件头的处理,错误处理等。

在 C++ 中,可以使用 C++ 标准库中的文件流读取 BMP 图片文件的数据,然后将其合并到另一张 BMP 图片的数据中。

首先,使用 ifstream 读取第一张 BMP 图片的数据,读取的数据可以存储在 vector 中。然后使用 ifstream 读取第二张 BMP 图片的数据,并将其存储在另一个 vector 中。

然后,可以使用 vector 的 insert 函数将第一张图片的数据插入到第二张图片的数据中,这样就可以将两张图片合并在一起了。

最后,使用 ofstream 将合并后的数据写入新的 BMP 图片文件中。

你需要注意的是,在合并图片之前需要对图片的格式和大小进行检查,确保它们是兼容的。

代码示例:


#include <fstream>
#include <vector>

using namespace std;

int main() {
    // Open the two BMP files
    ifstream bmp1("image1.bmp", ios::binary);
    ifstream bmp2("image2.bmp", ios::binary);

    // Read the data from the first image into a vector
    vector<char> data1((istreambuf_iterator<char>(bmp1)),
                       istreambuf_iterator<char>());

    // Read the data from the second image into another vector
    vector<char> data2((istreambuf_iterator<char>(bmp2)),
                       istreambuf_iterator<char>());

    // Append the data from the first image to the second image
    data2.insert(data2.end(), data1.begin(), data1.end());

    // Open the output file
    ofstream out("output.bmp", ios::binary);

    // Write the combined data to the output file
    out.write(data2.data(), data2.size());

    return 0;
}

注意:上述代码仅作为示例,可能需要根据具体情况进行修改以符合您的需求,例如读取的数据大小,插入数据的位置等。

还有其他方法可以将一张 BMP 图片贴到另一张 BMP 图片中,例如使用 OpenCV 库进行图像处理,它提供了丰富的图像处理函数,可以方便地进行图像的贴合、旋转、缩放等操作。

需要注意的是,使用 OpenCV 或其他图像处理库进行图像贴合时,需要对图像格式进行转换,以确保两张图片的格式兼容。

代码示例:

#include <opencv2/opencv.hpp>

using namespace cv;

int main() {
    // Load the two BMP images
    Mat image1 = imread("image1.bmp", IMREAD_COLOR);
    Mat image2 = imread("image2.bmp", IMREAD_COLOR);

    // Define the position to paste the first image
    Point position(0, 0);

    // Paste the first image on the second image
    image1.copyTo(image2(Rect(position, image1.size())));

    // Save the output image
    imwrite("output.bmp", image2);

    return 0;
}


注意:在使用OpenCV时需要先安装它并且需要在代码中引入相关头文件。

在 c++ 中,可以使用 CxImage 类库来读取和修改 bmp 图片。首先,需要读取两张图片,然后使用 CxImage 类的 Composite() 或 Copy() 函数将一张图片复制到另一张图片上。最后,使用 Save() 函数将修改后的图片保存到新的文件中。

下面是一个示例代码:

#include <cximage/ximage.h>

int main()
{
    CxImage img1, img2, img3;
    img1.Load("image1.bmp", CXIMAGE_FORMAT_BMP);
    img2.Load("image2.bmp", CXIMAGE_FORMAT_BMP);
    img3.Copy(img1);
    img3.Composite(img2, 0, 0);
    img3.Save("image3.bmp", CXIMAGE_FORMAT_BMP);
    return 0;
}

如果你想将一张bmp图片贴到另一张bmp图片中,首先你需要读取两张图片的数据。这可以通过使用C++的fstream库来实现。然后,你可以使用图像处理库(如OpenCV或Qt)来处理和编辑图片数据。举个例子:

#include <opencv2/core/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;

int main() {
    Mat img1 = imread("img1.bmp", IMREAD_COLOR);
    Mat img2 = imread("img2.bmp", IMREAD_COLOR);

    Mat img3(img1.rows, img1.cols, img1.type());

    Rect roi(100, 100, img2.cols, img2.rows);

    img2.copyTo(img3(roi));

    imwrite("result.bmp", img3);
    return 0;
}


在c++中,我们可以使用STL库中的fstream类来读取bmp图片的文件头和位图数据,然后使用memcpy函数将一张图片的位图数据复制到另一张图片的对应位置。

下面是一个简单的示例代码:

#include <fstream>
#include <iostream>
using namespace std;

int main()
{
    //读取原始图片
    fstream file1("original.bmp", ios::in | ios::binary);
    char* buffer1 = new char[sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)];
    file1.read(buffer1, sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER));

    //读取目标图片
    fstream file2("target.bmp", ios::in | ios::binary);
    char* buffer2 = new char[sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)];
    file2.read(buffer2, sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER));

    //获取位图

将一张BMP图片贴到另一张BMP图片中可以使用C++的文件读写和图像处理库。步骤如下:

1.使用C++的文件读写函数读取两张BMP图片的文件头和像素数据。

2.使用图像处理库(如OpenCV)将读取的像素数据转换为Mat格式。

3.使用图像处理库中的函数将第一张图片的Mat格式数据贴到第二张图片的Mat格式数据上。

4.使用C++的文件读写函数将贴好的第二张图片的像素数据写入新的文件中。


#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct _bmp_image{
    int width;
    int height;
    int pixellen; //像素长度
    int datalen; //文件长度    
    uint8_t* pixel; //像素
    uint8_t* data; //文件内容    
}bmp_image;
 
//加载bmp图像
bmp_image* load_bmp_image(const char* filename){
    int memsz, filesz;
    bmp_image* img = NULL;    
    FILE* f = fopen(filename, "rb");
    if(!f)return NULL;    
    fseek(f, 0, SEEK_END);    
    filesz = ftell(f);
    rewind(f);
    memsz = sizeof(bmp_image) + filesz;
    img = (bmp_image*)malloc(memsz);
    if(!img){fclose(f);return NULL;}
    img->data = (uint8_t*)img + sizeof(bmp_image);
    img->datalen = filesz;
    fread(img->data, 1, img->datalen, f);
    fclose(f);
    img->width = *(uint32_t*)(img->data + 18);
    img->height = *(uint32_t*)(img->data + 22);
    img->pixel = img->data + *(uint32_t*)(img->data + 10);
    img->pixellen = *(uint32_t*)(img->data + 2) - *(uint32_t*)(img->data + 10);
    return img;    
}
 
//保存bmp图像
int save_bmp_image(const bmp_image* img, const char* filename){
    FILE* f = fopen(filename, "wb");
    if(!f)return -1;
    fwrite(img->data, 1, img->datalen, f);
    fclose(f);
    return 0;
}
 
//图像合并 (目标大图像, 小图像, x, y)(小图像不能超出大图像范围)
void merge_bmp_image(bmp_image* dst, const bmp_image* src, int x, int y){
    int i, maxh, maxw, dstx, dsty;
    uint8_t* ptr;    
    int dstlinew = dst->pixellen / dst->height;
    int srclinew = src->pixellen / src->height;
    dstx = x;
    dsty = dst->height - y - src->height;
    maxw = src->width;
    maxh = src->height;
    ptr = dst->pixel + dsty * dstlinew;
    for (i = 0; i < maxh; i++){
        memcpy(ptr + dstx * 3, src->pixel + srclinew * i, maxw * 3);
        ptr += dstlinew;        
    }    
}
 
int main(){
    //将logo.bmp合并到background.bmp上,位置为100,50,保存为revised.bmp
    bmp_image* background = load_bmp_image("background.bmp");
    bmp_image* logo = load_bmp_image("logo.bmp");    
    merge_bmp_image(background, logo, 100, 50);
    save_bmp_image(background, "revised.bmp");
    return 0;
}