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 | 0 | R7 | R6 | R5 | R4 | R3 | R2 | R1 | R0 | G7 | G6 | G5 | G4 | G3 | G2 | G1 | G0 | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
R7 | R6 | R5 | R4 | R3 | G7 | G6 | G5 | G4 | G3 | G2 | B7 | B6 | B5 | B4 | B3 |
程序实现:
基本的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()
RGB888颜色码与十六位(RGB565)颜色码的转换相关推荐
- Dais-CMX系列现代计算机组成原理,01 十六位机运算器实验
一.实验项目基本信息 设备名称 计算机组成原理实验箱(Dais-CMX16+型) 所属部门 接口与通信技术实验室 设备型号 Dais-CMX16+型 台套数 30 是否自制 否 实验目的 1. 熟悉D ...
- dr.oracle素颜霜好用吗,素颜霜到底好不好用?测评了5款终于找到答案
嗨! 宝贝儿们大家好啊 我是 德艺双馨 的种草鸡 又到了你们最喜欢的 测评环节 这次我们要测的就是 开始前科普一下 素颜霜到底是啥子? ▼ 素颜霜是介于粉底与面霜之间 可以 均匀提亮肤色 出门懒着化妆 ...
- 16位字长的计算机,十六位字长的计算机是指计算机16位十进制数的计算机吗
不是的,是指CPU在单位时间内(同一时间)能一次处理十六位的二进制数. 电脑技术中能处理字长为8位数据的CPU通常就叫8位的CPU.同理16位的CPU就能在单位时间内处理字长为16位的二进制数据. 由 ...
- 汇编学习之三:edx dl 就是dx 低八位, dx 就是edx 低十六位
EAX.EBX.ECX.EDX.ESI.EDI.ESP.EBP 寄存器详解 2013年11月19日 00:03:28 zhu2695 阅读数:9766 参考一: EAX.ECX.EDX.EBX寄存器的 ...
- PHP输出二十六位英文字母
PHP输出二十六位英文字母 $ABC = []; for($i=65;$i<91;$i++){$ABC[] = strtoupper(chr($i));//输出大写字母 } return $AB ...
- 十、从中缀向后缀转换表达式
十.从中缀向后缀转换表达式 文章目录 十.从中缀向后缀转换表达式 题目描述 解题思路 上机代码 题目描述 中缀表达式就是我们通常所书写的数学表达式,后缀表达式也称为逆波兰表达式,在编译程序对我们书写的 ...
- 程序员编程艺术第三十~三十一章:字符串转换成整数,通配符字符串匹配
第三十~三十一章:字符串转换成整数,带通配符的字符串匹配 前言 之前本一直想写写神经网络算法和EM算法,但写这两个算法实在需要大段大段的时间,而平时上班,周末则跑去北大教室自习看书(顺便以时间为序,说 ...
- RGB565颜色表,附RGB888转RGB565工具,RGB24转RGB565工具
下载链接 http://download.csdn.net/detail/liquanfeng9227/9893117 工具可以将RGB888颜色值转换成TFT屏用的RGB565颜色值. #def ...
- 程序江湖:第十八章 察颜观色的伙伴
中午吃完饭,欧阳明和几个同事,在南京分公司下面的地下商场里散步.一是为了消食,而是为了纳凉.突然,一声刺耳的鸣笛响起,大家还没明白怎么回事,就发现有人突然奔跑起来,于是所有的人都跟着跑起来.互相之间还 ...
- 火影众颜 U4参数配置 火影众颜 U4评测
配置方面,众颜 U4 笔记本搭载 R7 6800H 的马甲处理器 R7 7735H,8 核 16 线程,加速频率 4.75GHz,核显为 Radeon 680M.内存标配 16GB LPDDR5-64 ...
最新文章
- 【C 语言】指针数据类型 ( 不允许向 NULL 地址写入数据 | 不允许不断地改变指针指向 | 字面量存放位置 )
- 云原生时代, Kubernetes 多集群架构初探
- 【转载】COM 连接点
- 万达放弃A股上市,数据揭秘王思聪投资为何频繁跳水?
- VTK:Utilities之CommandSubclass
- Eigen入门之密集矩阵 1 -- 类Matrix介绍
- 算法不会,尚能饭否之对分查找二叉树(又为快速排序之二叉树实现)
- a form 出口享惠情况_次磷酸8类危险品海运出口
- 微信公众平台二次开发 API开发 服务账号开发 订阅号开发
- vb 字符串长度_学习VB编程第5天 基础知识需要一点点积累
- delphi 热成像摄像机源代码_红外热成像技术广泛应用于夜间及恶劣气候下目标的监控...
- Atitit eclipse tomcat插件常见问题总结.docx 1.1. tomcat插件调整内存设置在 run run cfg 配置页。。Debug模式共享相同设置	1 1.2. Pub
- java开发利用jacob将word转pdf
- Java文件File类型转BASE64
- C#使用Microsoft.Office.Interop.Word操作word书签位置插入Wingdings 2复选框
- vue依赖webpack的环境配置(一)
- 相似度(距离计算)汇总
- 写给初学者的6条网页设计安全配色指南
- 【2022.1】触控板可以点击但无法滑动ThinkPad一个驱动问题
- 隔离式DC/DC高压模块5V12V24V转50V110V250V300V380V600V1100V短路保护直流升压可调开关控制电源模块