RGB888颜色码与十六位(RGB565)颜色码的转换

2024-02-07 RGB565简单介绍,Ubuntu上用java读jpg图片转成RGB565格式数据保存为bin文件。android app读取bin文件并显示。为后续图像处理开发工作做技术储备。 RGB565是一种简化的颜色表达方式,用于数字图像处理中,尤其常见于嵌入式系统和移动设备中,因其能够在只需较少的数据量的情况下表达彩色图像。在RGB565格式中,一个像素的颜色用16位(2字节)来表示,分配给红色、绿色和蓝色通道的位数分别是5位、6位和5位。 阅读详情

    最近弄了个ARDUINO开发板玩,发现RGB565的颜色代码转换很不习惯,查了不少资料,发现在我们的计算机中图像是以RGB888格式显示图像的,24位图每个像素保存了32bit的数据,即RGB888+Alpha,Alpha就是半透明填充字节。

  但是在很多单板机里面是使用RGB565显示图像的,网上很多调色板工具和程序都是用RGB888格式,很少有RGB565的。

  因此,自己弄了个简单的RGB565和RGB888颜色代码转换的工具。

基本原理:

一.RGB888->RGB565

方法只要提取相应单色高位即可(R5 G6 B5),但会导致低位的缺失,影响精度,而且无法恢复。

二.RGB565->RGB888

方法只要补充相应单色低位即可(R3 G2 B3)。在图像转换中会使用一些算法来补充,这里不涉及图像转换,仅颜色码的转换。

RGB888用unsigned int 32位字节存储

  0  0  0  0  0  0  0  0R7R6R5R4R3R2R1R0G7G6G5G4G3G2G1G0B7B6B5B4B3B2B1B0

RGB565用unsigned short 16位字节存储
R7R6R5R4R3G7G6G5G4G3G2B7B6B5B4B3

程序实现:

基本的tkinter使用,python 3.7

核心程序就是通过位移取得RGB565的R,G,B三色值。简单的使用Label显示色块,三个颜色的滑块可以自由拉动。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

from tkinter import *
import re

window = Tk()
window.title("RGB888 转换 RGB565")
window.geometry('450x300+300+250')

def scalecommand(color):
    
    #print(s1.get(),s2.get(),s3.get())
    b=s3.get()
    g=s2.get()
    r=s1.get()

    R = r & 0xF8
    G = g & 0xFc
    B = b & 0xF8

    rgb565 = (R << 8) | (G << 3) | (B >> 3)

    
    rgb888 = (r << 16) | (g << 8) | b
    
    rgb888_text = 'RGB888: '+ "#%06x"%rgb888
    rgb888_Label.configure(text=rgb888_text)
    
    rgb565_text = 'RGB565: '+ "%#06x" %rgb565
    rgb565_Label.configure(text=rgb565_text)
    
    #print("%#08X"%rgb)
    info_Label.configure(bg="#%06x" %rgb888)
    
    

def HexToDec(value):
  try:
    return int(value, 16)
  except ValueError:
    return "Invalid Hexadecimal Value"


def buttonClick1():
    # RGB888 转 RGB565
    
    try:
        c888 = int(rgb1_Entry.get(),16)         #字符转16进制整数
    except ValueError:
        print( "Invalid Hexadecimal Value")
        return
    
    rgb2_Entry.delete(0,END)
    
    if c888 == None :
        return
    else:
        
        b = (c888 & 0xFF)                 #转换RB 取得rgb颜色B
        g = int((c888 & 0xFF00) >> 8)         #转换G 取得rgb颜色G
        r = int((c888 & 0xFF0000) >>16)     #转换R 取得rgb颜色R
        R = r & 0xF8                        #取得RGB565的5位R
        G = g & 0xFc                        #取得RGB565的5位G
        B = b & 0xF8                        #取得RGB565的5位B

        rgb565 = (R << 8) | (G << 3) | (B >> 3)        

        #print("%#06x" %rgb565)               
        
        #设置滑块位置
        s1.set(r)               
        s2.set(g)
        s3.set(b)

        #显示RGB888和RGB565颜色码
        info_Label.configure(bg="#%06x" %c888)      
        rgb888_text = 'RGB888: '+ "#%06x"%c888
        rgb888_Label.configure(text=rgb888_text)
        rgb565_text = 'RGB565: '+ "%#06x" %rgb565
        rgb565_Label.configure(text=rgb565_text)



def buttonClick2():
    # RGB565 转 RGB888
    rgb1_Entry.delete(0,END)
    
    try:
        c565 = int(rgb2_Entry.get(),16)
    except ValueError:
        print( "Invalid Hexadecimal Value")
        return
    
    if c565 == None :
        return
    else:
        b = (c565 & 0x001F)                 #转换R 
        g = int((c565 & 0x07E0))           #转换G 
        r = int((c565 & 0xF800))          #转换B
        R = r >> 8
        G = g >> 3
        B = b << 3

        rgb888 = (R << 16) | (G << 8) | B        

        #print("%#06x" %rgb888)
        
        s1.set(R)
        s2.set(G)
        s3.set(B)
        info_Label.configure(bg="#%06x" %rgb888)
        rgb888_text = 'RGB888: '+ "#%06x"%rgb888
        rgb888_Label.configure(text=rgb888_text)
        rgb565_text = 'RGB565: '+ "%#06x" %c565
        rgb565_Label.configure(text=rgb565_text)
    

Rgb1_Label = Label(window, text="RGB888 代码:",height = 2,fg='#191970')
Rgb1_Label.place( x =20, y = 25 , anchor=NW)

R1_Label = Label(window, text="#",height = 2,fg='#191970')
R1_Label.place( x =20, y = 50 , anchor=NW)
rgb1_Entry = Entry(window,width=10)
rgb1_Entry.place( x =40, y = 60 , anchor=NW)

Rgb2_Label = Label(window, text="RGB565 代码:",height = 2,fg='#191970')
Rgb2_Label.place( x =20, y = 85 , anchor=NW)

R2_Label = Label(window, text="0x",height = 2,fg='#191970')
R2_Label.place( x =20, y = 110 , anchor=NW)
rgb2_Entry = Entry(window,width=10)
rgb2_Entry.place( x =40, y = 120 , anchor=NW)


button1 = Button(window,text="转换", bg='#8FBC8F',command=buttonClick1)    #转换按键
button1.place( x =160, y = 40 , anchor=NW)

button2 = Button(window,text="转换", bg='#8FBC8F',command=buttonClick2)    #转换按键
button2.place( x =160, y = 110 , anchor=NW)

info_Label = Label(window, text="",height = 10,width=20)        #色块
info_Label.configure(bg='#FFFFFF')
info_Label.place( x =280, y = 20 , anchor=NW)

R_Label = Label(window, text="R",height = 1,width=1)       
R_Label.place( x =20, y = 170 , anchor=NW)
s1 = Scale(window,  from_=0, to=255, orient=HORIZONTAL,
             length=200, showvalue=1, tickinterval=0, resolution=1, command=scalecommand)     #滑块R
s1.place( x =40, y = 150 , anchor=NW)

G_Label = Label(window, text="G",height = 1,width=1)       
G_Label.place( x =20, y = 210 , anchor=NW)
s2 = Scale(window,  from_=0, to=255, orient=HORIZONTAL,
             length=200, showvalue=1, tickinterval=0, resolution=1, command=scalecommand)   #滑块G
s2.place( x =40, y = 190 , anchor=NW)

B_Label = Label(window, text="B",height = 1,width=1)        
B_Label.place( x =20, y = 250 , anchor=NW)
s3 =  Scale(window, from_=0, to=255, orient=HORIZONTAL,
             length=200, showvalue=1, tickinterval=0, resolution=1, command=scalecommand)   #滑块B
s3.place( x =40, y = 230 , anchor=NW)

rgb888_Label = Label(window, text="RGB888:",height = 1,width=18 , fg = 'blue',anchor="w")
rgb888_Label.place( x =280, y = 210 )

rgb565_Label = Label(window, text="RGB565:",height = 1,width=18 , fg = 'blue',anchor="w")  
rgb565_Label.place( x =280, y = 250 ) 


window.mainloop()

关于RGB888RGB565互转代码实现方案推荐 RGB888RGB565互转 例如嵌入式中的LCD屏接口一般位IIC、SPI、8080等,如果传送RGB888每个像素点就要多送一个字节,320*240的LCD屏就要多送76800字节的数据。 阅读详情

相关推荐

图像处理:RGB565RGB888

RGB565RGB888

m0_46830519的博客 5621

RGB565RGB888互转工具终极版

RGB565RGB888的互转工具终极完整版,灵活方便使用,自主开发

图像压缩(1)RGB888RGB565图像

最近在接触图像压缩相关项目,之前对图像压缩接触的较少,对检测分类识别相关的图像信号处理接触学习的相对比较多一些,所以也需要学习学习,搜集整理了一些资料,在这里简单做个笔记,也分享出来和大家交流学习。

sinat_34897952的博客 9024

RGB565颜色 16位真彩色 16进制编码原理

RGB565使用16位二进制来表示一个颜色,其中5位用于表示红色分量(2^ 5个分量),6位用于表示绿色分量(2^ 6个分量),5位用于表示蓝色分量。因此RGB565总共可以表示2^16(即65536)种颜色。

qq_42059474的博客 1万+

RGB565常见颜色对照表

RGB565常见颜色对照表 颜色 RGB888 RGB565 黑色 #000000 0x0000 浅粉红 #FFB6C1 0xFDB8 粉红 #FFC0CB 0xfe19 猩红 #DC143C 0xd8a7 脸红的淡紫色 #FFF0F5 0xff9e 苍白的紫罗兰红色 # DB7093 0xdb92 深粉色 # FF1493 0xf8b2 灯笼海棠(紫红色) # FF00FF 0xf81f 深洋红色 #8B008B 0x8811 紫色 #800080 0x

咸鱼菌 4万+

