C# 隐写提取问题#
我可以将文字隐藏在图像中。但是,当我试图从图像中提取文本时,我总是只能获得第一个字符。我不知道哪里出了问题 我的嵌入操作代码:C# 隐写提取问题#,c#,steganography,C#,Steganography,我可以将文字隐藏在图像中。但是,当我试图从图像中提取文本时,我总是只能获得第一个字符。我不知道哪里出了问题 我的嵌入操作代码: public static Bitmap embedMessage(string hiddenText, Bitmap oriImage) { Color currentPixel; int[] colorRGB = new int[3]; List<int> messa
public static Bitmap embedMessage(string hiddenText, Bitmap oriImage)
{
Color currentPixel;
int[] colorRGB = new int[3];
List<int> messageValue = new List<int>();
messageValue = ConvertMessage(messageValue, hiddenText);
int messageIndex = messageValue.Count;
int binaryCount = 0;
int zeroAdded = 0;
for(int row = 0; row < oriImage.Height; row++)
{
for(int col = 0; col < oriImage.Width; col++)
{
currentPixel = oriImage.GetPixel(col, row);
colorRGB[0] = ConvertEven(currentPixel.R);
colorRGB[1] = ConvertEven(currentPixel.G);
colorRGB[2] = ConvertEven(currentPixel.B);
for(int rgbIndex = 0; rgbIndex < colorRGB.Length; rgbIndex++)
{
if(messageIndex > 0)
{
colorRGB[rgbIndex] += messageValue[messageValue.Count - messageIndex] % 2;
messageValue[messageValue.Count - messageIndex] /= 2;
}
}
if (messageIndex == 0 && zeroAdded < 8)
{
oriImage.SetPixel(col, row, Color.FromArgb(colorRGB[0], colorRGB[1], colorRGB[2]));
zeroAdded++;
Console.WriteLine("Adding zero number: " + zeroAdded);
}
else
{
Console.WriteLine("Set Pixel");
oriImage.SetPixel(col, row, Color.FromArgb(colorRGB[0], colorRGB[1], colorRGB[2]));
}
if (zeroAdded == 8)
{
Console.WriteLine("Final Pixel Add");
oriImage.SetPixel(col, row, Color.FromArgb(colorRGB[0], colorRGB[1], colorRGB[2]));
return oriImage;
}
binaryCount++;
if (binaryCount % 8 == 0) { messageIndex--; Console.WriteLine("Message Index deducted"); }
}
}
return oriImage;
}
公共静态位图嵌入消息(字符串hiddenText、位图或图像)
{
彩色像素;
int[]colorRGB=新int[3];
List messageValue=new List();
messageValue=ConvertMessage(messageValue,hiddenText);
int messageIndex=messageValue.Count;
int binaryCount=0;
int=0;
对于(int row=0;row0)
{
colorRGB[rgbIndex]+=messageValue[messageValue.Count-messageIndex]%2;
messageValue[messageValue.Count-messageIndex]/=2;
}
}
如果(messageIndex==0&&zeroAdded<8)
{
oriImage.SetPixel(col、row、Color.FromArgb(colorRGB[0],colorRGB[1],colorRGB[2]);
零加++;
Console.WriteLine(“添加零编号:+zeroAdded”);
}
其他的
{
控制台写入线(“设置像素”);
oriImage.SetPixel(col、row、Color.FromArgb(colorRGB[0],colorRGB[1],colorRGB[2]);
}
如果(加零==8)
{
控制台写入线(“最终像素添加”);
oriImage.SetPixel(col、row、Color.FromArgb(colorRGB[0],colorRGB[1],colorRGB[2]);
返回原始图像;
}
二进制计数++;
如果(binaryCount%8==0){messageIndex--;Console.WriteLine(“扣除的消息索引”);}
}
}
返回原始图像;
}
我的嵌入实现与提取相同,我使用了示例中的精确提取代码。不管我怎么做,我仍然只得到嵌入文本的第一个字符。我试着通过打印每个操作来检查我的代码,所有操作都没有任何问题,这意味着嵌入操作应该按预期工作。刚刚发现了我的问题。我的嵌入方法中的所有内容都应该在R G B for循环中。使用调试器并在运行时检查每个变量是否在任何时候都具有预期值。@zerkms感谢您的调试建议!刚试过打印RGB变量,我的版本肯定没有达到我预期的效果。我的嵌入部分肯定出了问题。目前,我可以看到您使用的是
.SetPixel
方法,该方法速度较慢:();不久前,我实际上编写了一个类似的程序,将压缩文件存储在图像中,以便在GitHub图像中共享(在任意上传之前)。