我这有个方法要将图像转成指定格式的数组,只取黑白,目前转是可以转,但是效率非常慢,很吃CPU,想请大拿帮我看看,有没有什么可以高效转换的方法,12K的图片,转换要300毫秒,想控制在50毫秒内。
public byte[] GetGrayByte(Bitmap srcBmp)
{
DateTime dt = DateTime.Now;
int iHeight = srcBmp.Height;
int iWidth = srcBmp.Width;
int num = srcBmp.Height / 8;
if (srcBmp.Height % 8 > 0)
{
num++;
}
string text2 = "";
Rectangle rect = new Rectangle(0, 0, srcBmp.Width, srcBmp.Height);
BitmapData srcBmpData = srcBmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
byte[] grayValues = new byte[(rect.Width * rect.Height) / 8]; //定义转化为灰度后需要存储的数组
int stride = srcBmpData.Stride; // 扫描线的宽度,比实际图片要大
int offset = stride - iWidth * 3; // 显示宽度与扫描线宽度的间隙
IntPtr ptr = srcBmpData.Scan0; // 获取bmpData的内存起始位置的指针
int scanBytesLength = stride * iHeight; // 用stride宽度,表示这是内存区域的大小
byte[] rgbValues = new byte[scanBytesLength]; // 为目标数组分配内存
Marshal.Copy(ptr, rgbValues, 0, scanBytesLength); // 将图像数据拷贝到rgbValues中
byte blue, green, red, YUI;
int iLenght = 0;
for (int i = 0; i < iWidth; i++)
{
for (int j = 0; j < num; j++)
{
text2 = "";
for (int k = 0; k < 8; k++)
{
int num2 = k + j * 8;
if (num2 >= iHeight)
{
text2 += "1";
continue;
}
int iPosition = num2 * stride + i * 3;
//blue = rgbValues[iPosition];
//green = rgbValues[iPosition + 1];
red = rgbValues[iPosition + 2];
text2 = red == 0 ? (text2 + "0") : (text2 + "1");
//YUI = (byte)(0.229 * red + 0.587 * green + 0.144 * blue);
//text2 = YUI > 127 ? (text2 + "1") : (text2 + "0");
}
grayValues[iLenght] = Convert.ToByte(text2, 2);
iLenght++;
}
}
//解锁位图
srcBmp.UnlockBits(srcBmpData); //读取完元信息,这里就不用了,一定要记得解锁,否则会报错
srcBmp.Dispose();
dTemplateCodingTime = (DateTime.Now - dt).TotalMilliseconds;
return grayValues;
}