JPEG图片的压缩、解压
解压
查看代码
/*************************************************
* filename:bmp_half
* function:实现把bmp图片复制一份
* date:2025.5.28
* note:none
*
* CopyRight (c) 2024-2025 l550036303@163.com All right reserved
************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#pragma pack(1)
struct bmp_head { //文件头
char type[2];//位图文件的类型,必须为BM(1-2字节)
int size; //位图文件的大小,以字节为单位(3-6字节,低位在前)
short reserved1;//位图文件保留字,必须为0(7-8字节)
short reserved2;//位图文件保留字,必须为0(9-10字节)
int offbits; //位图数据的起始位置,以相对于位图(11-14字节,低位在前),文件头的偏移量表示,以字节为单位
};
struct bmp_info{ //信息头
int infosize; //本结构所占用字节数(15-18字节)
int width; //位图的宽度,以像素为单位(19-22字节)
int height; //位图的高度,以像素为单位(23-26字节)
short planes; //目标设备的级别,必须为1(27-28字节)
short bit_count; //每个像素所需的位数,必须是1(双色),(29-30字节)//4(16色),8(256色)16(高彩色)或24(真彩色)之一
int compression;//位图压缩类型,必须是0(不压缩),(31-34字节) //1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
int size_img; //位图的大小(其中包含了为了补齐列数是4的倍数而添加的空字节),以字节为单位(35-38字节)
int X_pel; //位图水平分辨率,每米像素数(39-42字节)
int Y_pel; //位图垂直分辨率,每米像素数(43-46字节)
int clrused; //位图实际使用的颜色表中的颜色数(47-50字节)
int clrImportant; //位图显示过程中重要的颜色数(51-54字节)
};
#pragma pack()
void main(int argc,char const *argv[]){
if( 3 != argc){
perror("argument is invail\n"); //错误处理
exit(-1);
}
FILE * fsrc = fopen(argv[1],"rb");
if(NULL == fsrc){
perror("file open faild\n"); //错误处理
exit(-1);
}
fseek(fsrc,14,SEEK_SET);
struct bmp_info binfo; //创建结构体 信息头
fread(&binfo,1,40,fsrc); //复制信息头
int height = binfo.height; //图片的高
int width = binfo.width; //图片的宽
int fd = open("/dev/fb0",O_RDWR);//打开framebuffer
int * map =(int *)mmap(NULL,height*width*4,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); //建立内存映射
if(map == MAP_FAILED){
perror("mmap creat fail\n");
exit(-1);
}
char * bmp=(char *)calloc(1,width); //创建存储图片的信息的数组,并初始化为0
int data;
for(int l = height ; l > 0 ;l-=2){
fread(bmp,1,width,fsrc);
for(int j = 0;j < width ;j+=2){
data |= bmp[j]; //B
data |= bmp[j+1]<<8; //G
data |= bmp[j+2]<<16; //R
map[(l-1)*width+j]=data;
data=0;
}
}
printf("1111111111111\n");
fclose(fsrc);
close(fd);
munmap(map,height*width*4);
}

浙公网安备 33010602011771号