图片8位, 16位,24位,32位原理,以及如何进行补位互转

写在前面:之前一直没有这个概念,以为像素就是十六进制如 #FFFFFF,或者rgb(255,255,255) 即可实现颜色定义,理解相当肤浅,接触到一个物联网项目,写底层的童鞋让我把16位如 0*FFFF转为24位去显示在浏览器,同时下发给硬件的时候再转回十六位给他,瞬间干懵逼,特意花了两个小时去查阅相关资料,终于有了一知半解,汇总以备忘。

引用了CSDN与知乎优秀总结:

博主:丁香树下丁香花开:8位, 16位,24位,32位图片显示原理及对比https://blog.csdn.net/csdn66_2016/article/details/82850695文章浏览阅读5.9w次,点赞50次,收藏169次。 我们都知道一张图片可以保存为很多种不同的格式,比如bmp/png/jpeg/gif等等。这个是从文件格式的角度看,我们抛开文件格式,看图片本身,我们可以分为8位, 16位, 24位, 32位等。 单击右键,属性->详细信息即可查看图片位深度:8位: 2^8 = 2^2(B) 2^3(G) 2^3(R) = 256 (256色) 可以总共显示256种颜色16位:..._24位图片https://blog.csdn.net/csdn66_2016/article/details/82850695

博主:wkd_007 :bmp位图格式详细介绍-1/4/8/16/24/32bit、存储格式等bmp位图格式详细介绍-1/4/8/16/24/32bit、存储格式等_bmp文件详解-CSDN博客文章浏览阅读1.5w次,点赞23次,收藏88次。详细介绍bmp位图文件的四个部分:位图文件头、位图信息头、调色板、位图数据,并且结合位图文件数据举例说明了什么是位图文件,bmp位图看这篇文章就差不多了_bmp文件详解https://blog.csdn.net/wkd_007/article/details/128214157

 以及知乎:16位色对24位色的映射? - 知乎

总结一些概念性知识点:希望能从概念,实操,代码说明上对图片位数理解更深入一些

一,位图

位图图像(bitmap),亦称为点阵图像或栅格图像,是由称作像素(图片元素)的单个点组成的。这些点可以进行不同的排列和染色以构成图样。当放大位图时,可以看见赖以构成整个图像的无数单个方块。扩大位图尺寸的效果是增大单个像素,从而使线条和形状显得参差不齐。

二,位深 

常用的8位图,24位图,其实就是在说这个图像,是用了多少位二进制来表示色值。位深指的就是二进制的位数(bit)。
比如,位深只有1位的话,那就只能用0和1表示颜色,也就是0(黑)和1(白)两种颜色。
通常计算机用一个字节(8位)来控制一种颜色的强度,那要表示R、G、B就需要24位(3*8),这也是最常见的图像位深。 【引自知乎:16位色对24位色的映射? - 知乎】

三,不同位深图片的存储原理

8位:  2^8 = 2^2(B) 2^3(G) 2^3(R) = 256  (256色)    可以总共显示256种颜色

16位:2^16 = 2^5(B) 2^6(G) 2^5(R) =  65536    可以总共显示65536种颜色

24位:2^24 = 2^8(B) 2^8(G) 2^8(R) =  16777216    可以总共显示16777216种颜色

32位:Alpha透明度 + 24位

区别:

当8或16位深度时,单个原始颜色 (R/G/B)最大只能表示为(0~2^3)/(0~2^6), 无法满足(0~0xff)的范围,所以显示的颜色范围有限。

  当24位深度时,使用24bit显示一个像素点, 由8bit Red, 8bit Green, 8bit Blue组合颜色而成,每一个原始颜色(R/G/B)都可以完全显示(0~0xff),所以24位及以上,我们就叫做真彩色

  当32位深度时,与24位相同,可以显示所有的颜色,同时多了一个透明度值。

 【以下位图介绍引自知乎:16位色对24位色的映射? - 知乎】

