核心代码是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;
}