RGB565转RGB888 (C读写二进制文件)

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

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是将RGB565换为RGB888的C语言实现: ```c void RGB565_to_RGB888(uint16_t color565, uint8_t *r, uint8_t *g, uint8_t *b) { // 从RGB565中提取红色分量 uint8_t red = (color565 >> 11) & 0x1F; // 从RGB565中提取绿色分量 uint8_t green = (color565 >> 5) & 0x3F; // 从RGB565中提取蓝色分量 uint8_t blue = color565 & 0x1F; // 将红色分量从5位扩展到8位 *r = (red * 527 + 23) >> 6; // 将绿色分量从6位扩展到8位 *g = (green * 259 + 33) >> 6; // 将蓝色分量从5位扩展到8位 *b = (blue * 527 + 23) >> 6; } ``` 在该函数中,输入参数`color565`为一个16位的RGB565颜色值。输出参数`r`、`g`和`b`为分别代表RGB888颜色中的红色、绿色和蓝色分量的指针。 首先,我们从输入的RGB565颜色值中分别提取红色、绿色和蓝色分量。由于在RGB565中,红色分量占5位,绿色分量占6位,蓝色分量占5位,我们需要对它们进行位运算和掩码操作以提取它们的值。 接下来,我们将5位红色分量从RGB565扩展到8位RGB888。这里我们使用了一个矩阵乘法的优化算法,其基本思想是将5位的颜色值扩展到8位时,将其乘以一个系数,再向右移位。这个系数的值是`(2^8-1)/(2^5-1)=527/31≈17`。在计算时,我们使用了一个带有舍入偏移量的整数除法运算,以保证结果的正确性。绿色分量同样进行了这样的操作。 最后,我们将5位蓝色分量从RGB565扩展到8位RGB888。这里我们使用了与红色分量相同的矩阵乘法算法。 通过这个函数,我们可以将RGB565颜色值换为RGB888颜色值,并以指针的形式返回其RGB分量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值