1、24位图

24位图每个像素占用3个字节,每一个原始颜色(R、G、B)都使用8位表示,因此占用24位(8*3)。每个原始颜色都能完整显示256阶颜色,其表示的色彩有16777216种颜色(256^3)。由于人眼最多可以识别100多万种颜色,因此也将24位叫做真彩色。
图中像素的信息为:1111 0011 1110 1010 0011 0111

2、16位图

16位图每个像素占用2个字节,也是通过RGB数值来表示颜色,与24位图原理类似。根据二进制的特征,低位数值的变化对于整体数值影响不大,因此将8位缩减,而达到减少字节的效果。在实际显示时,通过特定的转换方式将16位再扩展为24位。概括来说,就是移位补0的方式。
常见的16位图有两种格式,分别为RGB565、RGB555

  • RGB565

RGB565的存储信息方式就是R-5位、G-6位、B-5位。565存储方式下,示例的像素点信息为

转换为24位时,R-后3位补0、G-后2位补0、B-后3位补0

实际显示的颜色信息为:1111 0000 1110 1000 0011 0000,换算为RGB(240,232,48)。

  • RGB555

RGB555的存储信息方式是,最高位不用,每个颜色都占5位。555存储方式下,示例的像素点信息为:

转换为24位时,每个颜色后3位补0,换算为RGB还是(240,232,48)。

对比色值可以看到,转换之后与原始颜色的RGB数值差异是较小的。只是在有颜色过渡的情况下,会由于丢失细节数据,而导致过渡相对不平滑。但对于本身像素间差异就比较大的图片不会有太大影响,但每个像素点可以节约1个字节的空间,对于大尺寸图片来说存储优势还是比较明显的。

3、8位图

8位图的像素信息与以上二种是完全不同的,采用的是索引色,单个像素存储的值不是直接的RGB色值,而是一个映射关系。这里插一个概念:如果像素信息就是RGB色值,叫做直接色
8位图的图片信息中先存储了一个256行的色彩数列,单个像素信息存储的值指向对应的行,读取这一行存储的RGB值进行显色,因此称为索引色。假设某一个像素的的值为4,那这个像素就与数列的第4行形成映射,在屏幕显示的实际颜色是就是第4行的RGB值。

四,转换实战:硬件16位颜色转24位给浏览器显示

(因为楼主是PHPer,故从php的角度进行转换,其他语言同理)

转换一:硬件上报16位,程序解析成24位

条件:假使硬件童鞋下发给我们指令颜色为565格式的16位的数据,如:0*FFFF

第一步:0*FFFF 十六进制转二进制:为 1111111111111111

第二步:按照R-后3位补0、G-后2位补0、B-后3位补0,可先切换为 11111 111111 11111,分别补3个0,2个0,3个0,即为 11111000  11111100  11111000,二进制转十进制,即为:rbg(248,252,248)

【理论上硬件下发的是白色,也就是应该转成 rgb(255,255,255),但是因为位移关系,造成的细微误差可以忽略不计,因为本身就是为了减少字节长度】

转换二:程序设置颜色为24位,下发给硬件需转成16位

条件:假使我们设置的颜色为rgb(255,255,255),需要下发给硬件

第一步:255,255,255 转二进制:11111111  11111111  11111111

第二步:按565格式,将每个二进制的数据,8字节按323进行减少,即为:11111  111111  11111,再由二进制转十六进制:即为 0*FFFF

至此,转换流程ok!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/601340.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何使用SkyWalking收集分析分布式系统的追踪数据

Apache SkyWalking 是一个开源的观测性工具,用于收集、分析和展示分布式系统的追踪数据。SkyWalking 支持多种语言的追踪,包括但不限于 Java、.NET、Node.js 等。以下是使用 SkyWalking 工具实现数据采集的详细步骤: 1. 下载和安装 SkyWalkin…

