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

    最近弄了个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()

  • 12
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 565 RGB颜色转换器是一种用于将RGB颜色转换为565格式的工具或算法。565格式是一种16位色格式,其中红色、绿色和蓝色通道的位数分别为5、6和5个位。 要进行这种转换,我们需要首先将RGB值分别转换为5位的红色、6位的绿色和5位的蓝色。然后,将这些值组合成一个16位的二进制数,其中高位是红色通道,接着是绿色通道,最后是蓝色通道。 举个例子,如果我们有一个RGB颜色值为(128, 255, 64)。首先,我们将128转换为5位的二进制数10000,将255转换为6位的二进制数111111,将64转换为5位的二进制数100000。然后,我们将这三个二进制数拼接起来,得到一个16位的二进制数10000 111111 10000。最后,我们可以将这个16位的二进制数转换为十进制数,即得到了转换后的565颜色值。 使用565 RGB颜色转换器可以有效地减少颜色数据的占用空间,同时保持图像的相对质量。因为使用16位颜色格式,所以可以在节省存储空间的同时不会引起明显的色彩失真。 总结来说,565 RGB颜色转换器是一种将RGB颜色转换为16位565格式的工具或算法。它可以帮助减少颜色数据的占用空间,同时保持图像质量。 ### 回答2: 565是一种颜色编码系统,它使用16位二进制来表示颜色。在565RGB颜色转换器中,我们可以将RGB转换为565表示,也可以将565表示转换RGB值。 在将RGB转换为565表示时,我们首先将每个红、绿、蓝分量值从8位二进制数转换为5位二进制数。这是因为在565编码中,红色有5位用于表示,绿色也有5位,而蓝色只有6位。 然后我们将这些转换后的二进制数合并起来,形成一个16位的二进制数,即为颜色的565表示。 举个例子,如果我们有一个RGB颜色值为(100, 200, 50),我们可以分别将红、绿、蓝分量值转换为对应的5位二进制数,并合并得到一个16位的二进制数。最后我们将这个16位的二进制数转换为十六进制数表示,即为该颜色的565表示。 当我们想要将565表示转换RGB值时,我们首先需要从16位二进制数中提取出红、绿、蓝分量值。我们可以利用位运算和掩码来实现这个过程。然后将这些分量值转换为8位二进制数,并组合得到RGB值。 通过使用565RGB颜色转换器,我们可以在RGB值和565表示之间进行相互转换,帮助我们在设计和开发过程中更方便地使用颜色。 ### 回答3: 565RGB颜色转换器是一种用于将RGB颜色编码转换为565格式颜色编码的工具。在计算机图形编程或嵌入式系统开发中经常会用到这个转换器。 RGB颜色编码是一种用红、绿和蓝三原色的强度值来表示颜色的方式。它由三个8位的数字表示,每个颜色通道的取值范围是0-255。例如,红色可以表示为(255, 0, 0)。 而565格式颜色编码是一种用16位二进制数表示颜色的方式,它将红、绿和蓝三原色的强度值通过位操作压缩在一起,使每个颜色通道只有5位或6位的取值范围。这样可以减少颜色编码所占用的存储空间,提高图形处理速度。例如,红色在565格式中的编码为1111100000000000。 RGB转换为565格式的计算公式如下: R5 = round(R8 * 31 / 255) G6 = round(G8 * 63 / 255) B5 = round(B8 * 31 / 255) 然后将R5,G6和B5分别合并在一起,得到16位的565格式颜色编码。 使用565RGB颜色转换器,我们可以将RGB颜色编码方便地转换为565格式颜色编码,并在各种应用场景中使用。例如,在开发嵌入式系统中,可以将图形界面的元素颜色进行转换,以节省存储空间和提高性能。在游戏开发中,也可以将纹理和粒子效果的颜色进行转换,以提高渲染效率。 总之,565RGB颜色转换器是一种有着广泛应用的工具,可以帮助我们将RGB颜色编码转换为565格式颜色编码,以适应不同的应用需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值