评论图片的 "source code"
Comment image's "source code"
当您在文本编辑器中打开图像时,您会看到一些实际上没有意义的字符(至少对我而言)。有没有办法给那个文本添加注释,这样文件在用图像查看器打开时就不会出现损坏。
所以,像这样:
会变成这样:
方法是设置元数据字段(如果您的图像格式支持)。
例如,对于 PNG,您可以在导出文件时设置 comment
字段,或者使用单独的工具,例如 exiftool:
exiftool -comment="One does not simply put text into the image data" test.png
如果文本的目的是确保所有权,那么看看数字水印。
如果您希望对图像中的信息进行实际编码,您应该使用隐写术 (https://en.wikipedia.org/wiki/Steganography)
这篇 wiki 文章向您介绍了基础知识,并展示了隐藏在树木图片中的猫图片示例,作为如何隐藏信息的示例。在隐藏文本的情况下,您可以执行以下操作:
编码
- 提出你的阶段:为了论证,我将使用 Hidden
这个词
- 将该文本转换为数字表示形式 - 为简单起见,我将假定字符的 ASCII 转换,但您不必
"Hidden" = 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 => 1 0 2 0 = mA mR mG mB
打开图像文件进行编辑:我建议使用 C# 加载图像,然后使用 Get/Set 像素进行编辑 (How to manipulate images at the pixel level in C# )
使用每个像素的每个 颜色通道 的最后 2 位 来编码您的信息。例如,要在图像的第一个像素中编码 H,您可以在指令末尾使用 C# 代码
一旦单词的所有字母(每个像素一个)都已编码到图像中,您就完成了。
解码
反向使用相同的基本过程。
- 您一次浏览图像一个像素
- 您取像素中每个颜色通道的 2 个最低有效位
- 您将 LSB 按 alpha、红色、绿色、蓝色顺序连接在一起。
- 您将连接的位转换为 8 位表示形式,然后将该二进制形式转换为以 10 为基数。最后,您在 ASCII 图表中查找以 10 为基数的数字,或者将数字转换为 char .
- 你重复下一个像素
要记住的是,我描述的技术将允许您在人类观察者不注意的情况下对图像中的信息进行编码,因为它仅在单个像素中处理每个颜色通道的最后 2 位的图像,并且人眼无法真正区分 [(252,252,252,252) => (255,255,255,255)] 范围内的颜色。
但值得深思的是,我会提到计算机可以使用正确的算法,并且正在积极研究如何提高计算机的能力,以便能够挑选出这类东西。
因此,如果您只想放入水印,那么这应该可行,但如果您真的想隐藏某些内容,则必须加密消息,然后执行
加密二进制文件的隐写术。由于加密数据比纯文本数据大得多,因此需要具有更多像素的图像。
这是在 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);
当您在文本编辑器中打开图像时,您会看到一些实际上没有意义的字符(至少对我而言)。有没有办法给那个文本添加注释,这样文件在用图像查看器打开时就不会出现损坏。
所以,像这样:
会变成这样:
方法是设置元数据字段(如果您的图像格式支持)。
例如,对于 PNG,您可以在导出文件时设置 comment
字段,或者使用单独的工具,例如 exiftool:
exiftool -comment="One does not simply put text into the image data" test.png
如果文本的目的是确保所有权,那么看看数字水印。
如果您希望对图像中的信息进行实际编码,您应该使用隐写术 (https://en.wikipedia.org/wiki/Steganography)
这篇 wiki 文章向您介绍了基础知识,并展示了隐藏在树木图片中的猫图片示例,作为如何隐藏信息的示例。在隐藏文本的情况下,您可以执行以下操作:
编码
- 提出你的阶段:为了论证,我将使用 Hidden 这个词
- 将该文本转换为数字表示形式 - 为简单起见,我将假定字符的 ASCII 转换,但您不必
"Hidden" = 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 => 1 0 2 0 = mA mR mG mB
打开图像文件进行编辑:我建议使用 C# 加载图像,然后使用 Get/Set 像素进行编辑 (How to manipulate images at the pixel level in C# )
使用每个像素的每个 颜色通道 的最后 2 位 来编码您的信息。例如,要在图像的第一个像素中编码 H,您可以在指令末尾使用 C# 代码
一旦单词的所有字母(每个像素一个)都已编码到图像中,您就完成了。
解码
反向使用相同的基本过程。
- 您一次浏览图像一个像素
- 您取像素中每个颜色通道的 2 个最低有效位
- 您将 LSB 按 alpha、红色、绿色、蓝色顺序连接在一起。
- 您将连接的位转换为 8 位表示形式,然后将该二进制形式转换为以 10 为基数。最后,您在 ASCII 图表中查找以 10 为基数的数字,或者将数字转换为 char .
- 你重复下一个像素
要记住的是,我描述的技术将允许您在人类观察者不注意的情况下对图像中的信息进行编码,因为它仅在单个像素中处理每个颜色通道的最后 2 位的图像,并且人眼无法真正区分 [(252,252,252,252) => (255,255,255,255)] 范围内的颜色。
但值得深思的是,我会提到计算机可以使用正确的算法,并且正在积极研究如何提高计算机的能力,以便能够挑选出这类东西。
因此,如果您只想放入水印,那么这应该可行,但如果您真的想隐藏某些内容,则必须加密消息,然后执行 加密二进制文件的隐写术。由于加密数据比纯文本数据大得多,因此需要具有更多像素的图像。
这是在 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);