您的位置 首页 java

用Java实现在图片中隐藏文字-保护自己的版权/隐私

在生活中,我们可能会遇到这种需求,就是想要在图片中隐藏一些文字,这样就能保护一些重要的内容,起到一个变相“加密”的作用。还有一种场景,就是在图片中隐藏文字,加上自己的水印,防止图片被盗版传播等。据说,阿里巴巴内网的论坛,就通过“图片水印”的技术,加上了当前登录用户的UID,追踪传播到外网的“罪魁祸首”。

今天,我讲的就是一种类似图片隐写的技术,把文字写到图片中,来存储信息。网上能搜到这样的工具,但大多是在线或者exe软件,无法定制。作为一个geek,当然是想自己实现一套了,把一切掌握在自己手中。

大家都知道,图片都属于 二进制 格式,而且每一种图片都使用了特定的 编码 ,如果我们破坏了图片的二进制内容,可能就导致图片无法正常显示了。怎么做呢,这就涉及到一个很简单的常识了- rgb

什么是RGB

RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个 颜色通道 的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。

在电脑中,RGB的所谓“多少”就是指亮度,并使用整数来表示。通常情况下,RGB各有256级亮度,用数字表示为从0、1、2…直到255。注意虽然数字最高是255,但0也是数值之一,因此共256级。按照计算,256级的RGB色彩总共能组合出约1678万种色彩,即256×256×256=16777216。通常也被简称为1600万色或千万色。也称为24位色(2的24次方)。

图片里的每一个像素点都是一个RGB颜色,比如紫色就是红色和蓝色的组合,那么它的RGB值就是(255,0,255),也就是不需要绿色,纯红和纯蓝即可组成紫色。

隐写原理

理解了RGB,剩下的就简单了。我们知道,每个像素是RGB三个值组成的,如果我把偶数看作0,奇数看作1,那么一个像素点就能表示3个bit的信息,比如紫色的RGB值是(255,0,255),那么它对应的二进制值就是101,一张100×100大小的图片,就有3×100×100个bit位,能表示3750个字节,一个UTF8中文是3个字节,也就是能存储1200多个汉字。当然,如果选用GBK编码,就能存储更多的汉字。

核心代码就很简单了,逐个修改每个像素的RGB值,比如我要隐藏A这个字母,它的ASCII码是65,对应二进制是0100 0001。如果图片的地一个像素点RGB值是(23,55,198),那么就把它改成(22,55,198),也就是偶数-奇数-偶数,对应010,后面的像素操作类似

 for (int j1 = bufferedImage.getMinY(); j1 < height; j1++) {
 for (int j2 = bufferedImage.getMinX(); j2 < width; j2++) {
 count = (j1 * width + j2) * 3;
 int rgb = bufferedImage.getRGB(j2, j1);
 int value = 0xff000000 | rgb;
 int red = (value >> 16) & 0xFF;
 int green = (value >> 8) & 0xFF;
 int blue = (value >> 0) & 0xFF;
 int alpha = (value >> 24) & 0xff;
 int newColor = rgb;
 if (count < binStr.length() - 2) {
 int offset = count;
 if (binStr.charAt(offset) == '1') {
 if (red % 2 == 0) {
 red += 1;//如果二进制是1,偶数变奇数,保证1对奇0 对偶 
 }
 } else {//如果二进制是0,奇数变偶数
 if (red % 2 == 1) {
 red -= 1;
 }
 }
 //其他代码略
 }
 

要还原隐藏的文字,也就是一个逆运算的过程。

有一个问题,需要注意的是,在还原的时候,不能把本不该还原的部分还原了。比如说文字只占用了2000个像素,就不该把2000像素以后的RGB信息提取出来,这就要求我们在图片中还需要记录文字的长度,方便还原。

记录文字长度的代码和上面的代码类似,这里就不重复了。

使用

各位看官可以根据思路自己实现,或者直接看我的实现,我把完整实现代码放github了:。

运行

 Java  -jar hideImage-1.0-SNAPSHOT.jar 
 

,根据提示一步步操作即可。

hideImage使用

隐藏前的图片

隐藏文字后的图片

由于我们仅对RGB值做了非常微小的调整,所以肉眼是看不出区别的。

附:编译安装方式

1.确保安装了Java和Maven环境

2.执行以下命令

git clone

mvn package

编译后的jar文件就在target目录下。

文章来源:智云一二三科技

文章标题:用Java实现在图片中隐藏文字-保护自己的版权/隐私

文章地址:https://www.zhihuclub.com/180094.shtml

关于作者: 智云科技

热门文章

网站地图