使用 Python 将文件嵌入图像文件的困惑

2016-08-11 14:28:25 +08:00
 theodorus

用 Python 学着网上的同学写一段小脚本。将 zip 文件嵌入 bmp(24bits)的数据区。可以将文件嵌入图像中。可是问题是图像的格式改为 zip 后不能解压了。需要再写一段脚本把 zip 提取出来?那样岂不是很麻烦。系统平台是 Linux 。 希望有朋友帮忙指点一下。什么方法才能直接修改后缀(文件直接读取)就 OK 呢?

2723 次点击
所在节点    Python
32 条回复
theodorus
2016-08-11 15:00:49 +08:00
居然没人答 ==
aprikyblue
2016-08-11 15:36:11 +08:00
二进制数据直接顺序合并,图片在前,压缩文件在后
theodorus
2016-08-11 15:48:48 +08:00
@aprikyblue 对的。我分别使用了 windows 的批处理和 Python 进行二进制重导向,可是改后缀后依然无法解压。提示是压缩文件已损坏。
imn1
2016-08-11 15:51:55 +08:00
文件头不同,当然不能
bigtan
2016-08-11 15:52:30 +08:00
还没学好编程的时候就弄过这个,似乎 windows 下面就是一条 copy 命令就行。
theodorus
2016-08-11 15:56:16 +08:00
@bigtan 这个我在批处理下面尝试了好多次。 BMP 格式和 JPG 格式等,都能显示图片但是压缩包(改名字)损坏。
theodorus
2016-08-11 15:56:52 +08:00
@imn1 请问有什么好的方法实现吗?我以前看到有实现成功的。
symeonchen
2016-08-11 16:01:26 +08:00
直接使用 ZIP 后缀解压的前提是其二进制包含 ZIP 的文件头标识,且后续文件结构较为完整。所以用二楼的办法就可以了。

嵌入 BMP 的数据区属于隐写术,实际上改变了完整的 ZIP 结构,当然不能直接解压。
aprikyblue
2016-08-11 16:03:11 +08:00
bin = open('theImg.png','rb').read() + open('theCompr.zip','rb').read()
open('thefile.png', 'wb').write(bin)
theodorus
2016-08-11 16:11:05 +08:00
#!/usr/bin/python
import sys
f=open(sys.argv[3], "wb")
f.write(file(sys.argv[1], "rb").read())
f.write(file(sys.argv[2],"rb").read())

f.close()

我的这个代码和你的差不多。这样的方法不通用。想了解 ZIP 压缩原理。
aprikyblue
2016-08-11 16:14:51 +08:00
没深入研究过原理,可以看看那些软件是怎么判断文件格式并读取数据的。。
theodorus
2016-08-11 16:14:54 +08:00
@symeonchen 请问有什么办法能让 ZIP 的结构头能够比较好呢。我看到的比较简单的方法一共是两种
1. 利用二进制追加
2. 将 ZIP 文件写到 BMP 文件的数据区

经过测试。改后缀的方法都不能正常将压缩文件还原。
想请教一下参阅哪方面的知识呢。我看到网络上大多是比较高级的 隐写。
xenme
2016-08-11 16:15:37 +08:00
A:图片
B:ZIP 文件
A+B ,等于 A 文件头,没法直接改成 ZIP 直接用
B+A ,等于 B 文件头,没法当成图片文件直接看。
shyling
2016-08-11 16:15:57 +08:00
试了试
copy /B src.png + src.zip dest.png

没问题
theodorus
2016-08-11 16:18:13 +08:00
@aprikyblue 恩。我是无聊偶然看到这个的。结果发现各种形式都实现不了。打算弃坑用别人写好的软件。
theodorus
2016-08-11 16:20:33 +08:00
@shyling 为啥我的不能复现?(⊙v⊙)嗯?!
我的文件是 copy /b bed.jpg + test.7z tttttt.jpg

把后缀该成 7z 后解压不了啊。你确定你能解压?
wizardoz
2016-08-11 16:21:15 +08:00
在 linux ,扩展名只是给用户看的。大部分时候都是通过文件内容来识别。
theodorus
2016-08-11 16:24:10 +08:00
@wizardoz 这个我倒是比较清楚。主要问题是合并后为什么使用解压软件如 gzip 等命令解压。会提示
[root@CentOS localbin]$tar -xf test.tar
tar: This does not look like a tar archive
tar: Skipping to next header
tar: Exiting with failure status due to previous errors
我也试了 tar 打包的形式。仍然不行。
hitmanx
2016-08-11 16:33:00 +08:00
普通的 zip 和 7z 会不会在格式上有些差别?你试过普通的 zip 吗?
theodorus
2016-08-11 16:36:23 +08:00
@hitmanx 我都试过了。 7z 和 ZIP 和 jpg 和 BMP 。然而都不行。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/298649

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX