将.bmp文件解码为二进制
我正在尝试编写一个旨在将.bmp文件转换为二进制文件的C#程序。 该文件是16x16像素。每个黑色像素代表一个二进制的数字,因此数字10会是█[]█[] [] [] [] [] []将.bmp文件解码为二进制
我遇到的问题是我的代码不能识别黑色像素,所以输出始终为零。
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,他们可以请帮助我。也欢迎任何改进代码的方法。
问题的来源是可能是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)颜色,然后使用它在这如果声明。 所以这样做:
Color black = Color.FromArgb(0, 0, 0);
在你的方法开始,然后改变如果到:
if (imgToDecode.GetPixel(m, k) == black)
UPDATE: 似乎有与循环的一些小问题开始值。我更新了你的代码。
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阵列包含布尔值,则可以将其更改为int和ASIGN 1或0。这样,您就不必把它转换后: )。
谢谢,这工作完美。 :d – Krikler7
进行这些更改:
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;
}
...
当您在 '山坳' 打破,看看它是什么。是255,255,255吗?什么东西接近?
这至少让你看到'黑'像素与'白'像素是什么,你可以正确地打开它。
编辑:汉斯指出正确,你需要在'0'而不是'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;
}
}
}
你检查什么.GetPixel()将返回?也许你的源图像中的黑色实际上是非黑色的,所以像素可能是255,255,254,而color.black是255,255,255。 –
为什么在地球上你想要一个'bool'数组中的数据? (只是好奇) – Cameron
至少有一个错误是你开始循环在1而不是0. –