15.5 图像特效处理

  相比与IMG标签而言,ASP.NET能够通过GDI+动态的创建图像并且进行图片特效处理。相对于文字处理而言,图片特效处理很像Photoshop中对图片的处理,开发人员能够实现不同的图片特效,如呈现底片效果、黑白效果等。

15.5.1 底片效果
  通过Photoshop等软件能够快速的将图片制作成底片效果,但是在传统的图片处理领域中,只能通过软件进行图片效果的更改。在ASP.NET中,可以通过网页进行图片处理,包括底片、锐化等效果。
  在进行底片效果制作前,首先需要了解底片效果是如何实现的,在图片显示中,其实是很多很多的点(像素)组成一个图片的,如果像素的数量很多,则图片显示的就清晰,如果像素数量较少,则图片看上去就不那么清晰。一个图片的组成是通过像素组成的,这也就是说,一个图片包括很多的小点进行组合,最后组合成图片,如图15-18所示。
图片中的像素
图15-18 图片中的像素
  在进行底片效果的制作时,只需要分别找到图片中的这些点,并获取这些点的像素的值,再取反保存即可,示例代码如下所示。
+展开
-C#
        protected void Page_Load(object sender, EventArgs e)
        {
            Bitmap images = new Bitmap(Server.MapPath("change.jpg"));//载入图片
            for (int i = 0; i < images.Width; i++)//循环遍历宽
            {
                for (int j = 0; j < images.Height; j++)//循环遍历高度
                {
                    Color pix = images.GetPixel(i, j);//获取图像像素值
                    int r = 255 - pix.R;//像素值取反
                    int g = 255 - pix.G;//转换颜色
                    int b = 255 - pix.B;//转换颜色
                    images.SetPixel(i, j, Color.FromArgb(r, g, b));//保存像素值
                }
            }
            images.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
            images.Dispose();
        }

  上述代码通过循环遍历像素值并进行像素值取反则能够实现底片效果,运行效果前后如图15-19和图15-20所示。
原图像
图15-19 原图像
执行底片效果
图15-20 执行底片效果
  在图像中,图像通常是使用RGB三原色进行图形渲染的,RGB分别为红色、绿色和蓝色,图形通过协调这三原色进行图形渲染。RGB在计算机中通常描述的范围是从0-255之间的某个数值的,所以当需要取反时,只需通过255减去现有的像素的色值即可。

15.5.2 浮雕效果
  对于图片效果的更改和渲染都是通过修改像素的值来进行渲染的,当像素足够大时,人眼无法辨认其像素的多少,所以更改像素的大小对人眼来说是无法发觉的。
  执行浮雕效果与底片效果实现手法非常类似,但是浮雕效果的实现与底片效果的实现中所需要使用的算法又不尽相同。实现浮雕效果通常是将图像上每个像素点与其对角线的像素点形成差值,使相似颜色值淡化,不同颜色值之间保持突出,从而形成纵深感,达到浮雕的效果。在程序开发中,可以讲像素点的像素值与周边的像素值相减后加上128,则可以呈现浮雕效果,示例代码如下所示。
+展开
-C#
        protected void Page_Load(object sender, EventArgs e)
        {
            Bitmap images = new Bitmap(Server.MapPath("change.jpg"));//载入图片
            for (int i = 0; i < images.Width-1; i++)//循环遍历宽
            {
                for (int j = 0; j < images.Height-1; j++)//循环遍历高度
                {
                    Color pix1 = images.GetPixel(i, j); //获取图像像素值
                    Color pix2 = images.GetPixel(i+1, j+1); //获取图像像素值
                    int r = Math.Abs(pix1.R - pix2.R + 128);//实现浮雕效果
                    int g = Math.Abs(pix1.G - pix2.G + 128);
                    int b = Math.Abs(pix1.B - pix2.B + 128);
                    r = check(r);//判断是否溢出
                    g = check(g);
                    b = check(b);
                    images.SetPixel(i, j, Color.FromArgb(r, g, b));//设置像素值
                }
            }
            images.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
            images.Dispose();
        }

  在进行浮雕效果实现时,需要进行判断,判断转换后的值是否超过255或者小于0,如果超过255则按照255进行处理,如果小于0则按照0进行处理。check函数代码如下所示。
+展开
-C#
        protected int check(int x)
        {
            if (x > 255)//如果像素值大于255
            {
                return 255;//返回255
            }
            else if (x < 0) //如果像素值小于0
            {
                return 0;//返回0
            }
            else
            {
                return x;//直接返回
            }
        }

程序运行后,图片渲染前后效果如图15-21和图15-22所示。
原图像
图15-21 原图像
执行浮雕效果
图15-22 执行浮雕效果

加支付宝好友偷能量挖...


评论(0)网络
阅读(96)喜欢(0)Asp.Net/C#/WCF