图像滤镜艺术---挤压(Pinch)滤镜

简介: 原文:图像滤镜艺术---挤压(Pinch)滤镜Pinch滤镜 Pinch滤镜是通过坐标变换来实现以某个点(cenX,cenY)为中心,某个半径R内图像向其挤压变形的效果。实现这个滤镜的算法很多,主要是数学公式的不同,大家可以自行设计,这里给个代码示例,大家可以直接使用。
原文: 图像滤镜艺术---挤压(Pinch)滤镜

Pinch滤镜

Pinch滤镜是通过坐标变换来实现以某个点(cenX,cenY)为中心,某个半径R内图像向其挤压变形的效果。实现这个滤镜的算法很多,主要是数学公式的不同,大家可以自行设计,这里给个代码示例,大家可以直接使用。
代码如下:
//
        /// <summary>
        /// Pinch Filter
        /// </summary>
        /// <param name="src">Source image.</param>
        /// <param name="cenX">The X position of sun.</param>
        /// <param name="cenY">The Y position of sun.</param>
        /// <returns>The result image.</returns>
        private Bitmap PinchFilterProcess(Bitmap srcBitmap, int cenX, int cenY)
        {
            Bitmap a = new Bitmap(srcBitmap);
            int w = a.Width;
            int h = a.Height;
            int radius = 0;
            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 sWidth = srcData.Stride;
                int stride = sWidth - w * 4;
                int offsetX = 0, offsetY = 0;
                int newX = 0, newY = 0;
                double radian = 0,degree = 10;
                for (int y = 0; y < h; y++)
                {
                    for (int x = 0; x < w; x++)
                    {
                        offsetX = x - cenX;
                        offsetY = y - cenY;
                        radian = Math.Atan2(offsetY, offsetX);
                        radius = (int)(Math.Sqrt(offsetX * offsetX + offsetY * offsetY));
                        radius = (int)(Math.Sqrt(radius) * degree);
                        newX = (int)(radius * Math.Cos(radian)) + cenX;
                        newY = (int)(radius * Math.Sin(radian)) + 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;
                        pOut[0] = (byte)p[0];
                        pOut[1] = (byte)p[1];
                        pOut[2] = (byte)p[2];
                        pOut[3] = (byte)255;                     
                        pOut += 4;
                    }
                    pOut += stride;
                }
                a.UnlockBits(srcData);
                dst.UnlockBits(dstData);
            }
            return dst;

        }
效果图如下:

原图

Pinch滤镜效果图

最后放上一个完整的C#版程序Demo给大家下载使用:http://www.zealpixel.com/forum.php?mod=viewthread&tid=55&extra=page%3D1

目录
相关文章
|
C#
图像滤镜艺术---球面(Spherize)滤镜
原文:图像滤镜艺术---球面(Spherize)滤镜 球面(Spherize)滤镜 球面滤镜是通过极坐标变换实现图像的球面特效。 代码如下:         //         ///         /// Pinch Filter         ///        /// Source image.
1018 0
|
C#
图像滤镜艺术---怀旧风格滤镜
原文:图像滤镜艺术---怀旧风格滤镜怀旧风格滤镜 本文介绍一款怀旧风格滤镜特效的代码实现,这个滤镜效果跟前面我们介绍的老照片滤镜效果相比,听起来感觉没太大差,实际上老照片不仅 有怀旧的风格,更多了一些怀旧的痕迹,比如照片的褶皱,裂纹等等,而怀旧风格,只是一种发黄的颜色风格而已。
1126 0
|
C# 计算机视觉
图像滤镜艺术---Swirl滤镜
原文:图像滤镜艺术---Swirl滤镜Swirl Filter Swirl 滤镜是实现图像围绕中心点(cenX,cenY)扭曲旋转的效果,效果图如下: 原图 效果图 代码如下:         //         ///     ...
914 0
|
C#
图像滤镜艺术---连环画滤镜
原文:图像滤镜艺术---连环画滤镜 小时候我们都喜欢看连环画,虽然是黑白色的,但是也能让我们看的津津有味。 今天,我在这里介绍一种连环画特效的实现方法,带你回到那个记忆的年代。
954 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,这个油漆桶是用来盛放不同类别的像素。
1174 0
|
C#
图像滤镜艺术---暗调滤镜
原文:图像滤镜艺术---暗调滤镜本文介绍暗调滤镜的实现过程,这个滤镜主要是呈现一种暗调,对比度明显的效果,原理很简单,公式如下: newR = R*R/255; newG = G*G/255; newB = B*B/255; 实现代码如下:  private Bitmap Filte...
907 0
|
算法 C#
图像滤镜艺术---霓虹、浮雕、木刻滤镜
原文:图像滤镜艺术---霓虹、浮雕、木刻滤镜  图像特效往往可以将普通的照片呈现出一种令人耳目一新的效果,特效的种类繁多,比如各种流行的 滤镜特效等等,今天,我们介绍几种最简单的滤镜:霓虹效果,浮雕效果和木刻效果。
1716 0
|
C# 计算机视觉
图像滤镜艺术--大雾效果滤镜
原文:图像滤镜艺术--大雾效果滤镜 今天给大家介绍一款大雾效果的滤镜,先看下效果图:                                                               ...
1107 0
|
算法 vr&ar
图像滤镜艺术---漫画滤镜
原文:图像滤镜艺术---漫画滤镜 漫画滤镜 所谓漫画滤镜就是通过复杂的算法来模拟漫画的特点,从而使真实照片呈现出漫画的风格。要实现漫画的效果,首先要了解漫画的特点,漫画具有几个比较明显的特点如下: 1,颜色泛用 漫画中,使用的颜色比较单一,一般不会超过7种颜色,不像真实照片那样,具有丰富的...
1381 0
|
算法 Android开发
图像滤镜艺术---图像滤镜晕影调节算法研究
原文:图像滤镜艺术---图像滤镜晕影调节算法研究 本文对滤镜中常见的晕影,晕角效果的实现做了研究,具体如下: 1 晕影调整算法 所谓晕影就是给图像四个角添加暗影效果,这暗影向图像中心逐渐淡化。我们使用如下公式来实现: 假设图像宽度高度分别为w,h: double d = Math.
1150 0