`
谁解怨妇心
  • 浏览: 27125 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

在BMP位图中隐藏数据

阅读更多
   相信看过Andrew那本很经典的《计算机网络》都会记得第N章(N是多少我忘记了……)里面提到的在一幅图像里面隐藏了一本《莎士比亚》全集的数据。
    这种代码在网上已经是很常见的了,不过最近因为研究着拆游戏的cg立绘之类的东西就学习了一下BMP图像的格式就想到一个不同隐藏方法。
    网上的代码大多都是利用每个像素里面颜色后面几位来存储要隐藏的数据,这样的话在颜色比较单一的情况下对图像的影响是十分明显的。而我的代码中是将24位的图像转换为32位图像后在alpha通道的位置写入数据。
    在24位位图中,每个像素用三个字节存储,而32位位图则是4个字节,除了RGB通道外,还有多出来的一个字节是alpha通道。alpha通道是用来存储透明度的信息的,例如有两幅图片,一幅是风景另外一幅是一间房子,房子上有个玻璃窗。按照常理来说,当两幅图像重叠的时候可以透过玻璃看到外面的景物的,而ALPHA混合就是用来实现这个功能。Alpha混合根据图像的alpha通道的值来计算两幅图像重叠后那一点的色彩值。所以修改这个值在位图上是看不出改变的。
    还有一点要注意的是位图文件里面每一行像素数据的字节数一定要是4的倍数,所以在位图中每隔位图宽*3个字节数会有几个0字节是用来填充的,所以转换的时候要跳过这几个字节。
    而位图文件头和信息头的修改可以直接参考MSDN相关说明。
    程序和源码见附件。很久没用ASM写程序,用来练一下手,代码写得有点难看orz
  • bin.rar (5.8 KB)
  • 下载次数: 10
分享到:
评论
4 楼 谁解怨妇心 2009-10-15  
night_stalker 写道
您谦虚了 …… 代码写得相当的好看,命名非常的标准正统 口牙

我是命名白痴,实在是想不到要怎么给变量命名了……

RednaxelaFX 写道
32位BMP在某些软件(例如Windows自带的图片浏览器)里是看不出alpha效果,但用Fireworks或者PS打开就还是能看到。之前做BMW的时候在里面也碰到过需要处理32位BMP的情况,我懒得写工具,让苦工用XnView批量转成PNG再编辑然后再压回去YGA……

在颜色比较单一的图片里藏数据,要保持原本的平滑感确实比较麻烦。不过说不定可以用类似PNG做差分那样,根据上边、左上边和左边的几个像素的数据来使用较小的差值藏入较大的实际值?

这样大概是可行的,我翻了翻别人信息隐藏课程那本教材有说到这方面的内容,不过要做到高级的隐藏需要的数学跟通信方面的知识太深了,我这种只能算是玩票+业余的。

Brainloller和Braincopter可以开创用PS编程的新时代啊囧
3 楼 RednaxelaFX 2009-10-13  
话说我想起了BrainlollerBraincopter
2 楼 RednaxelaFX 2009-10-13  
32位BMP在某些软件(例如Windows自带的图片浏览器)里是看不出alpha效果,但用Fireworks或者PS打开就还是能看到。之前做BMW的时候在里面也碰到过需要处理32位BMP的情况,我懒得写工具,让苦工用XnView批量转成PNG再编辑然后再压回去YGA……

在颜色比较单一的图片里藏数据,要保持原本的平滑感确实比较麻烦。不过说不定可以用类似PNG做差分那样,根据上边、左上边和左边的几个像素的数据来使用较小的差值藏入较大的实际值?
1 楼 night_stalker 2009-10-13  
您谦虚了 …… 代码写得相当的好看,命名非常的标准正统 口牙

相关推荐

Global site tag (gtag.js) - Google Analytics