20231023_InSituLab_emb/InsituLabProject_QRS/Src/Usr/Tool/ToolRgb565ToBmp.c

133 lines
5.6 KiB
C
Raw Permalink Normal View History

#include "ToolRgb565ToBmp.h"
#include <stdio.h>
#pragma pack (1)
/***********
14
2byte 0x4d42"BM"
4byte
4byte 0
4byte
*************/
typedef struct {
unsigned short FileType;
unsigned int ImageSize;
unsigned int Blank;
unsigned int StartPosition;
} BMP_HEAD;
/***********
40
4byte 40
4byte
4byte
2Byte 1
2Byte
1()4(16)8(256)24()
4byte
BI_RGBBI_RLE8BI_RLE4BI_BITFIELDS
Windows位图可采用RLE4和RLE8的压缩格式BI_RGB表示不压缩
4byte
= Width' * Height * byte数(/8,24bit图为32561
biWidth'4
(biWidthbiWidth的最小4的整数倍)
biCompression为BI_RGB0
4byte
4byte
4byte
02(),
82^8=256,256
4byte 0
***********************************/
typedef struct {
unsigned int Length;
unsigned int Width;
unsigned int Height;
unsigned short ColorPlane;
unsigned short BitColor;
unsigned int ZipFormat;
unsigned int RealSize;
unsigned int Xpels;
unsigned int Ypels;
unsigned int ColorUse;
unsigned int ColorImportant;
} BMP_INFO_HEAD;
/***************************
256BMP位图82^8 = 256
24bitBMP位图RGB值直接保存在图像数据区
rgbBlue
rgbGreen 绿
rgbRed
rgbReserved
************************/
typedef struct {
unsigned char RgbBlue;
unsigned char RgbGreen;
unsigned char RgbRed;
unsigned char Reserve;
} RGB_MIX_PLATE;
#pragma pack()
/****************************
BMP图片的信息
nWidth :
nHeight :
fp1 :
*****************************/
int ToolRgb565ToBmpInfo(unsigned int nWidth, unsigned int nHeight, FIL *fp1)
{
BMP_HEAD BmpHeader;
BMP_INFO_HEAD BmpInfoHeader;
unsigned int WritenLen = 0;
/* 写入文件属性信息 */
BmpHeader.FileType = 0x4d42;
BmpHeader.ImageSize = nWidth * nHeight * 3 + 54;
BmpHeader.Blank = 0;
BmpHeader.StartPosition = 54;
f_write(fp1, &BmpHeader.FileType, sizeof(BmpHeader.FileType), &WritenLen);
f_write(fp1, &BmpHeader.ImageSize, sizeof(BmpHeader.ImageSize), &WritenLen);
f_write(fp1, &BmpHeader.Blank, sizeof(BmpHeader.Blank), &WritenLen);
f_write(fp1, &BmpHeader.StartPosition, sizeof(BmpHeader.StartPosition), &WritenLen);
/* 写入位图信息 */
BmpInfoHeader.Length = 40; // 固定值
BmpInfoHeader.Width = nWidth;
BmpInfoHeader.Height = nHeight;
BmpInfoHeader.ColorPlane = 1; // 固定值
BmpInfoHeader.BitColor = 24;
BmpInfoHeader.ZipFormat = 0;
BmpInfoHeader.RealSize = nWidth * nHeight * 3;
BmpInfoHeader.Xpels = 0;
BmpInfoHeader.Ypels = 0;
BmpInfoHeader.ColorUse = 0;
BmpInfoHeader.ColorImportant = 0;
f_write(fp1, &BmpInfoHeader.Length, sizeof(BmpInfoHeader.Length), &WritenLen);
f_write(fp1, &BmpInfoHeader.Width, sizeof(BmpInfoHeader.Width), &WritenLen);
f_write(fp1, &BmpInfoHeader.Height, sizeof(BmpInfoHeader.Height), &WritenLen);
f_write(fp1, &BmpInfoHeader.ColorPlane, sizeof(BmpInfoHeader.ColorPlane), &WritenLen);
f_write(fp1, &BmpInfoHeader.BitColor, sizeof(BmpInfoHeader.BitColor), &WritenLen);
f_write(fp1, &BmpInfoHeader.ZipFormat, sizeof(BmpInfoHeader.ZipFormat), &WritenLen);
f_write(fp1, &BmpInfoHeader.RealSize, sizeof(BmpInfoHeader.RealSize), &WritenLen);
f_write(fp1, &BmpInfoHeader.Xpels, sizeof(BmpInfoHeader.Xpels), &WritenLen);
f_write(fp1, &BmpInfoHeader.Ypels, sizeof(BmpInfoHeader.Ypels), &WritenLen);
f_write(fp1, &BmpInfoHeader.ColorUse, sizeof(BmpInfoHeader.ColorUse), &WritenLen);
f_write(fp1, &BmpInfoHeader.ColorImportant, sizeof(BmpInfoHeader.ColorImportant), &WritenLen);
return 0;
}
/****************************
RGB加上头部信息转换成BMP
rgb_buffer :RGB数据文件中的信息
RgbBufferLen :RGB数据的长度
fp1 :
*****************************/
int ToolRgb565ToBmpByte(char *RgbBuffer, uint32_t RgbBufferLen, FIL *fp1)
{
unsigned int WritenLen = 0;
f_write(fp1, RgbBuffer, RgbBufferLen, &WritenLen);
return 0;
}