C#图像处理之霓虹效果实现方法

 更新时间:2015年04月24日 11:53:46   作者:沧海一粟……  
这篇文章主要介绍了C#图像处理之霓虹效果实现方法,可实现图片转换成霓虹效果的功能,需要的朋友可以参考下

本文实例讲述了C#图像处理之霓虹效果实现方法。分享给大家供大家参考。具体如下:

//定义霓虹处理函数
public Bitmap PNihong(Bitmap a)
{
 try
 {   
  int w = a.Width;
  int h = a.Height;
  Bitmap dstBitmap = new Bitmap(w, h, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
  System.Drawing.Imaging.BitmapData srcData = a.LockBits(new Rectangle
   (0, 0, w, h), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
  System.Drawing.Imaging.BitmapData dstData = dstBitmap.LockBits(new Rectangle
   (0, 0, w, h), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
  unsafe
  {
   byte* pIn = (byte*)srcData.Scan0.ToPointer();
   byte* pOut = (byte*)dstData.Scan0.ToPointer();
   byte* p;
   int stride = srcData.Stride;
   for (int y = 0; y < h; y++)
   {
   for (int x = 0; x < w; x++)
   {
    //边缘八个点像素不变
    if (x == 0 || x == w - 1 || y == 0 || y == h - 1)
    {
    pOut[0] = pIn[0];
    pOut[1] = pIn[1];
    pOut[2] = pIn[2];
    }
    else
    {
    int r0, r1, r2;
    int g1, g2, g0;
    int b1, b2, b0;
    double vR, vG, vB;
    //左上
    p = pIn - stride - 3;
    //右
    p = pIn + 3;
    r1 = p[2];
    g1 = p[1];
    b1 = p[0];
    //正下
    p = pIn + stride;
    r2 = p[2];
    g2 = p[1];
    b2 = p[0];
    //中心点
    p = pIn;
    r0 = p[2];
    g0 = p[1];
    b0 = p[0];
    //使用模板
    vR = Math.Sqrt((r0 - r1) * (r0 - r1) + (r0 - r2) * (r0 - r2));
    vG = Math.Sqrt((g0 - g1) * (g0 - g1) + (g0 - g2) * (g0 - g2));
    vB = Math.Sqrt((b0 - b1) * (b0 - b1) + (b0 - b2) * (b0 - b2));
    if (vR > 0)
    {
     vR = Math.Min(255, vR);
    }
    else
    {
     vR = Math.Max(0, vR);
    }
    if (vG > 0)
    {
     vG = Math.Min(255, vG);
    }
    else
    {
     vG = Math.Max(0, vG);
    }
    if (vB > 0)
    {
     vB = Math.Min(255, vB);
    }
    else
    {
     vB = Math.Max(0, vB);
    }
    pOut[0] = (byte)vB;
    pOut[1] = (byte)vG;
    pOut[2] = (byte)vR;
    }
    pIn += 3;
    pOut += 3;
   }
   pIn += srcData.Stride - w * 3;
   pOut += srcData.Stride - w * 3;
   }
  }
  a.UnlockBits(srcData);
  dstBitmap.UnlockBits(dstData);
  return dstBitmap;
 }
 catch (Exception e)
 {
  MessageBox.Show(e.Message.ToString());
  return null;
 }
}

原图:

效果图:

希望本文所述对大家的C#程序设计有所帮助。

相关文章

  • unity实现鼠标拖住3D物体

    unity实现鼠标拖住3D物体

    这篇文章主要为大家详细介绍了unity实现鼠标拖住3D物体,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • Unity游戏开发中的中介者模式的应用与实现

    Unity游戏开发中的中介者模式的应用与实现

    中介者模式是Unity游戏开发中常用的设计模式之一,用于减少对象之间的直接耦合,通过引入中介者来协调对象之间的交互。通过中介者模式,游戏对象可以更加灵活地进行交互和协同工作,降低系统复杂度,使代码更加易于维护和扩展
    2023-05-05
  • C#中Timer使用及解决重入问题

    C#中Timer使用及解决重入问题

    本文主要介绍了C#中Timer使用及解决重入问题的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • Winform+.Net6实现图片拖拽上传功能

    Winform+.Net6实现图片拖拽上传功能

    这篇文章主要为大家详细介绍了如何使用WinformPictureBox控件+.Net6 WebApi实现图片拖拽上传功能,文中的示例代码讲解详细,感兴趣的可以学习一下
    2023-09-09
  • C#格式化数字字符串的方法

    C#格式化数字字符串的方法

    这篇文章主要为大家详细介绍了C#格式化数字字符串的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • Unity通用泛型单例设计模式(普通型和继承自MonoBehaviour)

    Unity通用泛型单例设计模式(普通型和继承自MonoBehaviour)

    这篇文章主要介绍了Unity通用泛型单例设计模式,分为普通型和继承MonoBehaviour,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • C#纹理画刷TextureBrush用法实例

    C#纹理画刷TextureBrush用法实例

    这篇文章主要介绍了C#纹理画刷TextureBrush用法,实例分析了纹理画刷TextureBrush的具体使用技巧,需要的朋友可以参考下
    2015-06-06
  • C#重载运算符详解

    C#重载运算符详解

    这篇文章主要介绍了C#重载运算符,是进行C#程序设计中非常重要的一个技巧,需要的朋友可以参考下
    2014-08-08
  • C#中Params的用法

    C#中Params的用法

    这篇文章主要介绍了C#中Params的用法,以实例的形式展示了采用Params在不知道参数的数量时的应用技巧,非常具有实用价值,需要的朋友可以参考下
    2014-11-11
  • C#简单读写txt文件的方法

    C#简单读写txt文件的方法

    这篇文章主要介绍了C#简单读写txt文件的方法,涉及C#针对文件的基本打开、写入、保存与读取等操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-06-06

最新评论