RGB888 转 RGB565

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

FILE* in  ;
FILE* out ;

unsigned char srcBMP[320 * 240 * 3] = {0};
unsigned char dstBMP[320 * 240 * 2] = {0};

char inFileName[500]  = {0}; //待转换的图片的文件名
char outFileName[500] = {0}; //输出文件名

const unsigned long bmpStart = 1 ;  //起始图片序号
const unsigned long bmpEnd = 5257 ;  //结束图片序号

unsigned short RGB888toRGB565(unsigned char red, unsigned char green, unsigned char blue)
{
        unsigned short B = (blue >> 3) & 0x001F;
        unsigned short G = ((green >> 2) << 5) & 0x07E0;
        unsigned short R = ((red >> 3) << 11) & 0xF800;

        return (unsigned short) (R | G | B);
}

int main()
{
    for(unsigned long index = bmpStart ; index <=bmpEnd ;index++ )
    {
        // 合成文件名
        sprintf(inFileName,"C:\\Users\\Administrator\\Desktop\\CG\\badBMP\\BAD_%.4ld.bmp",index);
        printf("convert bmp : %s...\r\n",inFileName);
        // 读取RGB888内容
        in = fopen(inFileName,"rb+");
        if(! in)
        {
            printf("open file error...\r\n");
            return 1;
        }
        fseek(in,54,SEEK_SET);
        fread(srcBMP,1,320*240*3,in);
        fclose(in);
        // 转换
        for(unsigned long i=0 ,j=0;i<320*240*3;i+=3 ,j+=2)
        {
            unsigned short color565 = RGB888toRGB565(srcBMP[i],srcBMP[i+1],srcBMP[i+2]);
            memcpy(dstBMP+j,&color565,2);
        }
        //输出到文件
        out = fopen("C:\\Users\\Administrator\\Desktop\\CG\\bad.img","ab+");
        if(! out)
        {
            printf("open file error...\r\n");
            return 1;
        }
        fwrite(dstBMP,1,320*240*2,out);
        fflush(out);
        fclose(out);
    }

    printf("complete...\r\n");
    getchar();

}
时间: 2024-10-10 22:01:01

RGB888 转 RGB565的相关文章

BMP RGB888转RGB565 +上下翻转+缩放

典型的BMP图像文件由四部分组成: (1) 位图头文件数据结构,它包含BMP图像文件的类型.文件大小和位图起始位置等信息: typedef struct tagBITMAPFILEHEADER { WORD bfType;//位图文件的类型,必须为BM(1-2字节) DWORD bfSize;//位图文件的大小,以字节为单位(3-6字节,低位在前) WORD bfReserved1;//位图文件保留字,必须为0(7-8字节) WORD bfReserved2;//位图文件保留字,必须为0(9-1

RGB888与RGB565互相转换原理

一.概念 BPP(Bits Per Pixels):(像素深度)一般指像素深度. 二.背景 计算机中图像是以RGB888格式显示图像的,24位图(BPP)每个像素保存了32bit的数据,即RGB888+Alpha,Alpha就是半透明填充字节……但是对于真彩的图像而言,肉眼在16bit的时候已经难以分辨了,因此,有些时候,可以讲RGB888转换为RGB565来存储,减少了存储器的容量的同时,降低了数据量:在后端显示的时候,再次把RGB565转换为RGB888,实现数据宽度的匹配! 原文地址:ht

RGB565的转换

RGB色彩模式也就是"红绿蓝"模式是一种颜色标准,是通过对红(R).绿(G).蓝(B)三种颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红.绿.蓝三个通道的颜色,这个标准几乎囊括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一. 1.RGB565格式说明 RGB565彩色模式, 一个像素占两个字节, 其中:第一个字节的前5位用来表示R(Red),第一个字节的后三位+第二个字节的前三位用来表示G(Green),第二个字节的后5位用来表示B(Blue)

STM32单片机图片解码

图片解码首先是最简单的bmp图片解码,关于bmp的结构可自行查阅,代码如下 #ifndef __BMPDECODE_H_ #define __BMPDECODE_H_ #include "ff.h" #include "lcd.h" #include "stdlib.h" #include "usb_type.h" //重定义区 typedef char CHAR; //数据类型重定义,便于移植 typedef short S

第二十天:mmap内存映射

可以说,一天的时间都在了解内存映射mmap这个函数,冯诺依曼结构中表示运算器不能直接对硬盘上的文件进行操作.mmap函数的功能就是将文件映射到某一段内存中,然后操作内存就相当与操作文件.这样的话对文件操作更加方便.mamp函数的定义如下:void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize);一共有六个参数,参数算是比较多了.第一个表示映射内存的起始地址,如果为NULL,那么操作系统会自动的找到空

量化补偿与量化压缩

学习博客:http://lhtao31.blog.163.com/blog/static/2972647020103814044158/ 最近在学习调试摄像头,配置OV7670摄像头采集到的数据是RGB565,移植别人的代码,从ZYNQ移植到Basys3,VGA输出引脚需要又RGB565转到RGB444,我采用分别取RGB565三分量高位的方法,最终显示输出,视频图像会变得更模糊,这是由于在转换的时候去掉低位会损失精度.而OV7670的图像采集效果也是不怎么样,所以后面会尝试配置OV7725,追

基于FPGA的彩色图像转灰度算法实现

昨天才更新了两篇博客,今天又要更新了,并不是我垃圾产,只不过这些在上个月就已经写好了,只是因为比赛忙,一直腾不出时间整理出来发表而已,但是做完一件事情总感觉不写一博文总结一下就少点什么,所以之后的一段时间里我会把我这学期学到的一些东西陆续整理出来发表,给自己一个总结交代. 将彩色图像转化为灰度的方法有两种,一个是令RGB三个分量的数值相等,输出后便可以得到灰度图像,另一种是转化为YCbCr格式,将Y分量提取出来,YCbCr格式中的Y分量表示的是图像的亮度和浓度所以只输出Y分量,得到的图像就是灰度

基于FPGA的RGB565_YCbCr_Gray算法实现

前面我们讲了基于FPGA用VGA显示一副静态图片,那么接下来我们就接着前面的工程来实现我们图像处理的基础算法里最简单的一个那就是彩色图像转灰度的实现. 将彩色图像转化为灰度的方法有两种,一个是令RGB三个分量的数值相等,输出后便可以得到灰度图像,另一种是转化为YCbCr格式,将Y分量提取出来,YCbCr格式中的Y分量表示的是图像的亮度和浓度所以只输出Y分量,得到的图像就是灰度图像了.我在这里选择第二种方法实现. YCBCr是通过有序的三元组来表示的,三元由Y(Luminance).Cb(Chro

关于yuv 的pack(紧缩格式)和planner(平面格式)格式 [转]

关于yuv 格式 YUV 格式通常有两大类:打包(packed)格式和平面(planar)格式.前者将 YUV 分量存放在同一个数组中,通常是几个相邻的像素组成一个宏像素(macro-pixel);而后者使用三个数组分开存放 YUV 三个分量,就像是一个三维平面一样. 几种常见的yuv格式 1.YUV422 Planar 这里,Y\U\V数据是分开存放的,每两个水平Y采样点,有一个Cb和一个Cr采样点,如下图 ffmpeg 中的定义  PIX_FMT_YUV422P,   ///< planar