bmp.h
#define u8 unsigned char
#define u32 unsigned long
#define u16 unsigned short
int BMP_HEAD_WIDTH[4] = { 18,19,20,21 }; //图片宽度(像素)
int BMP_HEAD_HEIGH[4] = { 22,23,24,25 }; //图片高度(像素)
u8 BMP_HEAD[54] = {
0x42,//B
0x4D,//M
/*文件总字节数*/
0x46,//2
0x00,//3
0x00,//4
0x00,//5
/*保留*/
0x00,
0x00,
0x00,
0x00,
/*文件头+信息头大小(14+40)*/
0x36,
0x00,
0x00,
0x00,
/*信息头大小*/
0x28,
0x00,
0x00,
0x00,
/*宽度*/
0x02,//18
0x00,//19
0x00,//20
0x00,//21
/*高度*/
0x02,//22
0x00,//23
0x00,//24
0x00,//25
/*固定值*/
0x01,
0x00,
/*每个像素的位数24*/
0x18,//28
0x00,//29
/*压缩方式*/
0x00,
0x00,
0x00,
0x00,
/*位图所有像素所占字节数*/
0x00,
0x00,
0x00,
0x00,
/*水平分辨率 pex/m*/
0x00,//38
0x00,//39
0x00,//40
0x00,//41
/*垂直分辨率 pex/m*/
0x00,//42
0x00,//43
0x00,//44
0x00,//45
/*使用的颜色数*/
0x00,
0x00,
0x00,
0x00,
/*重要的颜色数*/
0x00,
0x00,
0x00,
0x00
};
main.cpp
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string>
#include "bmp.h"
#include <iostream>
#include <fstream>
using namespace std;
#define PIC_HEIGH 200
#define PIC_WIDTH 200
#define RGB565_MASK_RED 0xF800
#define RGB565_MASK_GREEN 0x07E0
#define RGB565_MASK_BLUE 0x001F
/**
*函数功能:把rgb888数据写入24位bmp中
* 参数: width,height,*RgbData
**/
/*像素点数据 从最后一行开始,从左到右*/
u8 bmp_data[PIC_HEIGH][PIC_WIDTH*3] = {0};
void WriteRgb8882Bmp(char*filename, int heigh,int width)
{
int i = 0,j=0;
int BmpHeadLeng = 54;
FILE* fp = fopen(filename, "w+");//D://Users//wzx//Desktop//
/*将宽高转换成16进制*/
/*修改宽高*/
BMP_HEAD[BMP_HEAD_WIDTH[0]] = width & 0xff;
BMP_HEAD[BMP_HEAD_WIDTH[1]] = width & 0xff00;
BMP_HEAD[BMP_HEAD_WIDTH[2]] = width & 0xff0000;
BMP_HEAD[BMP_HEAD_WIDTH[3]] = width & 0xff000000;
BMP_HEAD[BMP_HEAD_HEIGH[0]] = heigh & 0xff;
BMP_HEAD[BMP_HEAD_HEIGH[1]] = heigh & 0xff00;
BMP_HEAD[BMP_HEAD_HEIGH[2]] = heigh & 0xff0000;
BMP_HEAD[BMP_HEAD_HEIGH[3]] = heigh & 0xff000000;
/*将文件头写入文件*/
for (i = 0;i < 54;i++)
{
fprintf(fp,"%c",BMP_HEAD[i]);
}
int col_len = sizeof(bmp_data[0]); //列数一行的字节数 必须是4的倍数,每个像素点用3个字节表示
int row_len = sizeof(bmp_data)/col_len;//行数
/*写入图片数据*/
for (i = 0;i < row_len;i++)
{
for (j = col_len;j > 0 ;j--)
{
fprintf(fp, "%c", bmp_data[i][j]);
}
//一行数据写完
if (col_len % 4 != 0) //一行的像素点数如果不是4的倍数,补0
{
for (int ii = 0;ii < col_len % 4;ii++)
{
fprintf(fp, "%c", 0x00);
}
}
}
fclose(fp);
}
unsigned int ASC2X(unsigned char ch)
{
if (ch >= 'A' && ch <= 'F')
return ch - 'A' + 10;
else if (ch >= '0' && ch <= '9')
return ch - '0';
}
u8* Rgb565ToRgb888(u16 rgb565)
{
u8 rgb24[3] = { 0 };
rgb24[0] = (rgb565 & RGB565_MASK_RED) >> 11;
rgb24[1] = (rgb565 & RGB565_MASK_GREEN) >> 5;
rgb24[2] = (rgb565 & RGB565_MASK_BLUE);
//往高位移动填满单字节的8位
rgb24[2] <<= 3;
rgb24[1] <<= 2;
rgb24[0] <<= 3;
//返回:RGB
return rgb24;
}
void ReadDataFromFile()
{
int i = 0;
FILE* fp = fopen("d:\\rgb.txt", "r");
char HB[2] = { 0 };
char LB[2] = { 0 };
char temp[8] = { 0 };
char ch = fgetc(fp);
u32 hync = 0,pclk=0;
u16 RGB565 = 0;
while (ch != EOF)
{
while (ch != '\n')
{
temp[7-i] = ch;
i++;
ch = fgetc(fp);
}
//第一个点
RGB565 = (((ASC2X(temp[3]) << 4)|(ASC2X(temp[2])) )<<8)|(ASC2X(temp[1])<<4)| ASC2X(temp[0]);
bmp_data[hync][pclk] = *(Rgb565ToRgb888(RGB565) + 2); //B
bmp_data[hync][pclk + 1] = *(Rgb565ToRgb888(RGB565) + 1); //G
bmp_data[hync][pclk + 2] = * Rgb565ToRgb888(RGB565); //R
pclk += 3;
//第二个点
RGB565 = (((ASC2X(temp[7]) << 4) | (ASC2X(temp[6]))) << 8) | (ASC2X(temp[5]) << 4) | ASC2X(temp[4]);
bmp_data[hync][pclk] = *(Rgb565ToRgb888(RGB565) + 2); //B
bmp_data[hync][pclk + 1] = *(Rgb565ToRgb888(RGB565) + 1); //G
bmp_data[hync][pclk + 2] = * Rgb565ToRgb888(RGB565); //R
pclk += 3;
i = 0;
ch = fgetc(fp);
if (pclk >= 3 * PIC_WIDTH)
{
hync++;
pclk = 0;
}
}
}
int main()
{
ReadDataFromFile();
WriteRgb8882Bmp("D://Users//wzx//Desktop//result.bmp", PIC_HEIGH, PIC_WIDTH);
}