LSB图片隐写(最低有效位隐写)

 

LSB全称leastsignificant bit,是一种基于图片最低有效位修改储存信息的隐写方法,为什么会有这种隐写方法的产生呐,
其实很简单,我们都知道三原色,即:红绿蓝。就是大多数的颜色都可以通过三原色的不同比例调剂出来。
一般来说图片有BMP、JPG、BNG等格式,BMP、PNG是无损压缩的图片,而JPG是有损压缩的图片,所以一般使用PNG或BMP进行信息隐藏。一般BMP是没有压缩过的图片,所以会比较大。
如果图像是jpg图片的话,就没法使用lsb隐写了,原因是jpg图片对像数进行了有损压缩,我们修改的信息就可能会在压缩的过程中被破坏。

图片的图像像素一般都是由RGB三原色(红绿蓝)组成,每一种颜色占8位,取值为0x00~0xFF(十进制0~255),(以0x开始的数据表示16进制)就是256种,一共包含了256的3次方种颜色,即16777216种颜色

但是人类的眼睛只可以分辨大概1000万种不同的颜色,还有很多种细微的变化人类的眼睛是觉察不到的

LSB图片隐写(最低有效位隐写)_5g

而LSB隐写就是通过修改RGB颜色分量的最低位二进制(LSB),来进行信息的储存,人类的眼睛并不能感知到前后的变化

每个像素可以携带3bit的信息

 

 

 

LSB图片隐写(最低有效位隐写)_有效位_02

上图我们可以看到,十进制的235表示的是绿色,我们修改了在二进制中的最低位,但是颜色看起来依旧没有变化。我们就可以修改最低位中的信息,实现信息的隐写。我修改最低有效位的信息的算法就叫做lsb加密算法,提取最低有效位信息的算法叫做lsb解密算法。
再放两张图加深下理解:

LSB图片隐写(最低有效位隐写)_5g_03

LSB图片隐写(最低有效位隐写)_颜色值_04

一个像素可以携带3bit的信息

拓展:

图片在计算机中存储的方式:
如果将一幅图像放大,我们可以看到它是由一个个的小格子组成的,每个小格子就是一个色块。如果我们用不同的数字来表示不同的颜色,图像就可以表示为一个由数字组成的矩阵(matrix),这样就可以在计算机中存储。这个小格子就是像素(pixel),矩阵的行数与列数,就是分辨率(resolution)。
我们常说某张图像的分辨率是1280*720,指的就是这张图像是由1280行,720列的像素组成。反过来,如果我们有一个矩阵,将矩阵中的每个数值都转换为颜色,并在计算机中显示出来,就可以复现这张图像
LSB图片隐写(最低有效位隐写)_像素点_05

 

我们可以理解为图像在计算机中是以点阵的形式存在的,我们可以理解为一个二位数组或者矩阵,每个点所在的行和列是它的坐标,元素的值可以理解为当前像素的值。
可以实现隐写的原因:
这个原因有很多,但是最重要的还是因为人类的视觉冗余,其实是对相近的像素的敏感度比较低。所以改变部分像素的值不是很明显的话,肉眼基本察觉到不到。

 

????

【思考】一个像素点是什么颜色?理解彩色图片构成

RGB彩色图像中,一种彩色由R(红色),G(绿色),B(蓝色)三原色按比例混合而成。

图像的基本单元是一个像素,就像一个巨幅电子广告屏上远处看是衣服图像,走近你会看到一个一个的方格,这个方格的颜色是一种,从远处看,觉察不到这个方格的存在。

一个像素需要3块表示,分别代表R,G,B,如果8为表示一个颜色,就由0-255区分不同亮度的某种原色。

一张9像素的8位RGB图像,在计算机内存中的分布大概示意如下:

 

LSB图片隐写(最低有效位隐写)_有损压缩_06

 

LSB图片隐写(最低有效位隐写)_有损压缩_07

 

LSB图片隐写(最低有效位隐写)_5g_08

 

LSB图片隐写(最低有效位隐写)_有效位_09

 

LSB图片隐写(最低有效位隐写)_像素点_10

 

????

