C# 将图像转换为字节矩阵
我正在尝试对ImagePNGT进行二进制化,以获得以下结果 为此,我使用了下面的代码,但现在我还没有得到预期的结果C# 将图像转换为字节矩阵,c#,image,binary-data,C#,Image,Binary Data,我正在尝试对ImagePNGT进行二进制化,以获得以下结果 为此,我使用了下面的代码,但现在我还没有得到预期的结果 这给了我以下结果要比较两种颜色,请使用ToArgb方法,最好使用StringBuilder,而不是每次连接。 这对我很有用: var img = new Bitmap(pictureBox1.Image); var sb = new StringBuilder(); for (int i = 0; i < img.Height; i++) { for (int j
这给了我以下结果要比较两种颜色,请使用ToArgb方法,最好使用StringBuilder,而不是每次连接。 这对我很有用:
var img = new Bitmap(pictureBox1.Image);
var sb = new StringBuilder();
for (int i = 0; i < img.Height; i++)
{
for (int j = 0; j < img.Width; j++)
{
if (img.GetPixel(j, i).ToArgb() == Color.White.ToArgb())
{
sb.Append("0");
}
else
{
sb.Append("1");
}
}
}
richTextBox1.Text = sb.ToString();
这会产生很多0和一些1,我的图片很大,所以结果很难看,但在你的情况下,它应该可以工作。你可以这样做,它使用扫描线和锁位,速度相当快
public unsafe static int[,] GetBits(string path )
{
using (var orig = new Bitmap(path))
{
var bounds = new Rectangle(0, 0, orig.Width, orig.Height);
// lock the array for direct access
var bitmapData = orig.LockBits(bounds, ImageLockMode.ReadWrite, PixelFormat.Format32bppPArgb);
try
{
// get the pointer
var scan0Ptr = (int*)bitmapData.Scan0;
// get the stride
var stride = bitmapData.Stride / 4;
// keep the black around
var black = Color.Black.ToArgb();
//Output
var array = new int[orig.Width, orig.Height];
// scan all x first then y
for (var y = 0; y < bounds.Bottom; y++)
for (var x = 0; x < bounds.Right; x++)
array[x, y] = *(scan0Ptr + x + y * stride) == black ? 0 : 1;
return array;
}
finally
{
// unlock the bitmap
orig.UnlockBits(bitmapData);
}
}
}
原始图像32x32
不要链接图片,不要以图片的形式发布代码。看起来你的零行比你想要的要长得多。我想如果你在右边的文本框中添加滚动条,你可以向下滚动看到文本的1s部分。您可能只需要将水平和垂直文本条添加到文本区域。
var array = GetBits(@"d:\icon.png");
var w = array.GetLength(0);
var h = array.GetLength(1);
for (int i = 0; i < w; i++)
{
for (int j = 0; j < h; j++)
Console.Write(array[i,j]);
Console.WriteLine();
}
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00011111111111111111111111111000
00011111111111111111111111111000
00011000000000000000000000011000
00011000000000000000000000011000
00011000000000000000000000011000
00011000000000000000000000011000
00011000000000000000000000011000
00011000000000000000000000011000
00011000000000000000000000011000
00011000000000000000000000011000
00011000000000000000000000011000
00011000000000000000000000011000
00011000000000011111111111111000
00011000000000011111111111111000
00011000000000011000000000011000
00011000000000011000000000011000
00011000000000011000000000011000
00011000000000011000000000011000
00011000000000011000000000011000
00011000000000011000000000011000
00011000000000011000000000011000
00011000000000011000000000011000
00011000000000011000000000011000
00011000000000011000000000011000
00011111111111111111111111111000
00011111111111111111111111111000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000