setPixel triggering error: InvalidOperationException: 'SetPixel is not supported for images with indexed pixel formats.'
setPixel triggering error: InvalidOperationException: 'SetPixel is not supported for images with indexed pixel formats.'
用于真正基本的隐写术工具。
我正在尝试将每个像素的蓝色值更改为消息中每个字符的 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));
}
}
}
这适用于 jpeg,但蓝色值返回为从 56 左右开始的递减数字,所以我现在尝试使用 .bmp 来实现。
此行触发错误:
bmp.SetPixel(i, j, Color.FromArgb(pixelCol.R, pixelCol.G, value));
要在保存后从像素中检索回消息,我正在做:
Bitmap bmp = new Bitmap(routeBox.Text);
string message = "";
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< 25)
{
int value = pixelCol.B;
char c = Convert.ToChar(value);
string letter = System.Text.Encoding.ASCII.GetString(
new byte[] { Convert.ToByte(c) });
message = message + letter;
}
}
}
您遇到的错误意味着当图像的 PixelFormat 为 Format8bppIndexed 时您无法调用 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);
有关像素格式和每像素位数的更多信息,see this page。
用于真正基本的隐写术工具。
我正在尝试将每个像素的蓝色值更改为消息中每个字符的 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));
}
}
}
这适用于 jpeg,但蓝色值返回为从 56 左右开始的递减数字,所以我现在尝试使用 .bmp 来实现。
此行触发错误:
bmp.SetPixel(i, j, Color.FromArgb(pixelCol.R, pixelCol.G, value));
要在保存后从像素中检索回消息,我正在做:
Bitmap bmp = new Bitmap(routeBox.Text);
string message = "";
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< 25)
{
int value = pixelCol.B;
char c = Convert.ToChar(value);
string letter = System.Text.Encoding.ASCII.GetString(
new byte[] { Convert.ToByte(c) });
message = message + letter;
}
}
}
您遇到的错误意味着当图像的 PixelFormat 为 Format8bppIndexed 时您无法调用 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);
有关像素格式和每像素位数的更多信息,see this page。