MCU做死循环时,到底应该用for(;;) 还是wihile(1)

MCU做死循环时 for while stm32中老工程师用forfor while背景for版本while版本正方观点:哪有好的编译器:反方观点:这种代码过时了工程师实地测试:和编译器和优化有关 建议还是用for参考 stm32中老工程师用for /* Start scheduler …

MS2107 宏晶微 音视频采集芯片 提供开发资料

1. 基本介绍 MS2107 是一款视频和音频采集芯片,内部集成 USB2.0 控制器和数据收发模块、视频 ADC模块、音频 ADC 模块和音视频处理模块。MS2107可以将 CVBS、S-Video 和音频信号通过 USB接口传送到 PC、智能手机和平板电脑上预览或采集。MS2107 输出支持 YUV422 和 MJPEG 两种…

css: hover 划过显示/隐藏 div 样式

1. 图例: 划过用display: block;和 display: none; 显示div和隐藏div div: <div class="sectorBox"> <div v-for="(item, index) in sectorList" :key="index" class="sill"> <div class="si…

三维点云处理-聚类(下)

接着前一部分数据聚类方法的介绍&#xff0c;由于K-means和GMM方法都是基于欧式距离信息处理的&#xff0c;两者分别以圆形和椭圆形来作为数据的聚类分割方式&#xff0c;这种情况下会导致环形图和月牙图数据分割不准确&#xff0c;因此进一步的介绍一种谱聚类方法&#xff0c;…

Elastic 通过 AI 驱动的安全分析改变 SIEM 游戏

作者&#xff1a;Santosh Krishnan, Jennifer Ellard 借助由搜索 AI 提供支持的新攻击发现功能&#xff0c;优先考虑攻击&#xff0c;而不是警报。 传统的安全信息与事件管理系统&#xff08;SIEM&#xff09;在很大程度上依赖屏幕背后的人类才能取得成功。警报、仪表盘、威胁…

Python高级编程-DJango2

Python高级编程-DJango2 没有清醒的头脑&#xff0c;再快的脚步也会走歪&#xff1b;没有谨慎的步伐&#xff0c;再平的道路也会跌倒。 目录 Python高级编程-DJango2 1.显示基本网页 2.输入框的形式&#xff1a; 1&#xff09;文本输入框 2&#xff09;单选框 3&#xff…

我用 GitHub 9.8k 的 Go 语言 2D 游戏引擎写了个游戏

前言 hi&#xff0c;大家好&#xff0c;这里是白泽。今天给大家分享一个 GitHub &#x1f31f;9.8k 的 Go 语言 2D 游戏引擎。 https://github.com/hajimehoshi/ebiten 引擎的贡献者依旧在积极维护&#xff0c;是一个兼具学习 & 娱乐的项目&#xff01; 为此我也用这个…

数据结构-线性表-应用题-2.2-11

1)算法的基本设计思想&#xff1a; 分别求两个升序序列的中位数a,b 若ab&#xff0c;则a或b即为所求中位数 若a<b&#xff0c;则舍弃A中较小的一半&#xff08;中位数偏小&#xff0c;往后面找&#xff09;&#xff0c;同时舍弃序列B中较大的一半&#xff0c;两次舍弃长度…

meshlab: pymeshlab保存物体的横截面(compute planar section)

一、关于环境 请参考&#xff1a;pymeshlab遍历文件夹中模型、缩放并导出指定格式-CSDN博客 二、关于代码 本文所给出代码仅为参考&#xff0c;禁止转载和引用&#xff0c;仅供个人学习。 # pymeshlab需要导入&#xff0c;其一般被命名为ml import pymeshlab as ml# 本案例所…

C++ | Leetcode C++题解之第74题搜索二维矩阵

题目&#xff1a; 题解&#xff1a; class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m matrix.size(), n matrix[0].size();int low 0, high m * n - 1;while (low < high) {int mid (high - low) / 2 l…

YOLOv8的训练、验证、预测及导出[目标检测实践篇]

这一部分内容主要介绍如何使用YOLOv8训练自己的数据集&#xff0c;并进行验证、预测及导出&#xff0c;采用代码和指令的两种方式&#xff0c;参考自官方文档&#xff1a;Detect - Ultralytics YOLOv8 Docs。实践篇不需要关注原理&#xff0c;只需要把流程跑通就行&#xff0c;…

白色或类白色的粉末/固体,DOTA-Ala-Ala-Tyr-COOH,是一种具有特定氨基酸序列的多肽,具有良好的稳定性和溶解性

一、试剂信息 英文名&#xff1a;DOTA-Ala-Ala-Tyr-COOH&#xff0c;DOTA-AAY-OHCAS号&#xff1a;N/A分子式&#xff1a;C31H47N7O12分子量&#xff1a;709.74结构式&#xff1a; 纯度标准&#xff1a;≥95%包装规格&#xff1a;1g&#xff0c;5g&#xff0c;10g&#xff08…

Selenium——获取元素和操纵元素的方法

1、获取元素的方法 1、通过id获取 element wd.find_element(By.ID,"id")2、通过classname获取 elements wd.find_elements_by_class_name("plant") for element in elements:print(element.text)3、通过tagname获取元素 elements wd.find_elements_…

SpringBoot2 仿B站高性能前端+后端项目(wanjie)

SpringBoot2 仿B站高性能前端后端项目(完结) Spring Boot 2 仿B站高性能前端后端项目&#xff1a;打造高效、稳定、可扩展的应用 在当今的互联网时期&#xff0c;网站的性能、稳定性和可扩展性成为了权衡一个项目胜利与否的关键要素。本文将引见如何运用 Spring Boot 2 构建一…

AIGC-3D数字人技术:高效助推各行业数字化水平升级

从“互联网”到“人工智能”&#xff0c;数字员工作为一种全新的交互形式&#xff0c;对企业有着重要的作用&#xff0c;企业、品牌通过数字人的AI语音交互、AI播报等核心功能&#xff0c;可以有效推动企业提升数字水平。 作为3D、AI虚拟数字人技术服务商及方案提供商&#xff…

鸿蒙内核源码分析(工作模式篇) | CPU的七种工作模式

本篇说清楚CPU的工作模式 工作模式(Working mode) 也叫操作模式&#xff08;Operating mode&#xff09;又叫处理器模式&#xff08;Processor mode&#xff09;&#xff0c;是 CPU 运行的重要参数&#xff0c;决定着处理器的工作方式&#xff0c;比如如何裁决特权级别和报告异…

【IP:Internet Protocol,子网(Subnets),IPv6:动机,层次编址:路由聚集(rout aggregation)】

文章目录 IP&#xff1a;Internet Protocol互联网的的网络层IP分片和重组&#xff08;Fragmentation & Reassembly&#xff09;IP编址&#xff1a;引论子网&#xff08;Subnets&#xff09;特殊IP地址IP 编址: CIDR子网掩码&#xff08;Subnet mask&#xff09;转发表和转发…

【verilog-语法】编译命令( compiler directives )

一、前言 编译器指令的范围是从它的出现的点延伸到处理的所有文件&#xff0c;直到另一个编译器指令取代它或处理结束。编所有的编译命令都有重音符 " "引出。在IEEE std1364-2005中共介绍了19条编译命令&#xff0c;这19条命令又可分为12组命令进行独立或组合使用…

Unity射击游戏开发教程:(12)使用后处理

后处理 后期处理是向您的游戏场景添加一个或多个滤镜,确实可以为您的游戏提供精美的外观。在本文中,我们将讨论如何在 Unity 中设置后处理系统,从那里您可以探索和试验 Unity 提供的所有过滤器。 首先,我们需要从包管理器添加后处理器堆栈。包管理器是 Unity 产品的集合,…