这个代码的逻辑其实蛮简单的,就是用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;
}
实现结果: