Files
player/Project/Src/JPEG/bmp.c

532 lines
15 KiB
C
Raw Normal View History

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><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;
}