【千里码】隐写术-1

隐写术

2012年 大众点评和食神摇摇是美食类点评的两家相互竞争的公司。

当时两家的同质化竞争达到了非常严峻的地步,食神摇摇开始大规模爬取大众点评的数据(主要是图片)。

具体的新闻可以看这里: 食神vs大众。

当时大众点评并没有选择走中国的司法流程。(因为实在是太慢了,因为实在是太不专业了,因为实在很难有个实质性的结果。具体可参考快播的庭审)。

而是选择了向苹果公司提交相关抄袭证据,要求苹果公司下架食神的app。 其中至关重要的证据,就是隐写术,大众点评通过隐写术内嵌了公司的版权信息。 进而食神团队在爬虫爬取过程中没有发现,因此食神的app中的图片也大量的含有了大众点评的版权信息。进而被苹果公司下架2次。

隐写术,英文名:“Steganography”,相关科普知识可查阅wiki。

在这里我介绍1种最简单的隐写术:基于rgb分量的最低位的隐写术。

下面有一张lenna的图片:

【千里码】隐写术-1_第1张图片

提取该图片的绿色分量

【千里码】隐写术-1_第2张图片

取绿色分量的最低位,如果是1就设置图片为绿,是0设为黑。

【千里码】隐写术-1_第3张图片

ok,你将看到隐藏的信息:"Steganography"。 大众点评正是利用了这些信息向苹果公司证明了图片的来源,最终保护了公司的利益。

这题的答案在该lenna图片的红色分量上。


题意很清楚,主要学习了java的图片读取和getRgb()函数的用法。

getRgb()的API 
返回值:int类型
返回: 默认 RGB 颜色模型和默认 sRGB 颜色空间中的整数像素。
int占4个字节,其中R、G、B各占一个字节,还有一个字节是alpha透明度

如:

 int color=im.getRGB(0, 0);//取出0 0坐标的rgb..
 int r=(color>>16)&255;//获取red分量
 int g=(color>>8)&255;//获取green分量
 int b=color&255;//获取blue分量

<pre name="code" class="java">import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class test2{

    public static void main(String[] args) throws IOException {
        BufferedImage im= ImageIO.read(new File("F:\\demo\\145303100168558.png"));//读取图片
        int width = im.getWidth();
        int height = im.getHeight();
        for(int i = 0; i < width; i++){
            for(int j = 0; j< height; j++){
                int color=im.getRGB(i, j);
                int r=(color>>16)&255;//获取red分量
                im.setRGB(i,j,0);
                if(r%2 == 1){
                    im.setRGB(i, j, 255);
                }
            }
        }
        File outputfile = new File("F:\\demo\\ans.png");
        ImageIO.write(im, "png",outputfile);
    }
}


 
 


运行后得到的ans.png图片即是答案。


你可能感兴趣的:(【千里码】隐写术-1)