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
    评论
在C++中,将二进制文件换为YUV格式可以使用以下代码: ```cpp #include <iostream> #include <fstream> int main() { // 打开二进制文件 std::ifstream file("input.bin", std::ios::binary); // 二进制数据 file.seekg(0, std::ios::end); int fileSize = file.tellg(); file.seekg(0, std::ios::beg); char* buffer = new char\[fileSize\]; file.read(buffer, fileSize); // 将二进制数据入YUV文件 std::ofstream yuvFile("output.yuv", std::ios::binary); yuvFile.write(buffer, fileSize); // 关闭文件 file.close(); yuvFile.close(); // 释放内存 delete\[\] buffer; return 0; } ``` 这段代码首先打开一个二进制文件,然后文件的内容并将其入一个YUV文件中。你可以将`input.bin`替换为你的二进制文件的路径,将`output.yuv`替换为你想要保存YUV文件的路径。请注意,这只是一个简单的示例,你可能需要根据你的具体需求进行修改。 \[1\]提供了一个示例代码,展示了如何以二进制方式取YUV文件。 \[3\]提供了一个关于打开和YUV文件时的注意事项。 #### 引用[.reference_title] - *1* *2* [分析RGB和YUV二进制格式图像的三通道概率分布及其熵](https://blog.csdn.net/qq_43850979/article/details/114481511)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [对彩色YUV视频进行二进制文件时候的注意事项](https://blog.csdn.net/andyfu57/article/details/48004833)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值