图片中隐藏信息——图片隐写术

article/2025/9/25 23:44:16

https://www.jianshu.com/p/72f0d0953ca4

主要原理:

图片是由一个个像素组成的。每个像素由一组(r,g,b)值表示(png格式图片,多一个alpha透明度值)。而对于单个r,g或b,其范围在0~255之间,可由一个字节(8位表示)。因此,当改变最低位的值时,对于整个图片来说,其视觉效果通过肉眼看不出来的。比如一组颜色白色(255,255,255),变为(254,255,255)时,是看不出来变化的。
因此,可将一组待隐藏信息转换为二进制后,再将每个二进制码存储在图片的像素中。

原图片.png

 

隐藏有信息后的图片.png

实现步骤

加密

  • 获取原图片像素(list)
  • 使像素最低位变为偶数
  • 待隐藏信息转换为二进制,并且对于单字节字符,当位数不够8时,在最高位补0
  • 将二进制的待隐藏信息依次与图片中每个像素的r、g、b进行相加

解密

  • 获取隐藏有信息的图片的像素(list)
  • 获取像素值的最低位(隐藏的信息存储位置)
  • 获取存储的信息的二进制值
  • 按每8位为一组,将上述二进制转换为十进制形式
  • 采用chr函数,将十进制转为字符并存储到字符串中

源码

