STM32F4开发板BMP图像转码(编码)写入SD卡

具体代码及解析如下:


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/13083116

猜你喜欢

转载自blog.csdn.net/weixin_43793181/article/details/109520220