三、测试程序代码
- /**
- * [url=home.php?mod=space&uid=247401]@brief[/url] 显示灰度图
- * @param x,y : 显示在LCD上的坐标
- * pic_name: 存储在SD卡根目录下的灰度文件名
- * @retval None
- */
- void Lcd_show_bmp(unsigned short int x, unsigned short int y,char *pic_name)
- {
- int i, j;
- int width, height, l_width;
- BITMAPFILEHEADER bitHead;
- BITMAPINFOHEADER bitInfoHead;
- WORD fileType;
- unsigned int read_num;
- f_mount(0, &bmpfs[0]);
- BMP_DEBUG_PRINTF("file mount ok \r\n");
- bmpres = f_open( &bmpfsrc , (char *)pic_name, FA_OPEN_EXISTING | FA_READ);
- if(bmpres == FR_OK)
- {
- BMP_DEBUG_PRINTF("Open file success\r\n");
- /* 读取文件头信息 两个字节*/
- f_read(&bmpfsrc,&fileType,sizeof(WORD),&read_num);
- /* 判断是不是bmp文件 "BM"*/
- if(fileType != 0x4d42)
- {
- BMP_DEBUG_PRINTF("file is not .bmp file!\r\n");
- return;
- }
- else
- {
- BMP_DEBUG_PRINTF("Ok this is .bmp file\r\n");
- }
- /* 读取BMP文件头信息*/
- f_read(&bmpfsrc,&bitHead,sizeof(tagBITMAPFILEHEADER),&read_num);
- showBmpHead(&bitHead);
- /* 读取位图信息头信息 */
- f_read(&bmpfsrc,&bitInfoHead,sizeof(BITMAPINFOHEADER),&read_num);
- showBmpInforHead(&bitInfoHead);
- }
- else
- {
- BMP_DEBUG_PRINTF("file open fail!\r\n");
- return;
- }
- width = bitInfoHead.biWidth;
- height = bitInfoHead.biHeight;
- /* 计算位图的实际宽度并确保它为4的倍数 */
- l_width = WIDTHBYTES(width);
- if(l_width > 320)
- {
- BMP_DEBUG_PRINTF("\n SORRY, PIC IS TOO BIG (<=320)\n");
- return;
- }
-
- /* 设置Lcd Gram 扫描方向为: 右下角-> 左上角 */
- Lcd_GramScan(3);
-
- /* 开一个图片大小的窗口*/
- LCD_OpenWindow(x, y, width, height);
-
- /* 判断是否是8bit灰度图 */
- if(bitInfoHead.biBitCount == 8)
- {
- f_lseek(&bmpfsrc,0x0436);
-
- for(i=0;i< height; i++)
- {
- /* 读取一行bmp的数据到数组pColorData里面 */
- f_read(&bmpfsrc,pColorData,l_width,&read_num);
- for(j=0; j<width; j++) //一行有效信息
- {
- unsigned short d;
- d = pColorData[j];
- LCD_WR_Data(GRAYTORGB16(d)); //写入LCD-GRAM
- }
- }
- }
- else
- {
- BMP_DEBUG_PRINTF("SORRY, THIS PIC IS NOT A 8BITS GRAY Picture!");
- return ;
- }
- f_close(&bmpfsrc);
- }
|