具体代码及解析如下:
BMP的编码:
void save_bmp(int n) //拍照保存BMP图像到SD卡中
{
FIL fp;
FRESULT ret;
char file_name[40] = "\0"; //BMP图像名称
unsigned int wsbyte = 0;
int i,j;
u16 color = 0;
sprintf(file_name, "0:stm32_pic/photo%d.bmp", n); //拼接字符串
printf("%s\r\n", file_name);
ret = f_open(&fp, file_name, FA_CREATE_ALWAYS | FA_WRITE ); //创建BMP文件
if(ret != FR_OK)
{
printf("打开文件失败!\r\n");
}
if(ret == FR_OK)
{
printf("打开文件成功!\r\n");
//填写文件信息头信息
bmp.bmfHeader.bfType = 0x4D42; //bmp类型 "BM"
bmp.bmfHeader.bfSize= 54 + 320*240*2; //文件大小(信息结构体+像素数据)
bmp.bmfHeader.bfReserved1 = 0x0000; //保留,必须为0
bmp.bmfHeader.bfReserved2 = 0x0000;
bmp.bmfHeader.bfOffBits=54; //位图信息结构体所占的字节数
//填写位图信息头信息
bmp.bmiHeader.biSize=40; //位图信息头的大小
bmp.bmiHeader.biWidth=320; //位图的宽度
bmp.bmiHeader.biHeight=240; //图像的高度
bmp.bmiHeader.biPlanes=1; //目标设别的级别,必须是1
bmp.bmiHeader.biBitCount=16; //每像素位数
bmp.bmiHeader.biCompression=3; //RGB555格式
bmp.bmiHeader.biSizeImage=320*240*2; //实际位图所占用的字节数(仅考虑位图像素数据)
bmp.bmiHeader.biXPelsPerMeter=0; //水平分辨率
bmp.bmiHeader.biYPelsPerMeter=0; //垂直分辨率
bmp.bmiHeader.biClrImportant=0; //说明图像显示有重要影响的颜色索引数目,0代表所有的颜色一样重要
bmp.bmiHeader.biClrUsed=0; //位图实际使用的彩色表中的颜色索引数,0表示使用所有的调色板项
//RGB565格式掩码
bmp.RGB_MASK[0].rgbBlue = 0;
bmp.RGB_MASK[0].rgbGreen = 0xF8;
bmp.RGB_MASK[0].rgbRed = 0;
bmp.RGB_MASK[0].rgbReserved = 0;
bmp.RGB_MASK[1].rgbBlue = 0xE0;
bmp.RGB_MASK[1].rgbGreen = 0x07;
bmp.RGB_MASK[1].rgbRed = 0;
bmp.RGB_MASK[1].rgbReserved = 0;
bmp.RGB_MASK[2].rgbBlue = 0x1F;
bmp.RGB_MASK[2].rgbGreen = 0;
bmp.RGB_MASK[2].rgbRed = 0;
bmp.RGB_MASK[2].rgbReserved = 0;
//写文件头进文件
ret= f_write(&fp, &bmp, sizeof(bmp), &wsbyte);
printf("writehead ret:%d writebyte:%d\r\n", ret, wsbyte);
LCD_Scan_Dir(L2R_U2D);
LCD_Set_Window(0,0,240,320); //设置图像显示窗口
for(i=0;i<240;i++)
{
for(j=0;j<320;j++)
{
color = LCD_ReadPoint(i,j); //读取并保存像素点数据
f_write(&fp, &color, sizeof(color), &wsbyte); //对BMP图像文件写入数据
}
}
}
ret = f_close(&fp); //数据写入完毕,关闭文件
if(ret != FR_OK)
{
printf("关闭文件失败!\r\n");
}
printf("关闭文件成功!\r\n");
}
BMP的解码:https://blog.csdn.net/weixin_43793181/article/details/109520302
基于STM32F4开发板的简易照相机完整工程代码:https://download.csdn.net/download/weixin_43793181/20335476