#include <pic_operation.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#pragma pack(push) /* 将当前pack设置压栈保存 */
#pragma pack(1) /* 必须在结构体定义之前使用 */
typedef struct tagBITMAPFILEHEADER { /* bmfh */
unsigned short bfType;
unsigned long bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned long bfOffBits;
} BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER { /* bmih */
unsigned long biSize;
unsigned long biWidth;
unsigned long biHeight;
unsigned short biPlanes;
unsigned short biBitCount;
unsigned long biCompression;
unsigned long biSizeImage;
unsigned long biXPelsPerMeter;
unsigned long biYPelsPerMeter;
unsigned long biClrUsed;
unsigned long biClrImportant;
} BITMAPINFOHEADER;
#pragma pack(pop) /* 恢复先前的pack设置 */
static int isBMPFormat(unsigned char *aFileHead);
static int GetPixelDatasFrmBMP(unsigned char *aFileHead, PT_PixelDatas ptPixelDatas);
static int FreePixelDatasForBMP(PT_PixelDatas ptPixelDatas);
T_PicFileParser g_tBMPParser = {
.name = "bmp",
.isSupport = isBMPFormat,
.GetPixelDatas = GetPixelDatasFrmBMP,
.FreePixelDatas = FreePixelDatasForBMP,
};
static int isBMPFormat(unsigned char *aFileHead)
{
if (aFileHead[0] != 0x42 || aFileHead[1] != 0x4d)
return 0;
else
return 1;
}
static int CovertOneLine(int iWidth, int iSrcBpp, int iDstBpp, unsigned char *pudSrcDatas, unsigned char *pudDstDatas)
{
unsigned int dwRed;
unsigned int dwGreen;
unsigned int dwBlue;
unsigned int dwColor;
unsigned short *pwDstDatas16bpp = (unsigned short *)pudDstDatas;
unsigned int *pwDstDatas32bpp = (unsigned int *)pudDstDatas;
int i;
int pos = 0;
if (iSrcBpp != 24)
{
return -1;
}
if (iDstBpp == 24)
{
memcpy(pudDstDatas, pudSrcDatas, iWidth*3);
}
else
{
for (i = 0; i < iWidth; i++)
{
dwBlue = pudSrcDatas[pos++];
dwGreen = pudSrcDatas[pos++];
dwRed = pudSrcDatas[pos++];
if (iDstBpp == 32)
{
dwColor = (dwRed << 16) | (dwGreen << 8) | dwBlue;
*pwDstDatas32bpp = dwColor;
pwDstDatas32bpp++;
}
else if (iDstBpp == 16)
{
/* 565 */
dwRed = dwRed >> 3;
dwGreen = dwGreen >> 2;
dwBlue = dwBlue >> 3;
dwColor = (dwRed << 11) | (dwGreen << 5) | (dwBlue);
*pwDstDatas16bpp = dwColor;
pwDstDatas16bpp++;
}
}
}
return 0;
}
/*
* ptPixelDatas->iBpp 是输入的参数, 它决定从BMP得到的数据要转换为该格式
*/
static int GetPixelDatasFrmBMP(unsigned char *aFileHead, PT_PixelDatas ptPixelDatas)
{
BITMAPFILEHEADER *ptBITMAPFILEHEADER;
BITMAPINFOHEADER *ptBITMAPINFOHEADER;
int iWidth;
int iHeight;
int iBMPBpp;
int y;
unsigned char *pucSrc;
unsigned char *pucDest;
int iLineWidthAlign;
int iLineWidthReal;
ptBITMAPFILEHEADER = (BITMAPFILEHEADER *)aFileHead;
ptBITMAPINFOHEADER = (BITMAPINFOHEADER *)(aFileHead + sizeof(BITMAPFILEHEADER));
iWidth = ptBITMAPINFOHEADER->biWidth;//图象的宽度,以象素为单位。
//bmp图象的高度,以象素为单位
iHeight = ptBITMAPINFOHEADER->biHeight;
iBMPBpp = ptBITMAPINFOHEADER->biBitCount;
//比特数/象素
if (iBMPBpp != 24)
{
printf("iBMPBpp = %d\n", iBMPBpp);
printf("sizeof(BITMAPFILEHEADER) = %d\n", sizeof(BITMAPFILEHEADER));
return -1;
}
ptPixelDatas->iWidth = iWidth;//bmp图像的宽度
ptPixelDatas->iHeight = iHeight;//bmp图像的高度
//ptPixelDatas->iBpp = iBpp;
//开辟一副bmp图像占的字节内存空间
//首地址为ptPixelDatas->aucPixelDatas
ptPixelDatas->aucPixelDatas = malloc(iWidth * iHeight * ptPixelDatas->iBpp / 8);
//LCD屏幕一行的字节
ptPixelDatas->iLineBytes = iWidth * ptPixelDatas->iBpp / 8;
if (NULL == ptPixelDatas->aucPixelDatas)
{
return -1;
}
//bmp图像一行的字节
iLineWidthReal = iWidth * iBMPBpp / 8;
iLineWidthAlign = (iLineWidthReal + 3) & ~0x3; /* 向4取整 */
//bmp图像数据的首地址
pucSrc = aFileHead + ptBITMAPFILEHEADER->bfOffBits;
pucSrc = pucSrc + (iHeight - 1) * iLineWidthAlign;
//开辟内存显示首地址
pucDest = ptPixelDatas->aucPixelDatas;
//bmp图像的高度iHeight
for (y = 0; y < iHeight; y++)
{
//memcpy(pucDest, pucSrc, iLineWidthReal);
//iWidth:bmp图像的宽度
//iBMPBpp :bmp 比特数/象素其实为24
// ptPixelDatas->iBpp :LCD比特数/象素
//pucSrc bmp数据首地址
//pucDest
CovertOneLine(iWidth, iBMPBpp, ptPixelDatas->iBpp, pucSrc, pucDest);
//显示一行bmp图像,减去显示的数据
pucSrc -= iLineWidthAlign;
//lcd显示完一行,跳上一行显示
pucDest += ptPixelDatas->iLineBytes;
}
return 0;
}
static int FreePixelDatasForBMP(PT_PixelDatas ptPixelDatas)
{
free(ptPixelDatas->aucPixelDatas);
return 0;
}
2440LCD显示BMP图片
1星 需积分: 13 146 浏览量
2017-03-17
14:45:51
上传
评论 1
收藏 484KB ZIP 举报
ZHULINHAIBAO
- 粉丝: 15
- 资源: 43
最新资源
- 基于python和opencv的样本交互标注工具+源码+文档说明(期末大作业&课程设计&项目开发)
- IMG_20240329_150532.jpg
- 《电路》大作业:基于matlab实现的节点电压法计算+源代码+文档说明
- 3401-VB一款P-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- Mysql 版中国省市区数据表SQL
- 数值分析,基于MATLAB GUI 的“数值分析方法”计算器+源代码+文档说明
- 基于matlab水果识别系统代码32gui界面设计
- 基于Python大规模文本分析系统的开题报告.docx
- 3401-CMN3401-VB一款P-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- python实现的四则运算计算器
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