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

news/2025/3/17 14:45:23/

    最近弄了个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 rewindow = 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 & 0xF8G = g & 0xFcB = b & 0xF8rgb565 = (R << 8) | (G << 3) | (B >> 3)rgb888 = (r << 16) | (g << 8) | brgb888_text = 'RGB888: '+ "#%06x"%rgb888rgb888_Label.configure(text=rgb888_text)rgb565_text = 'RGB565: '+ "%#06x" %rgb565rgb565_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 转 RGB565try:c888 = int(rgb1_Entry.get(),16)         #字符转16进制整数except ValueError:print( "Invalid Hexadecimal Value")returnrgb2_Entry.delete(0,END)if c888 == None :returnelse:b = (c888 & 0xFF)                 #转换RB 取得rgb颜色Bg = int((c888 & 0xFF00) >> 8)         #转换G 取得rgb颜色Gr = int((c888 & 0xFF0000) >>16)     #转换R 取得rgb颜色RR = r & 0xF8                        #取得RGB565的5位RG = g & 0xFc                        #取得RGB565的5位GB = b & 0xF8                        #取得RGB565的5位Brgb565 = (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"%c888rgb888_Label.configure(text=rgb888_text)rgb565_text = 'RGB565: '+ "%#06x" %rgb565rgb565_Label.configure(text=rgb565_text)def buttonClick2():# RGB565 转 RGB888rgb1_Entry.delete(0,END)try:c565 = int(rgb2_Entry.get(),16)except ValueError:print( "Invalid Hexadecimal Value")returnif c565 == None :returnelse:b = (c565 & 0x001F)                 #转换R g = int((c565 & 0x07E0))           #转换G r = int((c565 & 0xF800))          #转换BR = r >> 8G = g >> 3B = b << 3rgb888 = (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"%rgb888rgb888_Label.configure(text=rgb888_text)rgb565_text = 'RGB565: '+ "%#06x" %c565rgb565_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()


http://www.ppmy.cn/news/197625.html

相关文章

STM32F429 如何使用LCD

(1)硬件接口 ①要明白RGB888控制LCD 和8080控制方式的区别&#xff1a; TFT液晶显示器使用的是RGB接口&#xff0c;RGB接口包含24根RGB信号线、像素同步信号线、水平同步信号线、垂直同步信号线和数据使能信号线。 性能一般的芯片&#xff0c;通常不会自带液晶控制器&#xff0…

YUV420->RGB888格式转换的CPP实现

git地址&#xff1a; GitHub - Evayangelion/EYUVConverter: A YUV converter implemented by cpp 上一次学习了YUV各种采样和存储方式的区别&#xff08;YUV知识存档&#xff09; 接下来一起学习一下RGB格式的知识和YUV到RGB的转换方式 RGB色彩模式的分类 RGB的分类相较YUV来说…

python 3.x实现特征选择ReliefF算法

说明 下面代码修改自&#xff1a; vbaymax-特征择算法之ReliefF算法python实现 太多人私信我要这份python 3.x的代码了。 所以干脆发一篇博客&#xff0c;需要的请自取&#xff0c;不白嫖的网友可以随手给我一个关注哦~。 必读 暂时不修改提供的代码&#xff0c;如果遇到类…

基于STM32F429+LTDC的原理图设计及PCB设计

基于STM32F429LTDC的设计 之前使用的一直都是一些外置驱动的显示屏,近期闲来无事,接触了STM32F429之后,便想尝试着做一个RGB888接口的屏幕 板载资源如下: USB转TTL, 采用的是FTDI的芯片,工业级用的比较多,稳定性要比其他的好一些,不过价格也是感人USB host/slave,可以使用该…

RGB888转换为RGB565格式

RGB888转换为RGB565格式 RGB888用unsigned int 32位字节存储 00000000R7R6R5R4R3R2R1R0G7G6G5G4G3G2G1G0B7B6B5B4B3B2B1B0 111111110000000000000000 R:255 0xFFG:0 0x00B:0 0x00 RGB565用unsigned short 16位字节存储 r7r6r5r4r3g7g6g5g4g3g2b7b6b5b4…

免费ddns f3322.net使用脚本更新公网ip小记

话说今天服务器域名访问不了&#xff0c;路由器也访问不了&#xff0c;另听说停电了&#xff0c;估计是ddns没有更新 下午到现场一看&#xff0c;c7v2的ddns显示未登陆&#xff0c;因为这货刷了us固件&#xff0c;能用的ddnd只有kmdns.net这一家&#xff0c; 想着如果以后都这…

RGB565转RGB888 (C读写二进制文件)

核心代码是RGB565转RGB888&#xff0c;整段代码实现的功能是读取一个RGB565的二进制文件&#xff0c;将其转换为RGB888&#xff0c;然后写成一个二进制文件。 要跑代码的去这里下载RGB565的二进制文件样例。 RGB565转RGB888的原理看这儿RGB565转RGB888原理 (MATLAB代码)_macu…

宝峰c1对讲机写频软件_宝峰888s写频软件

宝峰888s写频软件是为宝峰888s型号的对讲机设计的免费写频软件&#xff0c;可以进行信息编辑、信道参数设置与读取和其他功能的修改&#xff0c;非常实用。小编还带来了宝峰888s写频教程&#xff0c;有需要的朋友不要错过&#xff0c;快快下载吧&#xff01; 写频软件功能 1、信…