2025-06-27 00:32:57 +08:00
|
|
|
|
#include "base.h"
|
|
|
|
|
|
#include "bmp.h"
|
|
|
|
|
|
#include "string.h"
|
|
|
|
|
|
#include "ff.h"
|
|
|
|
|
|
#include "mymem.h"
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>ѧϰʹ<CFB0>ã<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD>;
|
|
|
|
|
|
//ALIENTEK STM32F407<30><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
//ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-bmp<6D><70><EFBFBD>벿<EFBFBD><EBB2BF>
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>@ALIENTEK
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2014/5/15
|
|
|
|
|
|
//<2F>汾<EFBFBD><E6B1BE>V1.0
|
|
|
|
|
|
//<2F><>Ȩ<EFBFBD><C8A8><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD>
|
|
|
|
|
|
//Copyright(C) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿƼ<D3BF><C6BC><EFBFBD><EFBFBD><EFBFBD>˾ 2014-2024
|
2025-06-27 00:32:57 +08:00
|
|
|
|
//All rights reserved
|
|
|
|
|
|
//********************************************************************************
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
//V1.1 20140722
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><EFBFBD>minibmp_decode<64><65><EFBFBD><EFBFBD>,ʹͼƬ<CDBC><C6AC><EFBFBD>趨<EFBFBD><E8B6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><>ʹ<EFBFBD><CAB9><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
#if BMP_USE_MALLOC == 0
|
|
|
|
|
|
FIL f_bfile;
|
|
|
|
|
|
u8 bmpreadbuf[BMP_DBUF_SIZE];
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct _pic_phy
|
|
|
|
|
|
{
|
|
|
|
|
|
void (*draw_hline)(int x,int y,int len,u16 color);
|
|
|
|
|
|
void (*draw_point)(int x,int y,u16 color);
|
|
|
|
|
|
void (*fill)(int sx,int xy,int ex,int ey,u16 color);
|
|
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static BMP_DecodeStruct *g_decode=0;
|
|
|
|
|
|
static void draw_hline (int x,int y,int len,u16 color)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (x>=0&&x<g_decode->x_size)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (x+len>g_decode->x_size) len=g_decode->x_size-x;
|
|
|
|
|
|
int ds=y*g_decode->x_size+x;
|
|
|
|
|
|
for (int i=0;i<len;i++)
|
|
|
|
|
|
(g_decode->data)[ds+i]=color;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
static void draw_point (int x,int y,u16 color)
|
|
|
|
|
|
{
|
|
|
|
|
|
int ds=y*g_decode->x_size+x;
|
|
|
|
|
|
(g_decode->data)[ds]=color;
|
|
|
|
|
|
}
|
|
|
|
|
|
static void fill(int sx,int sy,int ex,int ey,u16 color)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (int i=0;i<ey-sy+1;i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
draw_hline (sx,sy+i,ex-sx+1,color);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
static struct _pic_phy pic_phy ={
|
|
|
|
|
|
.draw_hline=draw_hline,
|
|
|
|
|
|
.draw_point=draw_point,
|
|
|
|
|
|
.fill=fill,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><D7BC>bmp<6D><70><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>filename<6D><65><EFBFBD><EFBFBD>BMP<4D>ļ<EFBFBD>
|
|
|
|
|
|
//<2F>ٶȱȽ<C8B1><C8BD><EFBFBD>.<2E><>Ҫ
|
|
|
|
|
|
//filename:<3A><><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>ֵ:0,<2C>ɹ<EFBFBD>;
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
2025-06-27 00:32:57 +08:00
|
|
|
|
int BMP_Decode(const u8 *filename,BMP_DecodeStruct *bmp)
|
|
|
|
|
|
{
|
|
|
|
|
|
FIL* f_bmp;
|
|
|
|
|
|
UINT br;
|
|
|
|
|
|
|
|
|
|
|
|
u16 count;
|
|
|
|
|
|
u8 rgb ,color_byte;
|
|
|
|
|
|
u16 x ,y,color;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
u16 countpix=0;//<2F><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//x,y<><79>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
u16 realx=0;
|
|
|
|
|
|
u16 realy=0;
|
|
|
|
|
|
u8 yok=1;
|
|
|
|
|
|
int res=0;
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
u8 *databuf; //<2F><><EFBFBD>ݶ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ŵ<EFBFBD>ַ
|
|
|
|
|
|
u16 readlen=BMP_DBUF_SIZE;//һ<>δ<EFBFBD>SD<53><44><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
u8 *bmpbuf; //<2F><><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
|
|
|
|
|
u8 biCompression=0; //<2F><>¼ѹ<C2BC><D1B9><EFBFBD><EFBFBD>ʽ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
u16 rowlen; //ˮƽ<CBAE><C6BD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
|
|
|
|
|
|
BITMAPINFO *pbmp; //<2F><>ʱָ<CAB1><D6B8>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
databuf=(u8*)mymalloc(readlen); //<2F><><EFBFBD><EFBFBD>readlen<65>ֽڵ<D6BD><DAB5>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if(databuf==NULL)return -1; //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>.
|
|
|
|
|
|
f_bmp=(FIL *)mymalloc(sizeof(FIL)); //<2F><><EFBFBD><EFBFBD>FIL<49>ֽڵ<D6BD><DAB5>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if(f_bmp==NULL) //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>.
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
|
|
|
|
|
myfree(databuf);
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
res=f_open(f_bmp,(const TCHAR*)filename,FA_READ);//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
|
|
|
|
|
if(res==0)//<2F>ɹ<F2BFAAB3>.
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
f_read(f_bmp,databuf,readlen,(UINT*)&br); //<2F><><EFBFBD><EFBFBD>readlen<65><6E><EFBFBD>ֽ<EFBFBD>
|
|
|
|
|
|
pbmp=(BITMAPINFO*)databuf; //<2F>õ<EFBFBD>BMP<4D><50>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>Ϣ
|
|
|
|
|
|
count=pbmp->bmfHeader.bfOffBits; //<2F><><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>,<2C>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>ݶεĿ<CEB5>ʼ<EFBFBD><CABC>ַ
|
|
|
|
|
|
color_byte=pbmp->bmiHeader.biBitCount/8; //<2F><>ɫλ 16/24/32
|
|
|
|
|
|
biCompression=pbmp->bmiHeader.biCompression;//ѹ<><D1B9><EFBFBD><EFBFBD>ʽ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
g_decode=bmp;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
g_decode->y_size =pbmp->bmiHeader.biHeight; //<2F>õ<EFBFBD>ͼƬ<CDBC>߶<EFBFBD>
|
|
|
|
|
|
g_decode->x_size=pbmp->bmiHeader.biWidth; //<2F>õ<EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
g_decode->data = mymalloc_exm (g_decode->x_size*g_decode->y_size*2);
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//ai_draw_init();//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ܻ<EFBFBD>ͼ
|
|
|
|
|
|
//ˮƽ<CBAE><C6BD><EFBFBD>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD>ı<EFBFBD><C4B1><EFBFBD>!!
|
2025-06-27 00:32:57 +08:00
|
|
|
|
if((g_decode->x_size*color_byte)%4)rowlen=((g_decode->x_size*color_byte)/4+1)*4;
|
|
|
|
|
|
else rowlen=g_decode->x_size*color_byte;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>BMP
|
|
|
|
|
|
color=0;//<2F><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
x=0 ;
|
|
|
|
|
|
y=g_decode->y_size;
|
|
|
|
|
|
rgb=0;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD>ڳߴ<DAB3>С<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>趨<EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD>ͼƬ,<2C><><EFBFBD>п<EFBFBD><D0BF>ٽ<EFBFBD><D9BD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
//realy=(y*picinfo.Div_Fac)>>13;
|
|
|
|
|
|
realy=y;
|
|
|
|
|
|
bmpbuf=databuf;
|
|
|
|
|
|
while(1)
|
|
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
while(count<readlen) //<2F><>ȡһ<C8A1><D2BB>1024<32><34><EFBFBD><EFBFBD> (SectorsPerClust ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
if(color_byte==3) //24λ<34><CEBB>ɫͼ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
|
|
|
|
|
switch (rgb)
|
|
|
|
|
|
{
|
|
|
|
|
|
case 0:
|
|
|
|
|
|
color=bmpbuf[count]>>3; //B
|
|
|
|
|
|
break ;
|
|
|
|
|
|
case 1:
|
|
|
|
|
|
color+=((u16)bmpbuf[count]<<3)&0X07E0;//G
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 2 :
|
|
|
|
|
|
color+=((u16)bmpbuf[count]<<8)&0XF800;//R
|
|
|
|
|
|
break ;
|
|
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
}else if(color_byte==2) //16λ<36><CEBB>ɫͼ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
|
|
|
|
|
switch(rgb)
|
|
|
|
|
|
{
|
|
|
|
|
|
case 0 :
|
|
|
|
|
|
if(biCompression==BI_RGB)//RGB:5,5,5
|
|
|
|
|
|
{
|
|
|
|
|
|
color=((u16)bmpbuf[count]&0X1F); //R
|
|
|
|
|
|
color+=(((u16)bmpbuf[count])&0XE0)<<1; //G
|
|
|
|
|
|
}else //RGB:5,6,5
|
|
|
|
|
|
{
|
|
|
|
|
|
color=bmpbuf[count]; //G,B
|
|
|
|
|
|
}
|
|
|
|
|
|
break ;
|
|
|
|
|
|
case 1 :
|
|
|
|
|
|
if(biCompression==BI_RGB)//RGB:5,5,5
|
|
|
|
|
|
{
|
|
|
|
|
|
color+=(u16)bmpbuf[count]<<9; //R,G
|
|
|
|
|
|
}else //RGB:5,6,5
|
|
|
|
|
|
{
|
|
|
|
|
|
color+=(u16)bmpbuf[count]<<8; //R,G
|
|
|
|
|
|
}
|
|
|
|
|
|
break ;
|
|
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
}else if(color_byte==4)//32λ<32><CEBB>ɫͼ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
|
|
|
|
|
switch (rgb)
|
|
|
|
|
|
{
|
|
|
|
|
|
case 0:
|
|
|
|
|
|
color=bmpbuf[count]>>3; //B
|
|
|
|
|
|
break ;
|
|
|
|
|
|
case 1:
|
|
|
|
|
|
color+=((u16)bmpbuf[count]<<3)&0X07E0;//G
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 2 :
|
|
|
|
|
|
color+=((u16)bmpbuf[count]<<8)&0XF800;//R
|
|
|
|
|
|
break ;
|
|
|
|
|
|
case 3 :
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//alphabend=bmpbuf[count];//<2F><><EFBFBD><EFBFBD>ȡ ALPHAͨ<41><CDA8>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
break ;
|
|
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
}else if(color_byte==1)//8λɫ,<2C><>ʱ<EFBFBD><CAB1>֧<EFBFBD><D6A7>,<2C><>Ҫ<EFBFBD>õ<EFBFBD><C3B5><EFBFBD>ɫ<EFBFBD><C9AB>.
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
rgb++;
|
|
|
|
|
|
count++ ;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
if(rgb==color_byte) //ˮƽ<CBAE><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA><EFBFBD>ʾ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
|
|
|
|
|
if(x<g_decode->x_size)
|
|
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//realx=(x*picinfo.Div_Fac)>>13;//x<><78>ʵ<EFBFBD><CAB5>ֵ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
realx=x;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
pic_phy.draw_point(realx,realy-1,color);//<2F><>ʾͼƬ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
//POINT_COLOR=color;
|
|
|
|
|
|
//LCD_DrawPoint(realx+picinfo.S_XOFF,realy+picinfo.S_YOFF);
|
|
|
|
|
|
//SRAMLCD.Draw_Point(realx+picinfo.S_XOFF,realy+picinfo.S_YOFF,color);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
x++;//x<><78><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
color=0x00;
|
|
|
|
|
|
rgb=0;
|
|
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
countpix++;//<2F><><EFBFBD><EFBFBD><EFBFBD>ۼ<EFBFBD>
|
|
|
|
|
|
if(countpix>=rowlen)//ˮƽ<CBAE><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>.<2E><><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
|
|
|
|
|
y--;
|
|
|
|
|
|
if(y==0)break;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//realy=(y*picinfo.Div_Fac)>>13;//ʵ<><CAB5>yֵ<79>ı<EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
realy=y;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//if(is_element_ok(realx,realy,0))yok=1;//<2F>˴<EFBFBD><CBB4><EFBFBD><EFBFBD>ı<EFBFBD>picinfo.staticx,y<><79>ֵ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
//else yok=0;
|
|
|
|
|
|
yok=0;
|
|
|
|
|
|
x=0;
|
|
|
|
|
|
countpix=0;
|
|
|
|
|
|
color=0x00;
|
|
|
|
|
|
rgb=0;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
res=f_read(f_bmp,databuf,readlen,(UINT *)&br);//<2F><><EFBFBD><EFBFBD>readlen<65><6E><EFBFBD>ֽ<EFBFBD>
|
|
|
|
|
|
if(br!=readlen)readlen=br; //<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if(res||br==0)break; //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
bmpbuf=databuf;
|
|
|
|
|
|
count=0;
|
|
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
f_close(f_bmp);//<2F>ر<EFBFBD><D8B1>ļ<EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
myfree(databuf);
|
|
|
|
|
|
myfree(f_bmp);
|
2025-07-05 19:47:28 +08:00
|
|
|
|
return res; //BMP<4D><50>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>.
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//С<>ߴ<EFBFBD><DFB4><EFBFBD>bmp<6D><70><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>filename<6D><65><EFBFBD><EFBFBD>BMP<4D>ļ<EFBFBD>
|
|
|
|
|
|
//filename:<3A><><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
|
|
|
|
|
|
//x,y,width,height:<3A><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ)
|
|
|
|
|
|
//acolor:<3A><><EFBFBD>ӵ<EFBFBD>alphablend<6E><64><EFBFBD><EFBFBD>ɫ(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>32λɫbmp<6D><70>Ч!!!)
|
|
|
|
|
|
//mode:ģʽ(<28><><EFBFBD><EFBFBD>bit5,<2C><><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD>ֻ<EFBFBD><D6BB>32λɫbmp<6D><70>Ч!!!)
|
|
|
|
|
|
// bit[7:6]:0,<2C><>ʹ<EFBFBD><CAB9>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ɫalphablend;
|
|
|
|
|
|
// 1,<2C><>ͼƬ<CDBC><C6AC>acolor<6F><72><EFBFBD><EFBFBD>alphablend,<2C><><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD>ø<EFBFBD><C3B8>ӵ<EFBFBD><EFBFBD><CDB8><EFBFBD><EFBFBD>;
|
|
|
|
|
|
// 2,<2C><>ɫ,acolor,ͼƬ,һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>alphablend;
|
|
|
|
|
|
// bit5:<3A><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// bit4~0:0~31,ʹ<>ø<EFBFBD><C3B8><EFBFBD>alphablend<6E><64><EFBFBD><CDB8><EFBFBD>̶<EFBFBD>
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>ֵ:0,<2C>ɹ<EFBFBD>;
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
2025-06-27 00:32:57 +08:00
|
|
|
|
/*
|
2025-07-05 19:47:28 +08:00
|
|
|
|
u8 minibmp_decode(u8 *filename,u16 x,u16 y,u16 width,u16 height,u16 acolor,u8 mode)//<2F>ߴ<EFBFBD>С<EFBFBD><D0A1>240*320<32><30>bmpͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>.
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
|
|
|
|
|
FIL* f_bmp;
|
|
|
|
|
|
u16 br;
|
|
|
|
|
|
u8 color_byte;
|
|
|
|
|
|
u16 tx,ty,color;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//tx,ty<74><79>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
u8 res;
|
|
|
|
|
|
u16 i,j;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
u8 *databuf; //<2F><><EFBFBD>ݶ<EFBFBD>ȡ<EFBFBD><C8A1> <20>ŵ<EFBFBD>ַ
|
|
|
|
|
|
u16 readlen=BMP_DBUF_SIZE;//һ<>δ<EFBFBD>SD<53><44><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>С<EFBFBD><D0A1>LCD<43><44><EFBFBD><EFBFBD>*3!!!
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
u8 *bmpbuf; //<2F><><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
|
|
|
|
|
u8 biCompression=0; //<2F><>¼ѹ<C2BC><D1B9><EFBFBD><EFBFBD>ʽ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
u16 rowcnt; //һ<>ζ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
u16 rowlen; //ˮƽ<CBAE><C6BD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
|
|
|
|
|
|
u16 rowpix=0; //ˮƽ<CBAE><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
u8 rowadd; //ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
|
|
|
|
|
u16 tmp_color;
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
u8 alphabend=0xff; //<2F><><EFBFBD><EFBFBD><EFBFBD><CDB8>ɫΪ0<CEAA><30><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><CDB8>
|
|
|
|
|
|
u8 alphamode=mode>>6; //<2F>õ<EFBFBD>ģʽֵ,0/1/2
|
|
|
|
|
|
BITMAPINFO *pbmp; //<2F><>ʱָ<CAB1><D6B8>
|
|
|
|
|
|
//<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
picinfo.S_Height=height;
|
|
|
|
|
|
picinfo.S_Width=width;
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
#if BMP_USE_MALLOC == 1 //ʹ<><CAB9>malloc
|
|
|
|
|
|
databuf=(u8*)pic_memalloc(readlen); //<2F><><EFBFBD><EFBFBD>readlen<65>ֽڵ<D6BD><DAB5>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if(databuf==NULL)return PIC_MEM_ERR; //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>.
|
|
|
|
|
|
f_bmp=(FIL *)pic_memalloc(sizeof(FIL)); //<2F><><EFBFBD><EFBFBD>FIL<49>ֽڵ<D6BD><DAB5>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if(f_bmp==NULL) //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>.
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
|
|
|
|
|
pic_memfree(databuf);
|
|
|
|
|
|
return PIC_MEM_ERR;
|
|
|
|
|
|
}
|
|
|
|
|
|
#else
|
|
|
|
|
|
databuf=bmpreadbuf;
|
|
|
|
|
|
f_bmp=&f_bfile;
|
|
|
|
|
|
#endif
|
2025-07-05 19:47:28 +08:00
|
|
|
|
res=f_open(f_bmp,(const TCHAR*)filename,FA_READ);//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
|
|
|
|
|
if(res==0)//<2F>ɹ<F2BFAAB3>.
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
f_read(f_bmp,databuf,sizeof(BITMAPINFO),(UINT*)&br);//<2F><><EFBFBD><EFBFBD>BITMAPINFO<46><4F>Ϣ
|
|
|
|
|
|
pbmp=(BITMAPINFO*)databuf; //<2F>õ<EFBFBD>BMP<4D><50>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>Ϣ
|
|
|
|
|
|
color_byte=pbmp->bmiHeader.biBitCount/8; //<2F><>ɫλ 16/24/32
|
|
|
|
|
|
biCompression=pbmp->bmiHeader.biCompression;//ѹ<><D1B9><EFBFBD><EFBFBD>ʽ
|
|
|
|
|
|
picinfo.ImgHeight=pbmp->bmiHeader.biHeight; //<2F>õ<EFBFBD>ͼƬ<CDBC>߶<EFBFBD>
|
|
|
|
|
|
picinfo.ImgWidth=pbmp->bmiHeader.biWidth; //<2F>õ<EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>
|
|
|
|
|
|
//ˮƽ<CBAE><C6BD><EFBFBD>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD>ı<EFBFBD><C4B1><EFBFBD>!!
|
2025-06-27 00:32:57 +08:00
|
|
|
|
if((picinfo.ImgWidth*color_byte)%4)rowlen=((picinfo.ImgWidth*color_byte)/4+1)*4;
|
|
|
|
|
|
else rowlen=picinfo.ImgWidth*color_byte;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
rowadd=rowlen-picinfo.ImgWidth*color_byte; //ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
|
|
|
|
|
|
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>BMP
|
|
|
|
|
|
color=0;//<2F><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
tx=0 ;
|
|
|
|
|
|
ty=picinfo.ImgHeight-1;
|
|
|
|
|
|
if(picinfo.ImgWidth<=picinfo.S_Width&&picinfo.ImgHeight<=picinfo.S_Height)
|
|
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
x+=(picinfo.S_Width-picinfo.ImgWidth)/2; //ƫ<>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
y+=(picinfo.S_Height-picinfo.ImgHeight)/2; //ƫ<>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
rowcnt=readlen/rowlen; //һ<>ζ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
readlen=rowcnt*rowlen; //һ<>ζ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
|
|
|
|
|
|
rowpix=picinfo.ImgWidth; //ˮƽ<CBAE><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD><C7BF><EFBFBD>
|
|
|
|
|
|
f_lseek(f_bmp,pbmp->bmfHeader.bfOffBits); //ƫ<>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼλ<CABC><CEBB>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
while(1)
|
|
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
res=f_read(f_bmp,databuf,readlen,(UINT *)&br); //<2F><><EFBFBD><EFBFBD>readlen<65><6E><EFBFBD>ֽ<EFBFBD>
|
|
|
|
|
|
bmpbuf=databuf; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
|
|
|
|
|
if(br!=readlen)rowcnt=br/rowlen; //<2F><><EFBFBD><EFBFBD>ʣ<EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if(color_byte==3) //24λBMPͼƬ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
for(j=0;j<rowcnt;j++) //ÿ<>ζ<EFBFBD><CEB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
for(i=0;i<rowpix;i++)//дһ<D0B4><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
|
|
|
|
|
color=(*bmpbuf++)>>3; //B
|
|
|
|
|
|
color+=((u16)(*bmpbuf++)<<3)&0X07E0; //G
|
|
|
|
|
|
color+=(((u16)*bmpbuf++)<<8)&0XF800; //R
|
2025-07-05 19:47:28 +08:00
|
|
|
|
pic_phy.draw_point(x+tx,y+ty,color);//<2F><>ʾͼƬ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
tx++;
|
|
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
bmpbuf+=rowadd;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
tx=0;
|
|
|
|
|
|
ty--;
|
|
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
}else if(color_byte==2)//16λBMPͼƬ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
for(j=0;j<rowcnt;j++)//ÿ<>ζ<EFBFBD><CEB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
|
|
|
|
|
if(biCompression==BI_RGB)//RGB:5,5,5
|
|
|
|
|
|
{
|
|
|
|
|
|
for(i=0;i<rowpix;i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
color=((u16)*bmpbuf&0X1F); //R
|
|
|
|
|
|
color+=(((u16)*bmpbuf++)&0XE0)<<1; //G
|
|
|
|
|
|
color+=((u16)*bmpbuf++)<<9; //R,G
|
2025-07-05 19:47:28 +08:00
|
|
|
|
pic_phy.draw_point(x+tx,y+ty,color);//<2F><>ʾͼƬ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
tx++;
|
|
|
|
|
|
}
|
|
|
|
|
|
}else //RGB 565
|
|
|
|
|
|
{
|
|
|
|
|
|
for(i=0;i<rowpix;i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
color=*bmpbuf++; //G,B
|
|
|
|
|
|
color+=((u16)*bmpbuf++)<<8; //R,G
|
2025-07-05 19:47:28 +08:00
|
|
|
|
pic_phy.draw_point(x+tx,y+ty,color);//<2F><>ʾͼƬ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
tx++;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
bmpbuf+=rowadd;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
tx=0;
|
|
|
|
|
|
ty--;
|
|
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
}else if(color_byte==4) //32λBMPͼƬ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
for(j=0;j<rowcnt;j++) //ÿ<>ζ<EFBFBD><CEB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
|
|
|
|
|
for(i=0;i<rowpix;i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
color=(*bmpbuf++)>>3; //B
|
|
|
|
|
|
color+=((u16)(*bmpbuf++)<<3)&0X07E0; //G
|
|
|
|
|
|
color+=(((u16)*bmpbuf++)<<8)&0XF800; //R
|
2025-07-05 19:47:28 +08:00
|
|
|
|
alphabend=*bmpbuf++; //ALPHAͨ<41><CDA8>
|
|
|
|
|
|
if(alphamode!=1) //<2F><>Ҫ<EFBFBD><D2AA>ȡ<EFBFBD><C8A1>ɫ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
tmp_color=pic_phy.read_point(x+tx,y+ty);//<2F><>ȡ<EFBFBD><C8A1>ɫ
|
|
|
|
|
|
if(alphamode==2)//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD>ӵ<EFBFBD>alphablend
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
tmp_color=piclib_alpha_blend(tmp_color,acolor,mode&0X1F); //<2F><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>blend
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
color=piclib_alpha_blend(tmp_color,color,alphabend/8); //<2F>͵<EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>alphablend
|
|
|
|
|
|
}else tmp_color=piclib_alpha_blend(acolor,color,alphabend/8); //<2F><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>blend
|
|
|
|
|
|
pic_phy.draw_point(x+tx,y+ty,color);//<2F><>ʾͼƬ
|
|
|
|
|
|
tx++;//x<><78><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
bmpbuf+=rowadd;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
tx=0;
|
|
|
|
|
|
ty--;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
if(br!=readlen||res)break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
f_close(f_bmp);//<2F>ر<EFBFBD><D8B1>ļ<EFBFBD>
|
|
|
|
|
|
}else res=PIC_SIZE_ERR;//ͼƬ<CDBC>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
#if BMP_USE_MALLOC == 1 //ʹ<><CAB9>malloc
|
2025-06-27 00:32:57 +08:00
|
|
|
|
pic_memfree(databuf);
|
|
|
|
|
|
pic_memfree(f_bmp);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
return res;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
*/
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//BMP<4D><50><EFBFBD>뺯<EFBFBD><EBBAAF>
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>ǰLCD<43><44>Ļ<EFBFBD><C4BB>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ,<2C><>Ϊ16λ<36><CEBB>ʽ<EFBFBD><CABD>BMP<4D>ļ<EFBFBD> RGB565<36><35>ʽ.
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>Ϊrgb565<36><35><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>,<2C><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD>ĵ<EFBFBD>ɫ<EFBFBD><C9AB>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>Ϊrgb555<35><35>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>ɫת<C9AB><D7AA>,<2C><>ʱ<EFBFBD><CAB1><EFBFBD>ȽϾ<C8BD>,<2C><><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD>Ϊ565<36><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٵİ취.
|
|
|
|
|
|
//filename:<3A><><EFBFBD><EFBFBD>·<EFBFBD><C2B7>
|
|
|
|
|
|
//x,y:<3A><><EFBFBD><EFBFBD>Ļ<EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
|
|
|
|
|
|
//mode:ģʽ.0,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>ķ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>;1,<2C><><EFBFBD><EFBFBD>֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>,<2C><EFBFBD>֮ǰ<D6AE><C7B0><EFBFBD>ļ<EFBFBD>.<2E><><EFBFBD><EFBFBD>û<EFBFBD><C3BB>,<2C><EFBFBD><F2B4B4BD>µ<EFBFBD><C2B5>ļ<EFBFBD>.
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>ֵ:0,<2C>ɹ<EFBFBD>;<3B><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
2025-06-27 00:32:57 +08:00
|
|
|
|
u8 bmp_encode(u8 *filename,u16 x,u16 y,u16 width,u16 height,u8 mode)
|
|
|
|
|
|
{
|
|
|
|
|
|
// FIL* f_bmp;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
// u16 bmpheadsize; //bmpͷ<70><CDB7>С
|
|
|
|
|
|
// BITMAPINFO hbmp; //bmpͷ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
// u8 res=0;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
// u16 tx,ty; //ͼ<><CDBC><EFBFBD>ߴ<EFBFBD>
|
|
|
|
|
|
// u16 *databuf; //<2F><><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
|
|
|
|
|
// u16 pixcnt; //<2F><><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// u16 bi4width; //ˮƽ<CBAE><C6BD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
|
|
|
|
|
|
// if(width==0||height==0)return PIC_WINDOW_ERR; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// if((x+width-1)>lcddev.width)return PIC_WINDOW_ERR; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// if((y+height-1)>lcddev.height)return PIC_WINDOW_ERR; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
//
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//#if BMP_USE_MALLOC == 1 //ʹ<><CAB9>malloc
|
|
|
|
|
|
// databuf=(u16*)pic_memalloc(1024); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>bi4width<74><68>С<EFBFBD><D0A1><EFBFBD>ֽڵ<D6BD><DAB5>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD> ,<2C><>240<34><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,480<38><30><EFBFBD>ֽھ<DABE><CDB9><EFBFBD>.
|
|
|
|
|
|
// if(databuf==NULL)return PIC_MEM_ERR; //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>.
|
|
|
|
|
|
// f_bmp=(FIL *)pic_memalloc(sizeof(FIL)); //<2F><><EFBFBD><EFBFBD>FIL<49>ֽڵ<D6BD><DAB5>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// if(f_bmp==NULL) //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>.
|
2025-06-27 00:32:57 +08:00
|
|
|
|
// {
|
|
|
|
|
|
// pic_memfree(databuf);
|
|
|
|
|
|
// return PIC_MEM_ERR;
|
|
|
|
|
|
// }
|
|
|
|
|
|
//#else
|
|
|
|
|
|
// databuf=(u16*)bmpreadbuf;
|
|
|
|
|
|
// f_bmp=&f_bfile;
|
|
|
|
|
|
//#endif
|
2025-07-05 19:47:28 +08:00
|
|
|
|
// bmpheadsize=sizeof(hbmp);//<2F>õ<EFBFBD>bmp<6D>ļ<EFBFBD>ͷ<EFBFBD>Ĵ<EFBFBD>С
|
|
|
|
|
|
// mymemset((u8*)&hbmp,0,sizeof(hbmp));//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>뵽<EFBFBD><EBB5BD><EFBFBD>ڴ<EFBFBD>.
|
|
|
|
|
|
// hbmp.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);//<2F><>Ϣͷ<CFA2><CDB7>С
|
|
|
|
|
|
// hbmp.bmiHeader.biWidth=width; //bmp<6D>Ŀ<EFBFBD><C4BF><EFBFBD>
|
|
|
|
|
|
// hbmp.bmiHeader.biHeight=height; //bmp<6D>ĸ߶<C4B8>
|
|
|
|
|
|
// hbmp.bmiHeader.biPlanes=1; //<2F><>Ϊ1
|
|
|
|
|
|
// hbmp.bmiHeader.biBitCount=16; //bmpΪ16λɫbmp
|
|
|
|
|
|
// hbmp.bmiHeader.biCompression=BI_BITFIELDS;//ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD>صı<D8B5><C4B1><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// hbmp.bmiHeader.biSizeImage=hbmp.bmiHeader.biHeight*hbmp.bmiHeader.biWidth*hbmp.bmiHeader.biBitCount/8;//bmp<6D><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
2025-06-27 00:32:57 +08:00
|
|
|
|
//
|
2025-07-05 19:47:28 +08:00
|
|
|
|
// hbmp.bmfHeader.bfType=((u16)'M'<<8)+'B';//BM<42><4D>ʽ<EFBFBD><CABD>־
|
|
|
|
|
|
// hbmp.bmfHeader.bfSize=bmpheadsize+hbmp.bmiHeader.biSizeImage;//<2F><><EFBFBD><EFBFBD>bmp<6D>Ĵ<EFBFBD>С
|
|
|
|
|
|
// hbmp.bmfHeader.bfOffBits=bmpheadsize;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
// hbmp.RGB_MASK[0]=0X00F800; //<2F><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
|
|
|
|
|
|
// hbmp.RGB_MASK[1]=0X0007E0; //<2F><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
|
|
|
|
|
|
// hbmp.RGB_MASK[2]=0X00001F; //<2F><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
// if(mode==1)res=f_open(f_bmp,(const TCHAR*)filename,FA_READ|FA_WRITE);//<2F><><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>֮ǰ<D6AE><C7B0><EFBFBD>ļ<EFBFBD>
|
|
|
|
|
|
// if(mode==0||res==0x04)res=f_open(f_bmp,(const TCHAR*)filename,FA_WRITE|FA_CREATE_NEW);//ģʽ0,<2C><><EFBFBD>߳<EFBFBD><DFB3>Դ<EFBFBD><D4B4><EFBFBD>ʧ<EFBFBD><CAA7>,<2C><EFBFBD><F2B4B4BD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
|
|
|
|
|
// if((hbmp.bmiHeader.biWidth*2)%4)//ˮƽ<CBAE><C6BD><EFBFBD><EFBFBD>(<28>ֽ<EFBFBD>)<29><>Ϊ4<CEAA>ı<EFBFBD><C4B1><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
// {
|
2025-07-05 19:47:28 +08:00
|
|
|
|
// bi4width=((hbmp.bmiHeader.biWidth*2)/4+1)*4;//ʵ<><CAB5>Ҫд<D2AA><D0B4><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>Ϊ4<CEAA>ı<EFBFBD><C4B1><EFBFBD>.
|
|
|
|
|
|
// }else bi4width=hbmp.bmiHeader.biWidth*2; //<2F>պ<EFBFBD>Ϊ4<CEAA>ı<EFBFBD><C4B1><EFBFBD>
|
|
|
|
|
|
// if(res==FR_OK)//<2F><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
// {
|
2025-07-05 19:47:28 +08:00
|
|
|
|
// res=f_write(f_bmp,(u8*)&hbmp,bmpheadsize,&bw);//д<><D0B4>BMP<4D>ײ<EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
// for(ty=y+height-1;hbmp.bmiHeader.biHeight;ty--)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// pixcnt=0;
|
|
|
|
|
|
// for(tx=x;pixcnt!=(bi4width/2);)
|
|
|
|
|
|
// {
|
2025-07-05 19:47:28 +08:00
|
|
|
|
// if(pixcnt<hbmp.bmiHeader.biWidth)databuf[pixcnt]=LCD_ReadPoint(tx,ty);//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|
|
|
|
|
// else databuf[pixcnt]=0Xffff;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
2025-06-27 00:32:57 +08:00
|
|
|
|
// pixcnt++;
|
|
|
|
|
|
// tx++;
|
|
|
|
|
|
// }
|
|
|
|
|
|
// hbmp.bmiHeader.biHeight--;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
// res=f_write(f_bmp,(u8*)databuf,bi4width,&bw);//д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
// }
|
|
|
|
|
|
// f_close(f_bmp);
|
|
|
|
|
|
// }
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//#if BMP_USE_MALLOC == 1 //ʹ<><CAB9>malloc
|
2025-06-27 00:32:57 +08:00
|
|
|
|
// pic_memfree(databuf);
|
|
|
|
|
|
// pic_memfree(f_bmp);
|
|
|
|
|
|
//#endif
|
|
|
|
|
|
// return res;
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|