我正在尝试编写一个旨在将.bmp文件转换为二进制文件的C#程序。 该文件是16x16像素。每个黑色像素代表二进制的一个,因此数字10将是█[]█[] [] [] [] []
我遇到的问题是我的代码无法识别黑色像素,因此输出始终为零。
public Bitmap imgToDecode;
private void button2_Click(object sender, EventArgs e)
{
int i = (imgToDecode.Height * imgToDecode.Width);
bool[] pixData = new bool[i];
int p = 0;
for (int k = 1; k < imgToDecode.Height; k++)
{
for (int m = 1; m < imgToDecode.Width; m++)
{
if (imgToDecode.GetPixel(m, k) == Color.Black)
{
pixData[p] = true;
}
else
{
pixData[p] = false;
}
p++;
}
}
for (int n = 0; n < pixData.Length; n++)
{
textBox2.Text = (textBox2.Text + (Convert.ToInt32(pixData[n])));
}
}
如果有人知道为什么输出为0,他们可以帮助我。此外,任何改进代码的方法都会受到欢迎。
答案 0 :(得分:3)
问题的根源可能是 Color.Black 不等于 Color.FromArgb(0 ,0,0) 。
解决方案可能是改变这条线:
if (imgToDecode.GetPixel(m, k) == Color.Black)
为:
if (imgToDecode.GetPixel(m, k) == Color.FromArgb(0, 0, 0))
甚至更好,声明一个包含(0,0,0)颜色的变量,然后在 if 语句中使用它。 所以做一些像:
Color black = Color.FromArgb(0, 0, 0);
在您方法的开头,然后将 ,如果 更改为:
if (imgToDecode.GetPixel(m, k) == black)
<强>更新强> 循环起始值似乎存在一些小问题。我已经更新了你的代码。
public Bitmap imgToDecode;
private void button2_Click(object sender, EventArgs e)
{
textBox2.Text = "";
Color black = Color.FromArgb(0, 0, 0);
int i = (imgToDecode.Height * imgToDecode.Width);
bool[] pixData = new bool[i];
int p = 0;
for (int k = 0; k < imgToDecode.Height; k++)
{
for (int m = 0; m < imgToDecode.Width; m++)
{
pixData[p] = (imgToDecode.GetPixel(m, k) == black);
p++;
}
}
for (int n = 0; n < pixData.Length; n++)
{
textBox2.Text = (textBox2.Text + (Convert.ToInt32(pixData[n])));
}
}
如果您不需要 pixData 数组来包含 bool 值,您可以将其更改为int并指定1或0。以后你不必转换它的方式:)。
答案 1 :(得分:1)
您可以使用此实用程序将位图转换为二进制文本。只需检查每个像素通道是否等于0
,然后返回1
(如果是黑色)或0
(如果是白色):
public static IEnumerable<int> ToBinary(this Bitmap imgToDecode)
{
for (int k = 0; k < imgToDecode.Height; k++)
{
for (int m = 0; m < imgToDecode.Width; m++)
{
yield return (imgToDecode.GetPixel(m, k).R == 0 &&
imgToDecode.GetPixel(m, k).G == 0 &&
imgToDecode.GetPixel(m, k).B == 0) ? 1 : 0;
}
}
}
答案 2 :(得分:0)
进行以下更改:
for (int m = 1; m < imgToDecode.Width; m++)
{
Color col = imgToDecode.GetPixel(m, k);
if (col == Color.Black) //<---- Put a breakpoint here and see what col is.
{
pixData[p] = true;
}
...
当你打破'col'时,看看它是什么。是255,255,255吗?有什么关闭?
这至少可以让你看到“黑色”像素与“白色”像素是什么,你可以正确地开启它。
编辑:Hans正确地指出你需要在这些循环上从'0'而不是'1'开始。