我试图使用LSB算法将一串文本隐藏到位图中,LSB算法替换每个像素的RGB值的最低有效位。到目前为止,我已经浏览了图像的像素并清除了每个像素的LSB值。我正在努力的部分是插入来自字符串的新LSB值。
这就是我到目前为止所做的事情,任何有关下一步的指示都会有所帮助
string text = txtEncrypt.Text;
//Gets the ascii value of each character from the string
var n = ASCIIEncoding.ASCII.GetBytes(text);
Bitmap myBitmap = new Bitmap(myPictureBox.Image);
byte[] rgbBytes = new byte[0];
int R=0, G=0, B=0;
for (int i = 0; i < myBitmap.Width; i++)
{
for (int j = 0; j < myBitmap.Height; j++)
{
Color pixel = myBitmap.GetPixel(i, j);
// now, clear the least significant bit (LSB) from each pixel element
//Therefore Three bits in each pixel spare
R = pixel.R - pixel.R % 2;
G = pixel.G - pixel.G % 2;
B = pixel.B - pixel.B % 2;
// Need to insert new values
}
}
答案 0 :(得分:1)
虽然你可以使用&#34;常规&#34;进行位操作。算术(他们在一年级教授的那种)更常见的是使用位操作算子来实现相同的目标。
例如,撰写R = pixel.R & ~1
比减去pixel.R % 2
更为常见。
在设置之前,您不需要清除该位。强行进入1
使用R = pixel.R | 1
。要强制它为零,请使用上面提到的R = pixel.R & ~1
。
要迭代&#34;消息stored as a sequence of
N`字节的位,请使用此检查:
if (message[pos / 8] & (1 << pos % 8) != 0) {
// bit at position pos is 1
} else {
// bit at position pos is 0
}
答案 1 :(得分:0)
按位运算符使这很容易:
将最后一位设置为1:
var newR = pixel.R | 0b00000001
将最后一位设为0
var newR = pixel.R & 0b11111110
这是如何工作的:|像每个字节的or
运算符一样合并位。和&amp;像and
运算符那样合并位(psuedocode):
10101000 | 0000001 = 10101001
10101001 & 1111110 = 10101000