TA的每日心情 | 奋斗 2018-8-29 20:40 |
---|
签到天数: 1341 天 连续签到: 1 天 [LV.10]以坛为家III
|
将SD卡中的8位灰度图片读取出来 并显示
部分代码- #include "wwBMP.h"
- #include "inc/hw_types.h"
- #include "inc/lm3s9b96.h"
- #include "inc/hw_sysctl.h"
- #include "inc/hw_memmap.h"
- //
- // 2 - 非bmp文件
- // 4 - 信息头错误
- // 5 - 不是灰度图像格式!
- // 6 - 使用了调色板 暂不支持
- // 8 - 文件太大
- short readBMP(void)
- {
- // 利用SD卡读取文件 ,
- // 第一步默认文件名为 "testbmp"
- // 先直接进入根目录
- int nStatus;
- FRESULT fresult;
- char cTmpBuf[PATH_BUF_SIZE] = "/testbmp.bmp";
- unsigned short usBytesRead;
- BITMAPFILEHEADER bmpfileheader;
- BITMAPINFOHEADER bmpinfoheader;
- DWORD fileSize = 0; // 整个全部文件的大小
- DWORD bfOffBits = 0; // 到数据区的偏移量
- DWORD ImageSize = 0; // 位图数据的大小
- DWORD temp2 = 0;
- short temp1 =0;
- int i=0;
- int j=0;
- BYTE RGBQUAD[4];
-
- fresult = f_mount(0, &g_sFatFs);
- if(fresult != FR_OK)
- {
- return fresult;
- }
- // 现在已经进入了根目录了
- // 打开文件.
- fresult = f_open(&g_sFileObject, cTmpBuf, FA_READ);
- if(fresult != FR_OK)
- return(fresult);
- // 读取文件头
- // fresult = f_read(&g_sFileObject, &bmpfileheader, sizeof(bmpfileheader),&usBytesRead);
- fresult = f_read(&g_sFileObject, &bmpfileheader, 14,&usBytesRead);
- if(fresult != FR_OK)
- return(fresult);
- // 判断文件信息
- if (bmpfileheader.bfType != 0x4d42)
- {
- return 2;
- }
- fileSize = bmpfileheader.bfSize;
- bfOffBits = bmpfileheader.bfOffBits;
- // 读取信息头
- fresult = f_read(&g_sFileObject, &bmpinfoheader, 40, &usBytesRead);
- if(fresult != FR_OK)
- return(fresult);
- if(usBytesRead != 40)
- return 4;
- // 获取调色板 文件大小 文件长度 行列
- if(bmpinfoheader.biBitCount != 8)
- return 5;
- if((bmpinfoheader.biClrUsed !=0) && (bmpinfoheader.biClrUsed !=256))
- {
- return 6;
- }
-
- ImageSize = bmpinfoheader.biSizeImage;
- g_bmpWidth = bmpinfoheader.biWidth;
- g_bmpHeight = bmpinfoheader.biHeight;
- g_bytePerLine = BytePerline(g_bmpWidth * 8);
-
- // 填充 g_wwImage 数据
- g_wwImage[1] = g_bmpWidth;
- g_wwImage[3] = g_bmpHeight;
- // 跳过调色板 直接读取实际数据 并显示出来
- for(i=0; i<256; i++)
- fresult = f_read(&g_sFileObject, RGBQUAD, 4, &usBytesRead);
- // 读取实际数据 并按一行一行的显示
- if(g_bmpWidth >240 || g_bmpHeight>240)
- return 8;
- // 注意是bmp文件时倒序的
- for(i=0; i<g_bmpHeight; i++)
- {
- fresult = f_read(&g_sFileObject, g_bmpLineData, g_bytePerLine, &usBytesRead);
- // 填充 g_wwImage 数据
- for(j=0; j<g_bytePerLine; j++)
- {
- g_wwImage[774 + (g_bmpHeight-i)*g_bytePerLine + j] = g_bmpLineData[j];
- }
- }
- // 关键是怎么显示出来
- // 考虑利用 GrImageDraw 函数
- f_close(&g_sFileObject);
- return(0);
- }
复制代码 运行结果
|
|