c语言实现图片拼接(linux)

发布于:2023-01-04 ⋅ 阅读:(219) ⋅ 点赞:(0)

这个代码的逻辑其实蛮简单的,就是用read()函数将对应的要拼接的部分,读入到一块儿缓存中(定义一个数组就行),最后用write()函数将切出来的对应的部分输出到要拼接的图片文件就大功告成。
值得注意的点:注意你的电脑的图片扫描方式是由上往下的还是由下往上 的 ,这会导致输入缓存的部分,和输出到指定文件的位置会和预期的不一样。

原理其实很简单,需要我们知道的是图片文件的数据存储方式和文件大小的计算(用来计算需要读取的文件大小);

BMP文件由以下四部分组成:

  • 位图文件头(BITMAPFILEHEADER)
  • 位图信息头(BITMAPINFOHEADER)
  • 颜色表*(RGBQUAD[])
  • 像素阵列(Pixels[][])

bmp图像空间大小计算:

                        文件大小=54(文件头)+ 分辨率*位深/8
                        分辨率=宽*高(如:1024*768,640*480)
                        位深:如24位,16位,8位
                        /8计算的是字节数。
                        

                        例如:
                        一幅图像分辨率:1920*1080
                        大小=54+1920*1080*24/8=6220854

需要处理的图片:

1.bmp

 

2.bmp 

 

 

 

 

 

代码:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>


int main(int argc, char *argv[])
{
    int fd1 = open("./1.bmp", O_RDONLY);//打开图片1文件
    if(fd1 < 0)
    {
        perror("open fd1");
        return -1;
    }
    int fd2 = open("./2.bmp", O_RDONLY);//打开图片2文件
    if(fd1 < 0)
    {
        perror("open fd2");
        return -1;
    }
    int fd3 = open("./3.bmp", O_WRONLY | O_CREAT, 0666);//打开拼接的图片文件,没有则创建;
    if(fd1 < 0)
    {
        perror("open fd3");
        return -1;
    }

    char head[54] = {0};//图片头文件的缓冲区
    char body1[1920*1080*24/8/2] ;//图片1其他文件缓冲区
    char body2[1920*1200*24/8/2] ;//图片2其他文件缓冲区
    
    //读取文件
    read(fd1, head, sizeof(head));
    read(fd1, body1, sizeof(body1));
    lseek(fd2, 54+sizeof(body2), SEEK_SET);
    read(fd2,body2,sizeof(body2));
    
    //写入文件
    write(fd3, head, sizeof(head));
    write(fd3, body1, sizeof(body1));
    write(fd3, body2, sizeof(body2));

    return 0;
} 

实现结果:

 

 


网站公告

今日签到

点亮在社区的每一天
去签到