C#将像素颜色转换为二进制

问题描述 投票:1回答:1

用于隐秘程序中。我正在尝试从bmp获取像素的R值的二进制等价物,即:如果R值为'255',我想要'11111111'。我将遍历一个字母的二进制值,并将每个像素颜色(R / G / B)中的最低有效位替换为该字母中的某个位,以便稍后进行检索。我有一个字符串工作:(Reverse是一种用于反转字符串的简单方法)

private string convToBits(string in_)
        {
            char letter = Convert.ToChar(in_);
            //convert letter to 32-bit int
            int value = Convert.ToInt32(letter);
            //converting 32-bit int to (string) bits
            BitArray ba = new BitArray(new int[] { value });
            string bits32 = "";
            for (int c = 0; c < ba.Length; c++)
            {
                if (c % 8 < 7) //get first 8 bits of the 32bit int
                {
                    //true = 1, false = 0
                    if (ba[c])
                    {
                        bits32 += 1;
                    }
                    else
                    {
                        bits32 += 0;
                    }
                }
            }
            //get only the first byte of the 32bit (4 bytes) int and reverse using the function below 
            string bitString = Reverse(bits32.Substring(0, 8));       //we now have the letter in binary. 
            return bitString;
        }

in_:'a'

返回:'01100001'

当然,这不适用于像素颜色,因为它的长度最多为3个字符(0-255)。

使用介于0-255之间的值来执行此操作的最佳方法是什么?

bitmap byte pixel bit steganography
1个回答
0
投票

当机密是字符串,图像或其他任何东西时,您无需采用其他方法。只需以字节数组的形式读取文件(或将字符串转换为一个),然后使用该文件即可。

如果您考虑一下,隐写术会将位隐藏到其他位中。这些位的来源无关紧要。这样,您可以完全隐藏文本文件,zip文件,图像文件等。

为什么要读取图像文件字节流的另一个原因是jpeg,png和其他压缩格式占用的空间更少。如果加载jpeg文件的像素数组,然后隐藏这些像素,那就像隐藏未压缩的bmp的大小一样。并且您会为此添加所有不必要的复杂性。

我会这样:

  • 询问封面媒体的文件名和隐藏的秘密(出于一致性的考虑,我要求用户将其写的文本写到文件中。]
  • 将机密文件读取为字节数组。
  • 可选:添加任何其他所需的元数据,例如,机密的大小,以便提取器知道要读取多少字节,机密文件的名称,以便一旦提取后就可以保存到该文件中,等等。
  • 嵌入...
  • 提取...

一条建议。不要将位转换为字符串。我怀疑您这样做只是为了可视化1和0,但这效率极低。最好直接使用bitwise operations。例如,要将某位嵌入像素,请使用AND将lsb归零,然后使用OR将其添加。

// embed
pixel = pixel & 0b11111110 | secretBit

// extract
secretBit = pixel & 0b00000001
© www.soinside.com 2019 - 2024. All rights reserved.