最近弄了个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
RGB565用unsigned short 16位字节存储
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)颜色码的转换相关推荐

  1. Dais-CMX系列现代计算机组成原理,01 十六位机运算器实验

    一.实验项目基本信息 设备名称 计算机组成原理实验箱(Dais-CMX16+型) 所属部门 接口与通信技术实验室 设备型号 Dais-CMX16+型 台套数 30 是否自制 否 实验目的 1. 熟悉D ...

  2. dr.oracle素颜霜好用吗,素颜霜到底好不好用?测评了5款终于找到答案

    嗨! 宝贝儿们大家好啊 我是 德艺双馨 的种草鸡 又到了你们最喜欢的 测评环节 这次我们要测的就是 开始前科普一下 素颜霜到底是啥子? ▼ 素颜霜是介于粉底与面霜之间 可以 均匀提亮肤色 出门懒着化妆 ...

  3. 16位字长的计算机,十六位字长的计算机是指计算机16位十进制数的计算机吗

    不是的,是指CPU在单位时间内(同一时间)能一次处理十六位的二进制数. 电脑技术中能处理字长为8位数据的CPU通常就叫8位的CPU.同理16位的CPU就能在单位时间内处理字长为16位的二进制数据. 由 ...

  4. 汇编学习之三: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寄存器的 ...

  5. PHP输出二十六位英文字母

    PHP输出二十六位英文字母 $ABC = []; for($i=65;$i<91;$i++){$ABC[] = strtoupper(chr($i));//输出大写字母 } return $AB ...

  6. 十、从中缀向后缀转换表达式

    十.从中缀向后缀转换表达式 文章目录 十.从中缀向后缀转换表达式 题目描述 解题思路 上机代码 题目描述 中缀表达式就是我们通常所书写的数学表达式,后缀表达式也称为逆波兰表达式,在编译程序对我们书写的 ...

  7. 程序员编程艺术第三十~三十一章:字符串转换成整数,通配符字符串匹配

    第三十~三十一章:字符串转换成整数,带通配符的字符串匹配 前言 之前本一直想写写神经网络算法和EM算法,但写这两个算法实在需要大段大段的时间,而平时上班,周末则跑去北大教室自习看书(顺便以时间为序,说 ...

  8. RGB565颜色表,附RGB888转RGB565工具,RGB24转RGB565工具

    下载链接   http://download.csdn.net/detail/liquanfeng9227/9893117 工具可以将RGB888颜色值转换成TFT屏用的RGB565颜色值. #def ...

  9. 程序江湖:第十八章 察颜观色的伙伴

    中午吃完饭,欧阳明和几个同事,在南京分公司下面的地下商场里散步.一是为了消食,而是为了纳凉.突然,一声刺耳的鸣笛响起,大家还没明白怎么回事,就发现有人突然奔跑起来,于是所有的人都跟着跑起来.互相之间还 ...

  10. 火影众颜 U4参数配置 火影众颜 U4评测

    配置方面,众颜 U4 笔记本搭载 R7 6800H 的马甲处理器 R7 7735H,8 核 16 线程,加速频率 4.75GHz,核显为 Radeon 680M.内存标配 16GB LPDDR5-64 ...

最新文章

  1. 【C 语言】指针数据类型 ( 不允许向 NULL 地址写入数据 | 不允许不断地改变指针指向 | 字面量存放位置 )
  2. 云原生时代, Kubernetes 多集群架构初探
  3. 【转载】COM 连接点
  4. 万达放弃A股上市,数据揭秘王思聪投资为何频繁跳水?
  5. VTK:Utilities之CommandSubclass
  6. Eigen入门之密集矩阵 1 -- 类Matrix介绍
  7. 算法不会,尚能饭否之对分查找二叉树(又为快速排序之二叉树实现)
  8. a form 出口享惠情况_次磷酸8类危险品海运出口
  9. 微信公众平台二次开发 API开发 服务账号开发 订阅号开发
  10. vb 字符串长度_学习VB编程第5天 基础知识需要一点点积累
  11. delphi 热成像摄像机源代码_红外热成像技术广泛应用于夜间及恶劣气候下目标的监控...
  12. Atitit eclipse tomcat插件常见问题总结.docx 1.1. tomcat插件调整内存设置在 run run cfg 配置页。。Debug模式共享相同设置 1 1.2. Pub
  13. java开发利用jacob将word转pdf
  14. Java文件File类型转BASE64
  15. C#使用Microsoft.Office.Interop.Word操作word书签位置插入Wingdings 2复选框
  16. vue依赖webpack的环境配置(一)
  17. 相似度(距离计算)汇总
  18. 写给初学者的6条网页设计安全配色指南
  19. 【2022.1】触控板可以点击但无法滑动ThinkPad一个驱动问题
  20. 隔离式DC/DC高压模块5V12V24V转50V110V250V300V380V600V1100V短路保护直流升压可调开关控制电源模块

热门文章

  1. pdf打印机怎么添加并使用?
  2. 盘点那些年我们一起玩过的网络安全工具
  3. 联想笔记本电脑BIOS中英文对照
  4. 语音播放与录音 (五分钟学会用 非常全面)
  5. 9点EXCEL计算公式
  6. 运行Wlmadmin无法访问计算机,网络许可证管理员指引.PDF
  7. 怎么把动图分解成图片?gif怎么拆分成几张?
  8. 肿瘤(Oncology)生物信息学分析简介
  9. 什么是测试开发工程师?
  10. 聊聊Linux2038年问题