📄 bmp_show.c
字号:
#include "def.h"
#include "uart.h"
#include "2410lib.h"
#include "BMP_show.h"
#include "240_320TFT_LCD.h"
#include "nandflash_k9f1208.h"
//================================================================================================
// BITMAP_FILE_HEADER BITMAP_FILE_HEADER_U16的区别是 结构体在内存中的表示 。BITMAP_FILE_HEADER占
// 16字节 BITMAP_FILE_HEADER_U16占14字节 原因是内存对齐。前一个以对齐,所以在其一个变量后补充半字
// 导致bmp头文件时出错。解决的方法是换成半字对齐的数据结构,不存在字节补充。
typedef struct tagBITMAPFILEHEADER{
U16 bfType; //两字节的内容用来识别位图的类型:‘BM’ : Windows 3.1x, 95, NT, …
U32 bfSize; //表示的整个文件的大小
U32 bfReserved1;
U32 bfOffBits; //从文件开始到位图数据开始之间的数据(bitmap data)之间的偏移量
}BITMAP_FILE_HEADER;
typedef struct tagBITMAPFILEHEADER_U16{
U16 bfType; //两字节的内容用来识别位图的类型:‘BM’ : Windows 3.1x, 95, NT, …
U16 bfSizel; //表示的整个文件的大小
U16 bfSizeh;
U16 bfReserved1l;
U16 bfReserved1h;
U16 bfOffBitsl;
U16 bfOffBitsh; //从文件开始到位图数据开始之间的数据(bitmap data)之间的偏移量
}BITMAP_FILE_HEADER_U16;
//================================================================================================
//================================================================================================
typedef struct tagBITMAPINFOHEADER {
U32 biSize; //下面的长度表示:28h - Windows 3.1x, 95, NT, …
U32 biWidth; //以像素为单位的图像宽度
U32 biHeight; //以像素为单位的图像长度
U16 biPlanes;
U16 biBitCount; // 每个像素的位数
U32 biCompression;
U32 biSizeImage;
U32 biXPelsPerMeter;
U32 biYPelsPerMeter;
U32 biClrUsed;
U32 biClrImportant;
}BITMAP_INFO_HEADER ;
typedef struct tagBITMAPINFOHEADER_U32 {
U32 biSize; //下面的长度表示:28h - Windows 3.1x, 95, NT, …
U32 biWidth; //以像素为单位的图像宽度
U32 biHeight; //以像素为单位的图像长度
U32 biPlanes_biBitCount; // 每个像素的位数
U32 biCompression;
U32 biSizeImage;
U32 biXPelsPerMeter;
U32 biYPelsPerMeter;
U32 biClrUsed;
U32 biClrImportant;
}BITMAP_INFO_HEADER_U32;
//================================================================================================
//=============================================================================================
typedef struct rgb_24bit {// bmp主数据区按b ,g ,r 的顺序存放各像素的信息 8bit数据 为以后数据处理方便变为16bit
U16 B;
U16 G;
U16 R;
U16 NUMBER;
}RGB_24bit;
typedef struct rgb_16bit {
U8 first;
U8 second;
U16 NUMBER;
}RGB_16bit;
//=============================================================================================
static BITMAP_FILE_HEADER BITMAP_FILE_HEADER1;
static BITMAP_FILE_HEADER_U16 BITMAP_FILE_HEADER1_U16;
static BITMAP_INFO_HEADER BITMAP_INFO_HEADER1;
static BITMAP_INFO_HEADER_U32 BITMAP_INFO_HEADER1_U32;
extern unsigned short LCD_BUFER[SCR_YSIZE_TFT_240_320][SCR_XSIZE_TFT_240_320];
extern U8 BMP_RAM_BUFFER[512*32];
static void Get_Bmp_Imformation(U8 *bmp_address)
{ U8 *struct_address;
int i;
struct_address = (LPSTR)&BITMAP_FILE_HEADER1_U16;
i = sizeof(BITMAP_FILE_HEADER_U16);
for(; i>0; i--) { //将bmp文件信息考到结构体中。
*(struct_address++) = *(bmp_address++);
}
BITMAP_FILE_HEADER1.bfType = BITMAP_FILE_HEADER1_U16.bfType;
BITMAP_FILE_HEADER1.bfSize = BITMAP_FILE_HEADER1_U16.bfSizel + ( BITMAP_FILE_HEADER1_U16.bfSizeh<<16);
BITMAP_FILE_HEADER1.bfReserved1 =BITMAP_FILE_HEADER1_U16.bfReserved1l + ( BITMAP_FILE_HEADER1_U16.bfReserved1h<<16);
BITMAP_FILE_HEADER1.bfOffBits = BITMAP_FILE_HEADER1_U16.bfOffBitsl + ( BITMAP_FILE_HEADER1_U16.bfOffBitsh<<16) ;
struct_address = (LPSTR)&BITMAP_INFO_HEADER1_U32;
i = sizeof(BITMAP_INFO_HEADER_U32);
for(; i>0; i--) { //将bmp文件信息考到结构体中。
*(struct_address++) = *(bmp_address++);
}
BITMAP_INFO_HEADER1.biSize = BITMAP_INFO_HEADER1_U32.biSize;
BITMAP_INFO_HEADER1.biWidth = BITMAP_INFO_HEADER1_U32.biWidth;
BITMAP_INFO_HEADER1.biHeight = BITMAP_INFO_HEADER1_U32.biHeight;
BITMAP_INFO_HEADER1.biPlanes = BITMAP_INFO_HEADER1_U32.biPlanes_biBitCount & 0xFFFF;
BITMAP_INFO_HEADER1.biBitCount = (BITMAP_INFO_HEADER1_U32.biPlanes_biBitCount>>16);
BITMAP_INFO_HEADER1.biCompression = BITMAP_INFO_HEADER1_U32.biCompression;
BITMAP_INFO_HEADER1.biSizeImage = BITMAP_INFO_HEADER1_U32.biSizeImage;
BITMAP_INFO_HEADER1.biXPelsPerMeter = BITMAP_INFO_HEADER1_U32.biXPelsPerMeter;
BITMAP_INFO_HEADER1.biClrUsed = BITMAP_INFO_HEADER1_U32.biClrUsed;
BITMAP_INFO_HEADER1.biClrImportant = BITMAP_INFO_HEADER1_U32.biClrImportant;
}
U32 Load_OnePageOf_BMP( U32 bmp_start_address){
int bad_block;
int i;
U8* bmp_start_address1 ;
bmp_start_address1 =(U8*)bmp_start_address;
if(bmp_start_address>=0x30000000 & bmp_start_address<=0x34000000 )
{
for(i=0;i<512;i++) BMP_RAM_BUFFER[i]=*bmp_start_address1++;
bmp_start_address +=512;
}
else if(bmp_start_address<=0x04000000)
{
bad_block = ReadOnePageFromNandFlash(bmp_start_address,BMP_RAM_BUFFER);
bmp_start_address +=512*(1 + bad_block*32);
}
return bmp_start_address;
}
U32 Load_OneBlockOf_BMP( U32 bmp_start_address){
int bad_block;
int i;
U8* bmp_start_address1 ;
bmp_start_address1 =(U8*)bmp_start_address;
if(bmp_start_address>=0x30000000 & bmp_start_address<=0x34000000 )
{
for(i=0;i<512*PAGE_PER_BLOCK;i++) BMP_RAM_BUFFER[i]=*bmp_start_address1++;
bmp_start_address +=512*PAGE_PER_BLOCK;
}
else if(bmp_start_address<=0x04000000)
{
bad_block = ReadOneBlockFromNandFlash(bmp_start_address,BMP_RAM_BUFFER);
bmp_start_address +=512*PAGE_PER_BLOCK*(1 + bad_block*32);
}
return bmp_start_address;
}
void Display_OnePageOf_BMP_24(void)
{
U8 blank; // Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充.这一点相当重要
U16 x0,y0;
U16 RGB_LCD;
U16 i;
static BMP_Piex_PerLine = 0;
static BMP_Lines = 0 ;
static RGB_24bit RGB_24bit1;
static U16 FIRST_DISPLAY_ADDR=0;
static U8 first_time=0;
if((BITMAP_INFO_HEADER1.biWidth*BITMAP_INFO_HEADER1.biBitCount/8) % 4 !=0 )
blank =4- (BITMAP_INFO_HEADER1.biWidth*BITMAP_INFO_HEADER1.biBitCount/8) % 4 ;
else blank=0;
x0 = (SCR_XSIZE_TFT_240_320 - BITMAP_INFO_HEADER1.biWidth)/2; // 求得bmp图片方的起始点,使图片在虚拟显示空间的当中。
y0 = (SCR_YSIZE_TFT_240_320 - BITMAP_INFO_HEADER1.biHeight)/2;
if (first_time == 0) {
FIRST_DISPLAY_ADDR = BITMAP_FILE_HEADER1.bfOffBits;
first_time =1;
RGB_24bit1.NUMBER = 0;
}
for(i=FIRST_DISPLAY_ADDR;i<512;i++)
{
if(RGB_24bit1.NUMBER==0)
{ RGB_24bit1.B = BMP_RAM_BUFFER[i]; RGB_24bit1.NUMBER++;}
else if(RGB_24bit1.NUMBER==1)
{ RGB_24bit1.G = BMP_RAM_BUFFER[i]; RGB_24bit1.NUMBER++;}
else if(RGB_24bit1.NUMBER==2)
{ RGB_24bit1.R = BMP_RAM_BUFFER[i]; RGB_24bit1.NUMBER++;}
if(RGB_24bit1.NUMBER==3){ //do not use else if
RGB_24bit1.NUMBER = 0;
RGB_LCD = ( RGB_24bit1.B >>3 ) | ((RGB_24bit1.G >>2)<<5) | ((RGB_24bit1.R >>3)<<11);
LCD_BUFER[y0-BMP_Lines+BITMAP_INFO_HEADER1.biHeight-1][x0+BMP_Piex_PerLine]= RGB_LCD;
BMP_Piex_PerLine ++;
if(BMP_Piex_PerLine == BITMAP_INFO_HEADER1.biWidth){
BMP_Piex_PerLine=0;
BMP_Lines++;
if(BMP_Lines== BITMAP_INFO_HEADER1.biHeight) return ;
i += blank;
if(i>511) { FIRST_DISPLAY_ADDR = i - 512; return ; }
}
}
}//end for
FIRST_DISPLAY_ADDR=0;
}
void Display_OneBlockOf_BMP_24(void)
{
U8 blank; // Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充.这一点相当重要
U16 x0,y0;
U16 RGB_LCD;
U16 i;
static BMP_Piex_PerLine = 0;
static BMP_Lines = 0 ;
static RGB_24bit RGB_24bit1;
static U16 FIRST_DISPLAY_ADDR=0;
static U8 first_time=0;
if((BITMAP_INFO_HEADER1.biWidth*BITMAP_INFO_HEADER1.biBitCount/8) % 4 !=0 )
blank =4- (BITMAP_INFO_HEADER1.biWidth*BITMAP_INFO_HEADER1.biBitCount/8) % 4 ;
else blank=0;
x0 = (SCR_XSIZE_TFT_240_320 - BITMAP_INFO_HEADER1.biWidth)/2; // 求得bmp图片方的起始点,使图片在虚拟显示空间的当中。
y0 = (SCR_YSIZE_TFT_240_320 - BITMAP_INFO_HEADER1.biHeight)/2;
if (first_time == 0) {
FIRST_DISPLAY_ADDR = BITMAP_FILE_HEADER1.bfOffBits;
first_time =1;
RGB_24bit1.NUMBER = 0;
}
for(i=FIRST_DISPLAY_ADDR;i<512*PAGE_PER_BLOCK;i++)
{
if(RGB_24bit1.NUMBER==0)
{ RGB_24bit1.B = BMP_RAM_BUFFER[i]; RGB_24bit1.NUMBER++;}
else if(RGB_24bit1.NUMBER==1)
{ RGB_24bit1.G = BMP_RAM_BUFFER[i]; RGB_24bit1.NUMBER++;}
else if(RGB_24bit1.NUMBER==2)
{ RGB_24bit1.R = BMP_RAM_BUFFER[i]; RGB_24bit1.NUMBER++;}
if(RGB_24bit1.NUMBER==3){ //do not use else if
RGB_24bit1.NUMBER = 0;
RGB_LCD = ( RGB_24bit1.B >>3 ) | ((RGB_24bit1.G >>2)<<5) | ((RGB_24bit1.R >>3)<<11);
LCD_BUFER[y0-BMP_Lines+BITMAP_INFO_HEADER1.biHeight-1][x0+BMP_Piex_PerLine]= RGB_LCD;
BMP_Piex_PerLine ++;
if(BMP_Piex_PerLine == BITMAP_INFO_HEADER1.biWidth){
BMP_Piex_PerLine=0;
BMP_Lines++;
if(BMP_Lines== BITMAP_INFO_HEADER1.biHeight) return ;
i += blank;
if(i>512*PAGE_PER_BLOCK-1) { FIRST_DISPLAY_ADDR = i - 512*PAGE_PER_BLOCK; return ; }
}
}
}//end for
FIRST_DISPLAY_ADDR=0;
}
void Display_OnePageOf_BMP_16(void)
{
U8 blank; // Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充.这一点相当重要
U16 x0,y0;
U16 RGB_LCD;
U16 i;
static BMP_Piex_PerLine = 0;
static BMP_Lines = 0 ;
static RGB_16bit RGB_16bit1;
static U16 FIRST_DISPLAY_ADDR=0;
static U8 first_time=0;
if((BITMAP_INFO_HEADER1.biWidth*BITMAP_INFO_HEADER1.biBitCount/8) % 4 !=0 )
blank =4- (BITMAP_INFO_HEADER1.biWidth*BITMAP_INFO_HEADER1.biBitCount/8) % 4 ;
else blank=0;
x0 = (SCR_XSIZE_TFT_240_320 - BITMAP_INFO_HEADER1.biWidth)/2; // 求得bmp图片方的起始点,使图片在虚拟显示空间的当中。
y0 = (SCR_YSIZE_TFT_240_320 - BITMAP_INFO_HEADER1.biHeight)/2;
if (first_time == 0) {
FIRST_DISPLAY_ADDR = BITMAP_FILE_HEADER1.bfOffBits;
first_time =1;
RGB_16bit1.NUMBER = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -