admin管理员组

文章数量:1538180

RGB888转换为RGB565原理及工具

  • 1.原理
    • RGB565
    • rgb888
  • RGB565->RGB888
  • 2.工具
  • 链接

1.原理

RGB888 转换为 RGB565 的原理是将每个颜色通道的值(红色、绿色和蓝色)从 8 位精度(每个通道 0 到 255)转换为 5 位、6 位和 5 位精度,然后将它们合并成一个 16 位的值。

具体步骤如下:

  1. 提取各通道的值:从 RGB888 格式中提取红色(R)、绿色(G)和蓝色(B)通道的值。

  2. 减少位数:将每个通道的值从 8 位减少到所需的位数。对于 RGB565 格式,红色通道从 8 位减少到 5 位,绿色通道从 8 位减少到 6 位,蓝色通道从 8 位减少到 5 位。

  3. 合并通道值:将减少位数后的各通道值合并成一个 16 位的值。在 RGB565 格式中,红色占据高 5 位,绿色占据中间的 6 位,蓝色占据低 5 位。

  4. 生成 RGB565 值:将合并后的 16 位值作为 RGB565 格式的颜色代码。

例如,对于 RGB888 格式的颜色代码 #RRGGBB,其中 RR、GG 和 BB 分别表示红色、绿色和蓝色通道的值,范围从 00 到 FF。要将其转换为 RGB565 格式,首先将 RR、GG 和 BB 分别减少到 5 位、6 位和 5 位精度,然后将它们合并成一个 16 位的值,最终得到 RGB565 格式的颜色代码。

RGB565

RGB16数据格式主要有二种:RGB565RGB555
每个像素用16比特位表示,占2个字节,RGB分量分别使用5位、6位、5位。

1 //获取高字节的5个bit
2 R = color & 0xF800;
3 //获取中间6个bit
4 G = color & 0x07E0;
5 //获取低字节5个bit
6 B = color & 0x001F;

rgb888

RGB24图像每个像素用8比特位表示,占1个字节,注意:在内存中RGB各分量的排列顺序为:BGR BGR BGR ......

RGB565->RGB888

首先RGB的范围是0-255,包括RGB三个值。

第一步将R,G,B三个值分别转化为八位二进制数,这里以GREEN为例子。

GREEN   R:0    G:255    B:0

二进制:R00000000 11111111 00000000

565的意思就是RGB的位数,R取5位,G取六位,B取5位。其中要求取高位,舍低位。

00000 000 11111111 00000 00

其中非粗体的 0和1 舍去

得到0000011111100000
再转化为十六进制数0x7e0

2.工具

程序实现:

基本的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
    R = R >> 3
    G = G >> 2
    B = B >> 3
    rgb888_text = 'RGB888: '+ "#%06x"%rgb888
    rgb888_Label.configure(text=rgb888_text)
    
    rgb565_text = '565: '+ "%d " %R + "%d " %G + "%d" %B
    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的6位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="565:",height = 1,width=18 , fg = 'blue',anchor="w")  
rgb565_Label.place( x =280, y = 250 ) 
 
 
window.mainloop()

转自 https://blog.csdn/wild_lee/article/details/122009234

这段代码是一个简单的 Python 程序,使用 Tkinter 模块创建了一个图形用户界面(GUI)应用程序,用于将 RGB888 格式的颜色代码转换为 RGB565 格式的颜色代码,或者将 RGB565 格式的颜色代码转换为 RGB888 格式的颜色代码。

主要功能包括:

  1. 提供两个文本输入框,用于输入 RGB888 和 RGB565 格式的颜色代码。
  2. 提供两个按钮,分别用于将 RGB888 转换为 RGB565,以及将 RGB565 转换为 RGB888。
  3. 使用滑块控件,实时显示调整后的 R、G、B 值,并根据调整后的颜色代码更新界面上的颜色块和显示文本。
  4. 显示转换后的 RGB888 和 RGB565 格式的颜色代码。

这段代码的主要部分包括创建 GUI 窗口、添加文本框、按钮、滑块等控件,以及设置按钮点击事件的回调函数。其中,buttonClick1() 函数用于将 RGB888 转换为 RGB565,buttonClick2() 函数用于将 RGB565 转换为 RGB888。转换算法主要涉及位操作和颜色格式转换的基本知识。

整个应用程序通过 Tkinter 提供的 GUI 控件和事件处理机制来实现交互和功能展示。

修改了一下将RGB565的R G B 分别用十进制打出

链接

一些常用的颜色
RGB888和RGB565颜色对照表

RGB颜色值与十六进制颜色码互转

RGB在线颜色生成调色板

色彩中间色/颜色中间值计算

本文标签: 转换为原理工具