图像处理中的几个简单函数

  因为我现在设计中的软件功能需要对图象进行高速处理,用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(00, 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(00, 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 ?(short0:(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(00, 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(00, 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;
        }

  • 0
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

xfyxq

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值