今天做DAM的作业,做到图片水印的时候,想起来当初小调同学把言页之庭的种子通过图片发给我。看到下面这个新闻真是觉得碉堡了!!技术宅又一次可以成功而隐晦的表白了!!哈哈哈!!

http://war.163.com/10/0712/17/6BDLNUB90001123L.html

下面分享以下自己用python实现的隐写术,后面如果有时间会再更深入研究一下解码的问题!!

基本思路是:

1.每张图片都有RGB三个通道,每个像素点的值为3个8位的R/G/B值。

2.把每个RGB值的最后两位&11111100(0xFC)移掉,因为最后两位对图片的影响不大,肉眼基本不可见

3.把要隐藏的图片的RGB值都除以85(255/3=85),这样正好可以通过2bits(00-11,0-3)来表示图片

4.把得到的值填到之前的2个空bit中

5.等解码的时候只要把之前在原图中藏进去的2位提取出来(&0x3)再*85就可以得到原图信息

还有一种方法是把信息写道Alpha通道里并按RBG格式编码,解码时用L格式。

但是图片会失真一点,因为毕竟相比8位的存储,2位的存储信息会少很多,但是却已经可以看到80%的图片信息了。所以不得不再赞一下二八法则,20%的编码信息里存储了80%的图片信息啊。

import Image,ImageChops

def waterMark(originFile,markFile):
origin = Image.open(originFile)
mark = Image.open(markFile)
size = mark.size #record the original size of the marked image
mark = mark.resize(origin.size) #set the pics in same size origin.load();
mark.load()
source1=origin.split() #split the pic in 3 channel
source2=mark.split() image=[(),(),()]
waterMark=[(),(),()]
for x in [0,1,2]: #loop in 3 channel, RGB
image[x]=source1[x].point(lambda i:i & 0xFC) #remove the last 2 bits of the original image, 0xFC=11111100
waterMark[x]=source2[x].point(lambda i:i/85) #reduce the RGB value of each channel, 255/3=85 mark=Image.merge("RGB",waterMark)
origin=Image.merge("RGB",image) result=ImageChops.add(mark,origin) return result,size def deCode(waterMark,size):
#waterMark=Image.open(waterMark)
waterMark.load()
source = waterMark.split()
originSize=size
#print originSize mark=[(),(),()]
for x in [0,1,2]:
mark[x]=source[x].point(lambda i:(i & 0x3)*85) #get back the RGB value of the marked image result=Image.merge("RGB",mark)
result = result.resize(originSize) return result if __name__ == '__main__':
img1,size = waterMark("avatar2.jpg","green.jpg")
img2 = deCode(img1,size) img1.show() #original image with watermark
img2.show() #embeded image

Steganography-图片隐写术的更多相关文章

  1. javascript图片隐写术,感觉可以用它来干点有想法的事情

    1.什么是图片隐写术? 权威的wiki说法是“隐写术是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容.”,图片隐写术简而言之就是利用图片 ...

  2. Javascript实现的图片隐写术

    javascript图片隐写术,感觉可以用它来干点有想法的事情   1.什么是图片隐写术? 权威的wiki说法是“隐写术是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人 ...

  3. 【CTF】图片隐写术 · 修复被修改尺寸的PNG图片

    前言 今天我们想来介绍一下关于图片隐写相关处理,以及修复被修改尺寸的PNG图片. 关于PNG图片的相关处理,是CTF Misc图片隐写术中极为基础的一项操作,笔者这里是想要提一些做题过程中发现的小技巧 ...

  4. CTF之图片隐写术解题思路

    参考大佬的博客:https://blog.csdn.net/a_small_rabbit/article/details/79644078 深有感触,觉得写得比较全,因此将此篇文章记录在此方便以后用得 ...

  5. 【CTF】图片隐写术 · 盲水印

    前言 盲水印同样是CTF Misc中极小的一个知识点,刚刚做到一题涉及到这个考点的题目. 感觉还挺有意思的,就顺便去了解了下盲水印技术. 数字水印 数字水印(Digital Watermark)一种应 ...

  6. 实验吧-隐写术-黑与白(二)(反转+五笔+Image steganography)

    反转有二:颜色反转.文件名反转 文件名这么乱,毫无规律,好奇怪,进行反转后发现是:steganography(就是隐写术的意思),这还是个图片文件,有一款工具正好叫Image steganograph ...

  7. wechall.net/stegano 解题心得

    /* 转载请注明出处:http://www.cnblogs.com/Martinium/p/wechall_stegano.html */ 最近迷上了 www.wechall.net 网站,里面都是些 ...

  8. CTF 介绍及杂项

    CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式.CTF起源于1996年DEFCON全球黑客大会,以代替之前黑客们通过 ...

  9. Python示例项目学习

    原文地址:http://www.360doc.com/showweb/0/0/874025604.aspx 「 Python3 实现火车票查询工具 」   相信很多人学Python都是冲着它强大的爬虫 ...

随机推荐

  1. Linux Discuz论坛的安装

    1:建一个文件夹保存Discuz3.2

  2. GMF Q&A(1): 如何让palette支持拖拽(DnD)等10则

    1,如何让palette支持拖拽(DnD) 在*PaletteFactory类中,把私有类NodeToolEntry 和LinkToolEntry的基类修改为PaletteToolEntry.并在构造 ...

  3. python--数据清洗

    1.数据错误: 错误类型– 脏数据或错误数据• 比如, Age = -2003– 数据不正确• '0' 代表真实的0,还是代表缺失– 数据不一致• 比如收入单位是万元,利润单位是元,或者一个单位是美元 ...

  4. 复旦高等代数 I(15级)思考题

    1.证明: 第三类分块初等变换是若干个第三类初等变换的复合. 特别地, 第三类分块初等变换不改变行列式的值. 2.设 $n\,(n\geq 2)$ 阶方阵 $A=(a_{ij}(x))$, 其中每个元 ...

  5. [问题2015S10] 复旦高等代数 II(14级)每周一题(第十一教学周)

    [问题2015S10]  设 \(A\) 为 \(n\) 阶实方阵, 证明: 存在 \(n\) 阶非异实对称阵 \(R\), 使得 \(A'=R^{-1}AR\), 即 \(A\) 可通过非异实对称阵 ...

  6. cas的http配置和rmi远程调用

    1.cas配置http请求(服务端) 1) 解压cas-server-3.4.4-release.zip将modules目录下的cas-server-webapp-3.4.4.war改名称为cas.w ...

  7. SQL Server 2012 管理新特性:AlwaysOn【转】

    http://jimshu.blog.51cto.com/3171847/871169 见超链接

  8. ural1057 Amount of Degrees

    链接 这题有一点小坑点 就是AX^B  A只能为0或者1  ,剩下的就比较好做的了. #include <iostream> #include<cstdio> #include ...

  9. javascript事件之:谈谈自定义事件

    对于JavaScript自定义事件,印象最深刻的是用jQuery在做图片懒加载的时候.给需要懒加载的图片定义一个appear事件.当页面图片开始出现时候,触发这个自定义的appear事件(注意,这里只 ...

  10. DELETE与TRUNCATE的区别

    当执行 DELETE FROM TABLE后,会发现针对一个DELETE语句,该表中有多少行内容,数据库日志文件中,相对应的记录是就是多少条,每一条记录,对应的是行级别的删除.而且对应的LSN编号也是 ...