C#遍历bmp图片各像素点时使用的GetPixel和内存方法计算结果有差异
遍历一张40X40的bmp图片的像素点,使用GetPixel遍历出的像素点数组长度是1600个,而使用内存方法数组长度却变成2809个,本人菜鸟一只,内存方法是参考别人的。希望大神答疑。GetPixel效率太低。
这是GetPixel方法
public List getcolor(string codes)
{
Jiami jm = new Jiami();
List listbyt = new List();
string code = jm.Encrypt(codes, "88888888");
string txt = "http://www" + code;
for (int i = 0; i < 40; i++)
{
for (int j = 0; j < 40; j++)
{
Color color = new Bitmap(GenByZXingNet(txt)).GetPixel(i, j);
if (color.R == 255)
{
listbyt.Add(0);
}
else
{
if (color.R == 0)
{
listbyt.Add(1);
}
else
{
if (0 < color.R && color.R < 255)
{
listbyt.Add(0);
}
}
}
}
}
int1 = 1;
return listbyt;
}
如下使用的内存法:
public List getcolor(string codes)
{
int d = 0;
string c = string.Empty;
List listbyt = new List();
Jiami jm = new Jiami();
string code = jm.Encrypt(codes, "88888888");
string txt = "http://www" + code;
Bitmap b = new Bitmap(ConvertTo1Bpp2(GenByZXingNet(txt)));
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int stride = bmData.Stride;
System.IntPtr Scan0 = bmData.Scan0;
unsafe
{
byte* ptr = (byte*)(bmData.Scan0);
for (int i = 0; i < bmData.Height; i++)
{
for (int j = 0; j < bmData.Width; j++)
{
byte blue = ptr[0];
if (blue == 0)
{
listbyt.Add(1);
}
else
{
listbyt.Add(0);
}
ptr += 3;
}
ptr += bmData.Stride - bmData.Width * 3;
}
}
b.UnlockBits(bmData);
int1 = 1;
return listbyt;
}
感谢AinUser,问题自己找到了,由于是扫描的是二维码图片,当内容二维码内的内容增多时,图片内部的像素点会自动增多。而用GetPiex,我写得循环只有1600次,那么结果
就会只有1600个,所以不是语句的原因,是图片的原因。
可以去知乎还有github上面搜索一下