因为我现在设计中的软件功能需要对图象进行高速处理,用VB..NET设计了几个处理原型,虽然做了很多优化,但感觉速度上还是难以接受,在网上查阅相关资料后,将VB.NET中的数组处理改为采用C#的指针处理,去掉部分浮点运算,发现速度有明显提高,以前在VB.NET环境下慢得像牛一样的卷积运算,在C#指针的帮助下速度也马马虎虎过得去(水平问题~为什么其它专业软件就处理得这么快~~~:(,还在研究中...),本人以前一直都是用VB.NET开发,虽然VB.NET的优势不少,不是1天2天就可以说清楚的,但是因为VB.NET并不支持指针,使VB.NET丧失了很多高性能处理能力,实在令人扼腕痛惜。
好了,废话少说,现在贴几个简单的代码断给那些还在用数组甚至在用GetPixel与SetPixel进行图像处理的同行们一个参考,高斯模糊等卷积运算我在还研究中,就先不贴了,以后再把优化后成熟的代码贴出来。说实在的,对于那些一边使用GetPixel与SetPixel一边说.NET处理性能慢的人,我都不知道说什么好,只能说那2个函数Microsoft的原意肯定不是用在大图片高速处理方面的。
/**/
/// <summary>
/// 亮度调整
/// </summary>
/// <param name="b"></param>
/// <param name="nBrightness"></param>
/// <returns></returns>
public static bool Brightness(Bitmap b, byte nBrightness)
... {
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int stride = bmData.Stride;
IntPtr Scan0 = bmData.Scan0;
int nVal = 0;
unsafe
...{
byte* p = (byte*)(void*)Scan0;
int nOffset = stride - b.Width * 3;
int nWidth = b.Width * 3;
for (int y = 0; y < b.Height; ++y)
...{
for (int x = 0; x < nWidth; ++x)
...{
nVal = (int)(p[0] + nBrightness);
if (nVal < 0) nVal = 0;
if (nVal > 255) nVal = 255;
p[0] = (byte)nVal;
++p;
}
p += nOffset;
}
}
b.UnlockBits(bmData);
return true;
}
/**/ /// <summary>
/// 对比度调整
/// </summary>
/// <param name="b"></param>
/// <param name="nContrast"></param>
/// <returns></returns>
public static bool Contrast(Bitmap b, float nContrast)
... {
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int U_Len = b.Width * b.Height * 3;
unsafe
...{
byte* p = (byte*)bmData.Scan0;
short c;
for (int i = 0; i < U_Len; ++i)
...{
c = (short)((p[0] - 127) * nContrast + 127);
p[0] =(byte)(c<0 ?(short) 0:(c>255?(short)255:c));
++p;
}
}
b.UnlockBits(bmData);
return true;
}
/**/ /// <summary>
/// 灰度处理
/// </summary>
/// <param name="b"></param>
/// <returns></returns>
public static bool GrayScale(Bitmap b)
... {
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* p = (byte*)(void*)Scan0;
int U_Len = b.Width * b.Height * 3;
for (int i = 0; i < U_Len; i+=3)
...{
//p[0] = p[1] = p[2] = (byte)(.299 * p[0] + .587 * p[1] + .114 * p[2]);
//p[0] = p[1] = p[2] = (byte)((p[0] + p[1] + p[2])/3);
p[0] = p[1] = p[2] = (byte) ((p[0] * 19595 + p[1] * 38469 + p[2] * 7472) >> 16);
p += 3;
}
}
b.UnlockBits(bmData);
return true;
}
/**/ /// <summary>
/// 反色处理
/// </summary>
/// <param name="b"></param>
/// <returns></returns>
public static bool RevScale(Bitmap b)
... {
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int U_Len = b.Width * b.Height * 3;
unsafe
...{
byte* p = (byte*)bmData.Scan0;
for (int i = 0; i < U_Len; ++i)
...{
p[0] = (byte)(255-p[0]);
++p;
}
}
b.UnlockBits(bmData);
return true;
}
/// 亮度调整
/// </summary>
/// <param name="b"></param>
/// <param name="nBrightness"></param>
/// <returns></returns>
public static bool Brightness(Bitmap b, byte nBrightness)
... {
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int stride = bmData.Stride;
IntPtr Scan0 = bmData.Scan0;
int nVal = 0;
unsafe
...{
byte* p = (byte*)(void*)Scan0;
int nOffset = stride - b.Width * 3;
int nWidth = b.Width * 3;
for (int y = 0; y < b.Height; ++y)
...{
for (int x = 0; x < nWidth; ++x)
...{
nVal = (int)(p[0] + nBrightness);
if (nVal < 0) nVal = 0;
if (nVal > 255) nVal = 255;
p[0] = (byte)nVal;
++p;
}
p += nOffset;
}
}
b.UnlockBits(bmData);
return true;
}
/**/ /// <summary>
/// 对比度调整
/// </summary>
/// <param name="b"></param>
/// <param name="nContrast"></param>
/// <returns></returns>
public static bool Contrast(Bitmap b, float nContrast)
... {
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int U_Len = b.Width * b.Height * 3;
unsafe
...{
byte* p = (byte*)bmData.Scan0;
short c;
for (int i = 0; i < U_Len; ++i)
...{
c = (short)((p[0] - 127) * nContrast + 127);
p[0] =(byte)(c<0 ?(short) 0:(c>255?(short)255:c));
++p;
}
}
b.UnlockBits(bmData);
return true;
}
/**/ /// <summary>
/// 灰度处理
/// </summary>
/// <param name="b"></param>
/// <returns></returns>
public static bool GrayScale(Bitmap b)
... {
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* p = (byte*)(void*)Scan0;
int U_Len = b.Width * b.Height * 3;
for (int i = 0; i < U_Len; i+=3)
...{
//p[0] = p[1] = p[2] = (byte)(.299 * p[0] + .587 * p[1] + .114 * p[2]);
//p[0] = p[1] = p[2] = (byte)((p[0] + p[1] + p[2])/3);
p[0] = p[1] = p[2] = (byte) ((p[0] * 19595 + p[1] * 38469 + p[2] * 7472) >> 16);
p += 3;
}
}
b.UnlockBits(bmData);
return true;
}
/**/ /// <summary>
/// 反色处理
/// </summary>
/// <param name="b"></param>
/// <returns></returns>
public static bool RevScale(Bitmap b)
... {
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int U_Len = b.Width * b.Height * 3;
unsafe
...{
byte* p = (byte*)bmData.Scan0;
for (int i = 0; i < U_Len; ++i)
...{
p[0] = (byte)(255-p[0]);
++p;
}
}
b.UnlockBits(bmData);
return true;
}