C# setPixel触发错误:InvalidOperationException:“具有索引像素格式的图像不支持setPixel。”

C# setPixel触发错误:InvalidOperationException:“具有索引像素格式的图像不支持setPixel。”,c#,encoding,bitmap,pixel,steganography,C#,Encoding,Bitmap,Pixel,Steganography,用于真正基本的隐写术工具 我试图将每个像素的蓝色值更改为消息中每个字符的ASCII值 Bitmap bmp = new Bitmap(routeBox.Text); for (int i = 0; i<bmp.Width; i++) { for (int j = 0; j<bmp.Height; j++) { Color pixelCol = bmp.GetPixel(i, j); if (i< 1 && j<

用于真正基本的隐写术工具

我试图将每个像素的蓝色值更改为消息中每个字符的ASCII值

Bitmap bmp = new Bitmap(routeBox.Text);
for (int i = 0; i<bmp.Width; i++)
{
    for (int j = 0; j<bmp.Height; j++)
    {
        Color pixelCol = bmp.GetPixel(i, j);
        if (i< 1 && j<textToEmbed.TextLength)
        {
            char letter = Convert.ToChar(textToEmbed.Text.Substring(j, 1));
            int value = Convert.ToInt32(letter);
            bmp.SetPixel(i, j, Color.FromArgb(pixelCol.R, pixelCol.G, value));
        }
    }
}

您遇到的错误意味着您无法在图像具有Format8BPPINDEX的PixelFormat时调用Bitmap.SetPixel

一种解决方案是使用转换为24位而不是8位的图像副本

这意味着不是这一行:

Bitmap bmp = new Bitmap(routeBoxText);
使用以下两行:

Bitmap bmpOrig = new Bitmap(routeBoxText);
Bitmap bmp = bmpOrig.Clone(new Rectangle(0, 0, bmpOrig.Width, bmpOrig.Height), System.Drawing.Imaging.PixelFormat.Format24bppRgb);

有关像素格式和每像素位数的更多信息,请参见。

routebox.Text中的内容?是否包含文件名?文件名是什么?routeBox.Text是指向包含3个图像的文件夹的路径;jpeg、png、bmp。那么您要将文件夹名传递给位图构造函数?听起来不对。不,对不起,我使用的是openFileDialog,我的意思是我在那个文件夹中测试了3种图像类型。。
Bitmap bmpOrig = new Bitmap(routeBoxText);
Bitmap bmp = bmpOrig.Clone(new Rectangle(0, 0, bmpOrig.Width, bmpOrig.Height), System.Drawing.Imaging.PixelFormat.Format24bppRgb);