C语言实现的BMP和JPEG图片的解码

这篇博客提供了一个C语言实现的程序,用于读取和解码BMP和JPEG格式的图片,将其转换为适合在LCD上显示的数据。程序依赖jpeglib库,并包含了BMP文件头和JPEG解码的相关结构体定义。通过`read_picture`函数,根据图片类型调用相应的解码函数。代码中详细解释了BMP和JPEG解码的过程。
摘要由CSDN通过智能技术生成
/*
这是read_picture.c 文件的代码 ,主要是对输入的图片的文件(BMP和JPEG类型)进行解码,转换成在LCD中显示的数据;
使用该程序时,要先把jpeglib库文件和头文件放到对应的标谁库和标准头文件中;否则编译出错的
*/
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>


#include "jpeglib.h"
#include <setjmp.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>


unsigned char* read_bmp(char* filename);
unsigned char* read_jpeg(char *path);


//14byte文件头
typedef struct
{
char cfType[2];//文件类型,"BM"(0x4D42)
long cfSize;//文件大小(字节)
long cfReserved;//保留,值为0
long cfoffBits;//数据区相对于文件头的偏移量(字节)
}__attribute__((packed)) BITMAPFILEHEADER;
//__attribute__((packed))的作用是告诉编译器取消结构在编译过程中的优化对齐


//40byte信息头
typedef struct
{
char ciSize[4];//BITMAPFILEHEADER所占的字节数
long ciWidth;//宽度
long ciHeight;//高度
char ciPlanes[2];//目标设备的位平面数,值为1
int ciBitCount;//每个像素的位数
char ciCompress[4];//压缩说明
char ciSizeImage[4];//用字节表示的图像大小,该数据必须是4的倍数
char ciXPelsPerMeter[4];//目标设备的水平像素数/米
char ciYPelsPerMeter[4];//目标设备的垂直像素数/米
char ciClrUsed[4]; //位图使用调色板的颜色数
char ciClrImportant[4]; //指定重要的颜色数,当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要
}__attribute__((packed)) BITMAPINFOHEADER;


typedef struct
{
unsigned char blue;
unsigned char green;
unsigned char red;
//unsigned char reserved;
}__attribute__((packed)) PIXEL;//颜色模式RGB


BITMAPFILEHEADER FileHead;
BITMAPINFOHEADER InfoHead;


int width_bmp;
int height_bmp;


/*
第1 个参数: 图片所在的路径名
第2 个参数: 没有任何作用,先将他设置为空
返回值: 返回一个指向堆的指针,是解码后的图片数据
*/
int read_picture_type(char *pic_name)//根据文析名得到图片的类型
{
char *pic_tail;
int name_len = strlen(pic_name);
pic_tail = pic_name + name_len-1;
while(pic_name != pic_tail)
{
if(*pic_tail == '.')
{

if(strcmp(pic_tail,".bmp") == 0 || strcmp(pic_tail,".BMP") =&
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值