# -*- coding: utf-8 -*-
from PIL import Image
import sys reload(sys) 
sys.setdefaultencoding('utf8') """
取得一个 PIL 图像并且更改所有值为偶数(使最低有效位为 0)
"""
def makeImageEven(image):pixels = list(image.getdata())  # 得到一个这样的列表: [(r,g,b,t),(r,g,b,t)...]evenPixels = [(r>>1<<1,g>>1<<1,b>>1<<1,t>>1<<1) for [r,g,b,t] in pixels]  # 更改所有值为偶数(魔法般的移位)evenImage = Image.new(image.mode, image.size)  # 创建一个相同大小的图片副本evenImage.putdata(evenPixels)  # 把上面的像素放入到图片副本return evenImage"""
内置函数 bin() 的替代,返回固定长度的二进制字符串
"""
def constLenBin(int):binary = "0"*(8-(len(bin(int))-2))+bin(int).replace('0b','')  # 去掉 bin() 返回的二进制字符串中的 '0b',并在左边补足 '0' 直到字符串长度为 8return binary"""
将字符串编码到图片中
"""
def encodeDataInImage(image, data):evenImage = makeImageEven(image)  # 获得最低有效位为 0 的图片副本binary = ''.join(map(constLenBin,bytearray(data, 'utf-8'))) # 将需要被隐藏的字符串转换成二进制字符串if len(binary) > len(image.getdata()) * 4:  # 如果不可能编码全部数据, 抛出异常raise Exception("Error: Can't encode more than " + len(evenImage.getdata()) * 4 + " bits in this image. ")encodedPixels = [(r+int(binary[index*4+0]),g+int(binary[index*4+1]),b+int(binary[index*4+2]),t+int(binary[index*4+3])) if index*4 < len(binary) else (r,g,b,t) for index,(r,g,b,t) in enumerate(list(evenImage.getdata()))] # 将 binary 中的二进制字符串信息编码进像素里encodedImage = Image.new(evenImage.mode, evenImage.size)  # 创建新图片以存放编码后的像素encodedImage.putdata(encodedPixels)  # 添加编码后的数据return encodedImage"""
从二进制字符串转为 UTF-8 字符串
"""
def binaryToString(binary):index = 0string = []fun = lambda x, i: x[0:8]while index + 1 < len(binary):        chartype = binary[index:].index('0') # 存放字符所占字节数,一个字节的字符会存为 0if chartype == 0:chartype = 1        length = chartype*8for i in range(chartype):            ascode = int(binary[index+i*8:index+i*8+8],2)string.append(chr(ascode))index += length        return ''.join(string)"""
解码隐藏数据
"""
def decodeImage(image):pixels = list(image.getdata())  # 获得像素列表binary = ''.join([str(int(r>>1<<1!=r))+str(int(g>>1<<1!=g))+str(int(b>>1<<1!=b))+str(int(t>>1<<1!=t)) for (r,g,b,t) in pixels]) # 提取图片中所有最低有效位中的数据# 找到数据截止处的索引locationDoubleNull = binary.find('0000000000000000')endIndex = locationDoubleNull+(8-(locationDoubleNull % 8)) if locationDoubleNull%8 != 0 else locationDoubleNulldata = binaryToString(binary[0:endIndex])return data#隐藏信息
encodeDataInImage(Image.open("1.png"), 'hello,欢迎你们').save('encodeImage.png')
#读取信息
print decodeImage(Image.open("encodeImage.png")).encode("gbk")

参考来源

https://www.shiyanlou.com/courses/651

 


http://chatgpt.dhexx.cn/article/eaoOLYwu.shtml

相关文章

android 获取图片信息 之 ExifInterface

Android--操作图片Exif信息 --------------------------------------------------------------------------------------- 作者&#xff1a;承香墨影 出处&#xff1a;http://plokmju.cnblogs.com/ 更多内容&#xff0c;请阅读本人新书&#xff1a;《Android深入浅出》 欢迎…

图片头文件信息解析

今天发现获取图片的宽高&#xff0c;并不需要把图片完全读完之后再来获取&#xff0c;而只需要读取文件头文件&#xff0c;几十个字节便可以读出文件的宽高。 图片的文件头部存储有该图片相关信息&#xff0c;可以从中读取相应字段&#xff0c;得到尺寸、大小、格式等信息。由于…

图片Exif信息解析(Java实现)

前言 可交换图像文件(Exchangeable Image File&#xff0c;Exif)信息图像在拍摄时保留的相关参数&#xff1a;比如图像信息&#xff08;厂商&#xff0c;分辨率等&#xff09;&#xff0c;相机拍摄记录&#xff08;ISO&#xff0c;白平衡&#xff0c;饱和度&#xff0c;锐度等…

java项目实战:处理图片水印,提取图片信息,生成excel表

在这次应用软件设计课程中&#xff0c;要求从今年的软件杯大赛上的项目选择一个实现。我选的是"网店工商信息提取"&#xff0c;具体要求就是&#xff1a;从给出的带水印的图片中提取出企业名称和企业注册号&#xff0c;并根据这些信息生成excel表格。 刚刚开始以为这…

nodejs图片读取

response返回都是html/text&#xff0c;向前台输出一张图片用的image/jpeg,服务器读取图片的时候是按照binary的二进制方式读取&#xff0c;给客户端返回的时候也按照binary二进制的方式返回。 从服务器读取一张图片给客户端输出&#xff1a; 效果&#xff1a;输入localhost:…

[软件工具] 如何批量获取图片信息,尺寸、大小、路径、文件名,然后导出表格或者txt的文本,下面教你使用方法

前几天遇到一个比较棘手的需求&#xff1a; 如何获取几万张图片的大量的图片信息&#xff0c;如尺寸、大小、路径、文件名等等&#xff0c; 去看了百度 好多都是教写批处理的文件信息&#xff0c;对批处理不是很懂&#xff0c;写了几次都没成功 然后做这么一款软件&#xff…

APICloud框架——获取本地图片信息

api.getPicture 获取本地图片放置到服务器上或者在app中预览是app的基本功能&#xff0c;今天使用了APICloud框架的api.getPicture这个api获取到的本地图片预览在app中&#xff0c;就像上传qq头像一样&#xff0c;其实就是这个需求&#xff0c;获取本地照片&#xff08;拍摄照片…

imagemagick 获取图片信息,放大缩小,指定区域,旋转,边框,draw png压缩问题

Table of Contents 1.获取图片信息 2.放大缩小 -resize 3.放大缩小 -sample 4.指定区域 5.旋转 6.添加边框 7.draw的用法 1.获取图片信息 C:\Users\Administrator>magick identify F:\imagemagick\1.jpg F:\imagemagick\1.jpg JPEG 1440x2560 1440x256000 8-bit sRGB …

解决透视变换后图片信息丢失的问题

问题背景&#xff1a;最近在做图像拼接&#xff0c;思路是首先对输入的两幅图进行特征提取&#xff0c;提取的方法使用的是经典的SIFT&#xff08;Scale-invariant feature transform&#xff09;算法&#xff1b;然后进行特征匹配&#xff0c;匹配的思路是将一幅图中的特征点以…

wx.getImageInfo(Object object)获取图片信息

微信小程序第一周总结 总结人&#xff1a;陈曦 wx.getImageInfo(Object object)获取图片信息 在小程序/小游戏中使用网络相关的 API 时&#xff0c;每个微信小程序需要事先设置一个通讯域名&#xff0c;小程序只可以跟指定的域名与进行网络通信。包括普通 HTTPS 请求&#xff…

利用Python实现图片信息隐藏

最近上了一门信息隐藏的课,讲的关于技术层面的内容还是蛮多的,但是我也没记住几个。吭吭,言归正传,这两天要交大作业,自己手动实现一种图像信息隐藏,查了一番资料后,决定Python来做(主要是调用包方便),原理很简单,主要利用修改图像RGB通道的某一通道值来隐藏二维信息…

Python获取图片信息小栗子

1.首先我们需要先导入所需要的包&#xff0c;没有的话可以【 pip install ~】 来获取 import requests from lxml import etree 2.接下来我们要进行UA伪装&#xff0c;伪装的目的就是把电脑伪装成人 因为很多wangzahn都有反扒机制&#xff0c;不进行伪装的话根本就无法进行爬…

线性回归用matlab怎么做,matlab中如何应用regress()函数进行线性回归分析?

matlab中如何应用regress()函数进行线性回归分析&#xff1f;回归分析是研究一个随机变量与一个或多个普通变量之间的相关系的统计方法。如果做回归分析&#xff0c;有很多软件都已经封装好了的&#xff0c;我们只需直接调用就可以了。例如Matlab中的regress()就是做线性回归分…

[Matlab]篇----回归分析Matlab命令(regress篇)

[Matlab]篇—-回归分析Matlab命令&#xff08;regress篇) 一、简介 最近在做回归分析方面的东西&#xff0c;网上查阅相关资料&#xff0c;通过实际调试&#xff0c;对调试结果进行总结。 回归分析法指利用数据统计原理&#xff0c;对大量统计数据进行数学处理&#xff0c;并…

回归(Regression )

回归&#xff08;Regression &#xff09; 模型定义 Regression 就是找到一个函数 functionfunction &#xff0c;通过输入特征 x&#xff0c;输出一个数值 Scalar。 模型应用 股市预测&#xff08;Stock market forecast&#xff09; 输入&#xff1a;过去10年股票的变动、…

数学建模:回归分析——regress 函数

matlab中regress 函数 https://jingyan.baidu.com/article/ca41422f6777aa1eae99ed87.htmlhttps://jingyan.baidu.com/article/ca41422f6777aa1eae99ed87.html 结果 附录 1、数据文本&#xff1a;data1_1 0 68 110 121 23 111 100 37 66 110 12 169 50 46 87 117 16 155 25…

[matlab]多元线性回归-regress函数的用法

转载博客原址&#xff1a;https://blog.csdn.net/YinJianxiang/article/details/81464245 回归分析 回归分析 (英语&#xff1a;Regression Analysis) 是一种统计学上分析数据的方法&#xff0c;目的在于了解两个或多个变量间是否相关、相关方向与强度&#xff0c;并建立数学…

机器学习——regression

1 用线性回归找到最佳拟合直线 线性回归 优点&#xff1a;结果易于理解&#xff0c;计算上不复杂 缺点&#xff1a;对非线性的数据拟合不好 使用数据类型&#xff1a;数值型数据和标称型数据。 回归方程&#xff1a;是根据样本资料通过回归分析所得到的反映一个变量&#xff0…

回归问题(Regression)

Regression 前言Dependent vs. Explanatory VariablesHandle Numerical Labelssquared error和variance什么区别 Linear RegressionLinear Regression in 1 Dimension Least Squares &#xff08;最小二乘&#xff0c;重点&#xff09;Least Squares ObjectiveMinimizing a Dif…

Fama-Macbeth回归图形化:EAP.fama_macbeth.Fama_macbeth_regress.plot()

实证资产定价&#xff08;Empirical asset pricing&#xff09;已经发布于Github和Pypi. 包的具体用法(Documentation)博主将会陆续在CSDN中详细介绍&#xff0c;也可以通过Pypi直接查看。 Pypi: pip install --upgrade EAP HomePage&#xff1a; EAP Empirical Asset Prici…