隐写术
2012年 大众点评和食神摇摇是美食类点评的两家相互竞争的公司。
当时两家的同质化竞争达到了非常严峻的地步,食神摇摇开始大规模爬取大众点评的数据(主要是图片)。
具体的新闻可以看这里: 食神vs大众。
当时大众点评并没有选择走中国的司法流程。(因为实在是太慢了,因为实在是太不专业了,因为实在很难有个实质性的结果。具体可参考快播的庭审)。
而是选择了向苹果公司提交相关抄袭证据,要求苹果公司下架食神的app。 其中至关重要的证据,就是隐写术,大众点评通过隐写术内嵌了公司的版权信息。 进而食神团队在爬虫爬取过程中没有发现,因此食神的app中的图片也大量的含有了大众点评的版权信息。进而被苹果公司下架2次。
隐写术,英文名:“Steganography”,相关科普知识可查阅wiki。
在这里我介绍1种最简单的隐写术:基于rgb分量的最低位的隐写术。
下面有一张lenna的图片:
提取该图片的绿色分量
取绿色分量的最低位,如果是1就设置图片为绿,是0设为黑。
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图片即是答案。