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图像中共享(在任意上传之前)。