首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > .NET > C#.NET > 图像处理中的几个简单函数
【标  题】:图像处理中的几个简单函数
【关键字】:
【来  源】:http://blog.csdn.net/xfyxq/archive/2007/03/07/1522990.aspx

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

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

C#学习:构造、析构函数:【上一篇】
SqlReader通过字段名读取数据:【下一篇】
【相关文章】
没有相关文章
【随机文章】
  • 维护插入顺序NEW
  • servlet2.3规范之七——会话
  • xiao77/xiao77电影--xiao77美女大众成人网
  • 年度回顾:开发工具的UML/MDA趋势
  • 原来线程-2 (直面多线程)
  • 别让生命留下太多的遗憾
  • 在高性能计算中慎用C++ std::complex
  • 确保 ASP.NET 应用程序和 Web Services 的安全
  • Tor代理全套解决方案
  • 终于准备去参加10G的考试了
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.