核心代码是RGB565转RGB888,整段代码实现的功能是读取一个RGB565的二进制文件,将其转换为RGB888,然后写成一个二进制文件。
要跑代码的去这里下载RGB565的二进制文件样例。
RGB565转RGB888的原理看这儿RGB565转RGB888原理 (MATLAB代码)_macunshi的专栏-CSDN博客_rgb888转rgb565代码
该样例是1600*1200的图片数据,所以RGB565有1600*1200*16/8/1024=3750KB,读二进制文件的时候按8位去读,共有
1600*1200*16/8=3840000个数值。
写成的RGB888有1600*1200*3*8/8/1024=5625KB,写二进制数据也按照8位去写,共有1600*1200*3*8/8=5760000个数值。
怎么看写成的RGB888数据是不是对的呢?我在给一个用MARLAB读取RGB888查看图像的代码。
在这儿:MATLAB读RGB888数据显示图片_macunshi的专栏-CSDN博客
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define RGB565_RED 0xf800
#define RGB565_GREEN 0x07e0
#define RGB565_BLUE 0x001f
//RGB565转RGB888
void RGB565ToRGB888Char(unsigned char * rgb565,unsigned char * rgb888)
{
unsigned short *n565Color = (unsigned short *)rgb565;
rgb888[0] = (*n565Color & RGB565_RED) >> 8;
rgb888[1] = (*n565Color & RGB565_GREEN) >> 3;
rgb888[2] = (*n565Color & RGB565_BLUE) << 3;
}
//写文件
void write(unsigned char *name, const char *path)
{
FILE *fp;
if ((fp = fopen(path, "wb")) == NULL)
{
cout << "文件打开失败!" << endl;
exit(0);
}
if (fwrite(name, sizeof(uint8_t),5760000, fp) != 5760000)
{
cout << "写入失败!" << endl;
}
fclose(fp);
}
//读文件
unsigned char *read(const char *path)
{
static unsigned char content[3840000];
FILE *fp;
if ((fp = fopen(path, "rb")) == NULL)
{
cout << "文件打开失败!" << endl;
}
fseek(fp, 0L, SEEK_END);
int len = ftell(fp);
rewind(fp);
if (fread(content, sizeof(uint8_t), 3840000, fp) != len)
{
cout << "读取失败" << endl;
}
fclose(fp);
return content;
}
int main()
{
const char *path = "./ RGB_nand_240.RGB";
const char *path1 = "./RGB_888_240.RGB";
unsigned char *content;
unsigned char *RGB888;
RGB888=(unsigned char *)malloc(5760000*sizeof(unsigned char));
content = read(path);
for(int i=0;i<1600*1200;i++)
{
RGB565ToRGB888Char(&content[i*2],&RGB888[i*3]);
}
write(RGB888, path1);
return 0;
}