评论图片"源代码"

时间:2015-07-02 11:27:46

标签: image comments

当您在文本编辑器中打开图像时,您会得到一些不太合理的字符(至少对我而言)。有没有办法为该文本添加注释,因此使用图像查看器打开文件时不会损坏文件。

所以,像这样: enter image description here

会变成这样: enter image description here

2 个答案:

答案 0 :(得分:1)

如果你的图像格式支持任何元素字段,那么设置元数据字段。

例如,对于PNG,您可以在导出文件时设置comment字段,也可以使用exiftool之类的单独工具设置:

exiftool -comment="One does not simply put text into the image data" test.png

如果文本的目的是确保所有权,那么请看一下数字水印。

答案 1 :(得分:1)

如果您希望对图片中的信息进行实际编码,则应使用隐写术(https://en.wikipedia.org/wiki/Steganography

wiki文章将向您介绍隐藏在树木图片中的猫的图片的基础知识和示例以及示例,作为隐藏信息的示例。在隐藏文本的情况下,您可以执行以下操作:

<强>编码

  • 提出你的阶段:为了论证,我将使用 Hidden 这个词
  • 将该文本转换为数字表示 - 为简单起见,我假设字符的ASCII转换,但您不必
      

    &#34;隐藏&#34; = 72 105 100 100 101 110

  • 将数字表示转换为二进制
      

    72 = 01001000/105 = 01101001/100 = 01100100/101 = 01100100/110 = 01101110

  • 对于每个字母,将8位二进制表示转换为四个2位二进制表示,我们称之为mA,mR,mG,mB,原因很快就会变得清晰

      

    72 = 01 00 10 00 =&gt; 1 0 2 0 = mA mR mG mB

  • 打开图像文件进行编辑:我建议使用C#加载图像,然后使用获取/设置像素进行编辑(How to manipulate images at the pixel level in C#

  • 对每个像素使用每个颜色通道最后2位对邮件进行编码。例如,要在图像的第一个像素中对H进行编码,您可以使用说明末尾的C#代码

  • 一旦所有单词的字母 - 每个像素一个字母 - 已经在图像中编码就完成了。

解码

反过来使用相同的基本过程。

  • 您一次一个像素地浏览图像
  • 您可以在像素
  • 中获取每个颜色通道的2个最低有效位
  • 您将LSB以alpha,red,green,blue顺序连接在一起。
  • 将连接的位转换为8位表示,然后将该二进制形式转换为基数10.最后,在ASCII图表中查找基数为10的数字,或者只是将数字转换为字符。< / LI>
  • 您重复下一个像素

要记住的是,我所描述的技术将允许您在没有人类观察者注意的情况下对图像中的信息进行编码,因为它仅操纵单个像素中每个颜色通道的最后2位的图像,以及人眼不能真正区分[(252,252,252,252)=&gt;范围内的颜色之间的区别。 (255255255255)。

但是作为思考的东西,我会提到计算机可以使用正确的算法,并且正在积极研究如何提高计算机能够选择这类东西的能力。

因此,如果您只想添加水印,那么这应该可行,但如果您想要实际隐藏某些内容,则必须加密该消息,然后执行 关于加密二进制文件的隐写术。由于加密数据比纯文本数据大得多,因此需要具有更多像素的图像。

以下是使用C#将H编码到图像的第一个像素中的代码。

//H=72 and needs the following message Alpha, message Red, message Green, message Blue components
mA = 1;
mR = 0;
mG = 2;
mB = 0;
Bitmap myBitmap = new Bitmap("YourImage.bmp");
//pixel 0,0 is the first pixel
Color pixelColor = myBitmap.GetPixel(0, 0);
//the 252 places 1's in the 6 bits that we aren't manipulating so that ANDing with the message bits works
pixelColor = Color.FromArgb(c.A & (252 + mA), c.R & (252 + mR), c.G & (252 + mG), c.B & (252 + mB));
myBitmap.SetPixel(0, 0, pixelColor);