图片的像素和分辨率

对于像素和分辨率这两个词,主要见于图片和显示设备上。

像素是组成图象的最基本单元要素:点。分辨率是指在长和宽的两个方向上各拥有的像素个数。一个像素有多大呢?主要取决于显示器的分辨率,相同面积不同分辨率的显示屏,其像素点大小就不相同。

大家都知道线是由无数个点组成的,而面是由无数条线组成,即一个平面是由无数个点所组成。但无论技术多先进发达,人类总是不可能做到一幅图象由无数个点来构成的境界,只能在长和宽的方向上由有限个点组成而已。

这些有限的点就叫做像素,每一个长度方向上的像素个数乖每一个宽度方向上的像素个数的形式表示,就叫做图片的分辨率。

如一张640X480的图片,表示这张图片在每一个长度的方向上都有640个像素点,而每一个宽度方向上都480个像素点,总数就是640X480=307200(个像素),简称30万像素。

显然单位面积上像素点越多即像素点越小,这图片就越清晰细腻。

那这个像素点究竟有多大小呢?单纯从图片来说是不能确定这个点有多大的。这个大小和显示屏的分辨率息息相关。

????

颜色模式中8位,16位,24位,32位色彩是什么意思? 会有什么区别?计算机颜色格式( 8位 16位 24位 32位色)

颜色模式中8位,16位,24位,32位色彩是什么意思?

会有什么区别简单地说这里说的位数和windows系统显示器设置中的颜色位数是一样的。

表示的是能够显示出来的颜色的多少。

8位的意思是说,能够显示出来的颜色的数量有8位数。16、24都是一样的。
24位的颜色数量已经很多了,叫做“真彩色”,其实32位和24位颜色数量是一样多的。32位多出来的8位数是用来表示透明度信息的,所以更加真实。 如果一有一张真彩色的照片,放到一个只有8位的显示器上的话,显示出来的效果就会很差。所以当需要的时候你就需要在低位颜色的模式下编辑,让颜色更好。更详细的如下:
常见的颜色有 8位 16位 24位 32位色,其中24位及以上称为真彩,是PC上最常用的颜色,其他基本用于嵌入式系统或一些工控领域,详情可查阅一下表格:
Bit-深度    色彩数
1           2 (monochrome)
2           4 (CGA)
4           16 (EGA)
8           256 (VGA)
16          65,536 (High Color, XGA)
24          16,777,216 (True Color/真彩色, SVGA)
32          16,777,216 (True Color + Alpha Channel/控制透明度,-游戏特效)
      关于256色,早先的一些较为形象的解释是理解为256个油漆桶/256色调色板,分配给它们编号/索引号。“叫到哪个颜色”哪个颜色就出来填充像素。因为如16色、256色的色彩数有限所以这么解释很简单易理解。然而电脑操作过程中必须经过数码编码,那么实际上256种颜色对应256个数码(二进制数值),也就是2^2 * 2^3 * 2^3 = 2^8 = 256。256色模式下电脑没有必要去按24bit处理,在当时DOS时代,处理8bit色彩比24bit要容易多了。

     当然256色中的任意一种颜色都可以用24bit表示,甚至可以用32bit,64bit表示。但是不管如何,24bit模式就意味着 17.7million种颜色。256色模式就意味着256种颜色,或者理解为24bit的17.7million种颜色中的256个颜色。
256色模式: 共8 bits (B: 2 bits; G: 3 bits; R: 3 bits)。
High color:共16 bits (B: 5 bits, G: 6 bits, R: 5 bits)。
True color:一般24bit就是8bit/通道,真彩色。
windows下的32位是R、G、B三个通道各占8位共24位,加上明度通道8位,所以是32位,24位也就是R、G、B三个通道各占6位共18位,加上明度通道6位,所以是24位。
32位色中的24位用来保存颜色信息(R8G8B8),另外的8位用来保存ALPHA信息,ALPHA属性就是透明度。
24位色也有几种表示,可以是R5G6B5,也可以是R5G5B5,等等

