图像滤镜艺术---旋转模糊滤镜

简介: 原文:图像滤镜艺术---旋转模糊滤镜本文介绍一种旋转模糊滤镜的实现算法。 旋转模糊主要特点是:整张图像围绕一个中心点做旋转变换,同时有个控制旋转程度的变量和一个控制模糊程度的变量,来完成这个效果。图像中距离中心点越近,旋转和模糊的程度都越小,反之,越大。
原文: 图像滤镜艺术---旋转模糊滤镜

本文介绍一种旋转模糊滤镜的实现算法。

旋转模糊主要特点是:整张图像围绕一个中心点做旋转变换,同时有个控制旋转程度的变量和一个控制模糊程度的变量,来完成这个效果。图像中距离中心点越近,旋转和模糊的程度都越小,反之,越大。
假设中心点O坐标为(cenX,cenY),当前点位置为P(x,y):
1,PO距离Dis=Math.Sqrt((y - cenY) * (y - cenY) + (x - cenX) * (x - cenX));
2,PO和水平方向夹角angle=Math.Atan2((double)(y - cenY), (double)(x - cenX));
3,当前点P对应的旋转后新的坐标newX,newY计算:
newX = Dis * Math.Cos(angle) + cenX;
newY = Dis *  Math.Sin(angle) + cenY;
下面给出完整的C#代码:
 /// <summary>
        /// Rotate Blur
        /// </summary>
        /// <param name="src">Source image.</param>
        /// <param name="cenX">The X position of Blur.</param>
        /// <param name="cenY">The Y position of Blur.</param>
        /// <param name="intensity">The intensity of blur,0-100.</param>
        /// <returns>The result image.</returns>
        private Bitmap RotateBlurProcess(Bitmap srcBitmap, int cenX, int cenY, int intensity)
        {
            Bitmap a = new Bitmap(srcBitmap);
            int w = a.Width;
            int h = a.Height;
            cenX = Math.Min(w - 1, Math.Max(0, cenX));
            cenY = Math.Min(h - 1, Math.Max(0, cenY));
            Bitmap dst = new Bitmap(w, h);
            System.Drawing.Imaging.BitmapData srcData = a.LockBits(new Rectangle(0, 0, w, h), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            System.Drawing.Imaging.BitmapData dstData = dst.LockBits(new Rectangle(0, 0, w, h), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            unsafe
            {
                byte* pIn = (byte*)srcData.Scan0.ToPointer();
                byte* pOut = (byte*)dstData.Scan0.ToPointer();
                byte* p = null;
                int stride = srcData.Stride - w * 4;
                int newX = 0, newY = 0;
                double angle = 0;
                double temp = 0, r = 0, g = 0, b = 0;
                for (int y = 0; y < h; y++)
                {
                    for (int x = 0; x < w; x++)
                    {
                        r = 0;
                        g = 0;
                        b = 0;
                        temp = Math.Sqrt((y - cenY) * (y - cenY) + (x - cenX) * (x - cenX));
                        angle = Math.Atan2((double)(y - cenY), (double)(x - cenX));
                        for (int n = 0; n < intensity; n++)
                        {
                            angle = angle + 0.005;
                            newX = (int)(temp * Math.Cos(angle) + (double)cenX);
                            newY = (int)(temp * Math.Sin(angle) + (double)cenY);
                            newX = Math.Min(w - 1, Math.Max(0, newX));
                            newY = Math.Min(h - 1, Math.Max(0, newY));
                            p = pIn + newY * srcData.Stride + newX * 4;
                            b = b + p[0];
                            g = g + p[1];
                            r = r + p[2];
                        }
                        b = Math.Min(255, Math.Max(0, b / intensity));
                        g = Math.Min(255, Math.Max(0, g / intensity));
                        r = Math.Min(255, Math.Max(0, r / intensity));
                        pOut[0] = (byte)b;
                        pOut[1] = (byte)g;
                        pOut[2] = (byte)r;
                        pOut[3] = (byte)255;
                        pOut += 4;
                    }
                    pOut += stride;
                }
                a.UnlockBits(srcData);
                dst.UnlockBits(dstData);
            }
            return dst;
        }
最后,看下效果图:

原图

效果图

给出一个完整DEMO程序的下载地址: http://www.zealpixel.com/forum.php?mod=viewthread&tid=148&extra=page%3D1 跟大家分享一下!
目录
相关文章
|
计算机视觉 C++ Python
Python相片图片编辑工具-翻转旋转亮度磨皮裁剪添加文字
这篇博客针对<<Python相片图片编辑工具-翻转旋转亮度磨皮裁剪添加文字>>编写代码,代码整洁,规则,易读。 学习与应用推荐首选。
113 0
|
C#
图像滤镜艺术---球面(Spherize)滤镜
原文:图像滤镜艺术---球面(Spherize)滤镜 球面(Spherize)滤镜 球面滤镜是通过极坐标变换实现图像的球面特效。 代码如下:         //         ///         /// Pinch Filter         ///        /// Source image.
1026 0
|
算法 C#
图像滤镜艺术---图像光照效果滤镜
原文:图像滤镜艺术---图像光照效果滤镜     图像光照滤镜     图像光照提滤镜主要是模拟阳光照射下的图像效果,通常使用在暗光环境下拍摄的照片中,或者是没有太阳的日景照片中。
1123 0
|
C# 算法
图像滤镜艺术---挤压(Pinch)滤镜
原文:图像滤镜艺术---挤压(Pinch)滤镜Pinch滤镜 Pinch滤镜是通过坐标变换来实现以某个点(cenX,cenY)为中心,某个半径R内图像向其挤压变形的效果。实现这个滤镜的算法很多,主要是数学公式的不同,大家可以自行设计,这里给个代码示例,大家可以直接使用。
994 0
|
算法 C#
图像滤镜艺术---霓虹、浮雕、木刻滤镜
原文:图像滤镜艺术---霓虹、浮雕、木刻滤镜  图像特效往往可以将普通的照片呈现出一种令人耳目一新的效果,特效的种类繁多,比如各种流行的 滤镜特效等等,今天,我们介绍几种最简单的滤镜:霓虹效果,浮雕效果和木刻效果。
1728 0
|
C# 计算机视觉
图像滤镜艺术---Swirl滤镜
原文:图像滤镜艺术---Swirl滤镜Swirl Filter Swirl 滤镜是实现图像围绕中心点(cenX,cenY)扭曲旋转的效果,效果图如下: 原图 效果图 代码如下:         //         ///     ...
919 0
|
C#
图像滤镜艺术---连环画滤镜
原文:图像滤镜艺术---连环画滤镜 小时候我们都喜欢看连环画,虽然是黑白色的,但是也能让我们看的津津有味。 今天,我在这里介绍一种连环画特效的实现方法,带你回到那个记忆的年代。
960 0
|
C#
图像滤镜艺术---暗调滤镜
原文:图像滤镜艺术---暗调滤镜本文介绍暗调滤镜的实现过程,这个滤镜主要是呈现一种暗调,对比度明显的效果,原理很简单,公式如下: newR = R*R/255; newG = G*G/255; newB = B*B/255; 实现代码如下:  private Bitmap Filte...
915 0
|
算法
图像滤镜艺术---水彩画滤镜
原文:图像滤镜艺术---水彩画滤镜水彩画滤镜 水彩画滤镜算法如下: 1,假设原始图像为F(x,y),灰度化得到G(x,y); 2,构建一个半径为Radius的正方形模板M,边长为2*Radius+1; 3,将M在F上依次遍历每个像素,对于当前像素P(x,y): 设置一个油漆桶数N,由于图像灰度值范围为0-255,因此我们油漆桶的数量N要小于255,这个油漆桶是用来盛放不同类别的像素。
1182 0
|
C#
图像滤镜艺术---怀旧风格滤镜
原文:图像滤镜艺术---怀旧风格滤镜怀旧风格滤镜 本文介绍一款怀旧风格滤镜特效的代码实现,这个滤镜效果跟前面我们介绍的老照片滤镜效果相比,听起来感觉没太大差,实际上老照片不仅 有怀旧的风格,更多了一些怀旧的痕迹,比如照片的褶皱,裂纹等等,而怀旧风格,只是一种发黄的颜色风格而已。
1133 0