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号