16位色块可能会比较少,32比较好点
在颜色数方面,当然很明显,是2的16次方、24次方和32次方的差别。从人眼的感觉来说,16位色能基本满足显示需要,粗看起来和24位色、32位色差不多,仔细点研究的话,会发现在大面积的渐变色中16位色显示会出现隐约的分隔线。实际应用中,最常用的是24位色,比如网页和其他地方表示颜色的 “#80FF2E”之类的字符串,用答CDSee看图片也可以看到大部分图片的色深是24位。至于32位色,那是在24位基础上加出来的,据说是加了8位透明色,实际和24位色没多大差别,至少我们的眼睛是分辨不出来的。

32位色是指我们图像的rgb各8位,然后再加上z-buffer 8位凑成32位!其中真彩24位就足够了!然后后面的8位是在3d的显示中的!

《什么是24位BMP图片》   

    24是指图片颜色的位数,只所以图片要分颜色的位数,是因为既然图片以“像素”形式存贮着,就要记录下来第个“像素”的颜色值,这样才能在打开图片时看到存贮的图片。
    记录每一个像素的颜色值占用的二进制位数,就是BMP图片的位数,记录颜色值时又有不同的方法,比如用RGB值,也就是记录下红(RED)、绿(GREEN)、蓝(BLUE)的颜色值进行混合,还有XRGB、ARGB等等。
    比如16位颜色值,可心这样分:X1位,R5位,G5位,B5位;R5位,G6位,B5位或者是X、R、G、B均4位等等;
    24位颜色值称为“真彩色”,它有着统一的颜色分配:R8位,G8位,B8位;
    32位颜色值一般这样分配:X8位,R8位,G8位,B8位或A8位,R8位,G8位,B8位。
    当然还有更多的不同颜色值的图片,比如1位的,4位的,8位的等等,每种颜色值所用的位数越多,则表现这种颜色深度的精度越高,所有图像也越逼真,当然图片的容量也就越大。
在实用美术中,常有"远看色彩近看花,先看颜色后看花,七分颜色三分花"的说法。
  这也就说明,在任何设计中,色彩对视觉的刺激起到第一信息传达的作用。因此,对色彩的基础知识的良好掌控,在网页设计中才能做到游刃有余。

  为了使下面的网页配色分析更易于理解,我们先来了解色彩的RGB模式和HSB模式。

 RGB
  RGB是表示红色绿色蓝色又称为三原色光,英文为R(Red)、G(Green)、B(Blue),在电脑中,RGB的所谓"多少"就是指亮度,并使用整数来表示。
  通常情况下,RGB各有256级亮度,用数字表示为从0、1、2至255。虽然数字最高是255,但0也是数值之一,因此共256级。按照计算,256 级的RGB色彩总共能组合出约1678万种色彩,即256×256×256=16777216。通常也被简称为1600万色或千万色。也称为24位色(2 的24次方)。
  对于单独的R或G或B而言,当数值为0时,代表这种颜色不发光;如果为255,则该颜色为最高亮度。因此当RGB三种色光都发到最强的亮度,纯白的RGB值就为255,255,255。屏幕上黑的RGB值是0,0,0。R,意味着只有红色存在,且亮度最强,G和B都不发光。因此最红色的数值是255,0,0。同理,最绿色就是0,255,0;而最蓝色就是0,0,255。黄色较特殊,是由红色加绿色而得就是255,255,0

24bit 和 32bit 是一样的,由于24bit不能在显存中对齐,所以不是所有的显卡都能支持。反而 32bit 因为可对齐,大多数的显卡都支持(当然显存要足够大)。32bit实际上也是24bit,一般都在 MSB 上填充 8bit 的 0 或 alpha (没有实际效果)。
 
????
8位, 16位,24位,32位图片显示原理及对比

我们都知道一张图片可以保存为很多种不同的格式,比如bmp/png/jpeg/gif等等。这个是从文件格式的角度看,我们抛开文件格式,看图片本身,我们可以分为8位, 16位, 24位, 32位等。

  单击右键,属性->详细信息即可查看图片位深度:

LSB图片隐写(最低有效位隐写)_像素点_11

 

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位相同,可以显示所有的颜色,同时多了一个透明度值。