TFT显示屏开发:24位真彩色(RGB888转换 16位真彩色(RGB565

24位真彩色(RGB888转换 16位真彩色(RGB565

MQ0522的博客 5291

硬件接口之RGB888RGB24)

RGB接口 (1)接口定义  RGB颜色是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。 (2)接口类型 并行 RGB 串行 RGB (3)接口特点 a. 接口一般为3.3V电平 b. 需要同步信号 c. 需时刻刷新图像数据 d. 需配置适当的timing 上图:并行 RGB 接口 上图:串行 RGB 接口 (

xuhao0258的博客 1万+

深入理解RGB565图像格式及其应用

RGB565图像格式是使用16位(两个字节)来表示一个像素的颜色信息。其中,5位用于红色(R),6位用于绿色(G),另外5位用于蓝色(B),共同构成了一个像素的色彩。常见的RGB888格式相比,RGB565减少了存储和带宽的使用,同时在视觉上保持了较好的色彩表现,这使得它在资源受限的设备上非常受欢迎。RGB模型是一种加色模型,使用红、绿、蓝三种基本颜色的光按不同比例混合来产生其他颜色。这种模型是基于人类视觉系统的感知原理,即三种颜色光的适当组合能够在人眼中合成几乎所有可能的颜色感知。

weixin_33072399的博客 2482

RGB888转换RGB565原理及工具

每个像素用16比特位表示,占2个字节,RGB分量分别使用5位、6位、5位。第一步将R,G,B三个值分别转化为八位二进制数,这里以GREEN为例子。565的意思就是RGB的位数,R取5位,G取六位,B取5位。核心程序就是通过位移取得RGB565的R,G,B三色值。修改了一下将RGB565的R G B 分别用十进制打出。首先RGB的范围是0-255,包括RGB三个值。显示色块,三个颜色的滑块可以自由拉动。其中非粗体的 0和1 舍去。使用,python 3.7。

墨染锦年的博客 1万+

单片机C语言GRB888RGB565RGB666的互相转换

GRB888RGB565 RGB565用了2个字节,排列方式如下: RGB888 用了4个字节,把上面的RGB565转换后,排列法方式如下: RGB565转换RGB888时,只需将RGB565的颜色拿过来放进RGB888的高位,RGB888的低位补0,所以16位色转换成24位色时精度不会提高。 反过来,RGB888转换RGB565时,R的高5位,G的高6位,B的高5位拿过来放进RGB565,所以24位色转换成16位色会损失精度。 RGB的 0xFFFF 转换RGB888后为 0xF8FCF8,如下

17208955的博客 6232

FPGA驱动RGB888屏幕——基于正点原子达芬奇FPGA开发板

RGB888简介 一个像素点由三种颜色控制,每个颜色8bit,共24bit,三个字节,这就是RGB888。同样的还有RGB565等。 LCD屏幕介绍 1、HSYNC(水平同步信号、行同步信号):产生此信号,说明开始显示新的一行。 2、VSYNC(垂直同步信号、帧同步信号):当产生此信号的话就表示开始显示新的一帧图像。 3、LCD 屏幕中继续存在HBP、 HFP、 VPB 和 VFP 这四个参数的主要目的是为了锁定有效的像素数据。 (白色区域为显示区域) LCD屏幕时序 重要参数: HSYNC:行同步

weixin_43431185的博客 4059

RGB888RGB565互相转换

背景:在我们的计算机中图像是以RGB888格式显示图像的,24位图每个像素保存了32bit的数据,即RGB888+Alpha,Alpha就是半透明填充字节……但是对于真彩的图像而言,肉眼在16bit的时候已经难以分辨了,因此,有些时候,可以讲RGB888转换RGB565来存储,减少了存储器的容量的同时,降低了数据量;在后端显示的时候,再次把RGB565转换RGB888,实现数据宽度的匹配!!

oXunFeng的专栏 1万+

RGB888RGB565颜色

本文显示RGB888RGB565色彩

adacore的博客 6151

RGB565的计算&颜色表

RGB565是这样算出来的: 首先将R,G,B的值分别转换为2进制。R取5位,G取6位,B取5位。然后结合起来转成16进制即可。 例如:rgb(0,63,0) (63)Hex=(00111111)B 转成2进制:为00000,00111111,00000 取前5,6,5位:00000,111111,00000 结合起来为:00000,111111,00000 所以(0000,0111,1110,0000)B=(2016)D=(7E0)Hex 结合起来转成16进制:7E0 10进制为:2016 以下为RG.

weixin_53391957的博客 9524

RGB888RGB565:红绿蓝三色光变出千万种颜色

RGB色彩模型通过红、绿、蓝三种颜色光的混合生成各种颜色,广泛应用于电子设备显示。RGB888(24位色)每个颜色通道用8位表示,可组合1600万种颜色;而RGB565用16位表示颜色(红5位、绿6位、蓝5位),能显示约6.5万种颜色,虽然色彩较少但更节省资源。单片机常用RGB565因其占用内存小、处理速度快,且颜色差异对人眼不明显。文中还提供了RGB888RGB565相互转换的代码实现,帮助开发者根据项目需求选择合适的颜色格式。

jmlinux的博客 2590

纹理格式RGB565

RGB565是一种高效且广泛应用的纹理格式,特别适合资源受限的环境。然而,由于其颜色精度较低,不适合对颜色质量要求极高的应用。在选择纹理格式时,需要根据具体需求权衡内存效率和颜色质量。RGB565纹理格式以其高效和广泛的支持在图形处理领域占据了一席之地。在选择使用该格式时,需要权衡其优缺点,并根据具体的应用需求进行相应的优化和调整。通过合理的色彩空间转换、图像压缩、性能优化等措施,可以在保证图像质量的同时充分发挥RGB565格式的优势。RGB565纹理格式以其高效和广泛的支持在图形处理领域占据了一席之地。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 2334

VGA显示8色彩条RGB888(一)

1.color bar (彩条)颜色编码 这里使用的编码方式是RGB888,一个像素R,G,B分量各占八位。 8色彩条是指白色,青色,黄色,品红色,绿色,蓝色,红色,黑色,他们都是R,G,B分量各取0或者255(2*2*2=8)组成。 详细编码方案见常用RGB编码颜色见常用RGB颜色表_yh13572438258的博客-CSDN博客 2.VGA驱动原理 VGA显示器的驱动原理,大家知道,我们的显示器是不同的分辨率,而大多显示器的分辨率都是接近4:3的,所以我们采用640×480@60Hz这样的一个

yh13572438258的博客 7904

242种颜色样式、中英文名称及十六进制的值

颜色 名称 英语 十六进制   黑色 Black #000000   昏灰 Dimgray #696969   灰色 Gray #808080   暗灰 Dark Gray #A9A9A9   银色 Silver #C0C0C0   亮灰色 Light Gray #D3D3D3 ...

weixin_30394669的博客 1857
wild_lee
博客等级 码龄8年 3粉丝 1原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值