图像滤镜艺术---挤压(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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-06 17:34:29

图像滤镜艺术---挤压(Pinch)滤镜的相关文章

图像滤镜艺术---球面(Spherize)滤镜

球面(Spherize)滤镜 球面滤镜是通过极坐标变换实现图像的球面特效. 代码如下: // /// /// Pinch Filter ///        /// Source image. /// The X position of sun. /// The Y position of sun. /// The result image. private Bitmap SpherizeFilterProcess(Bitmap srcBitmap, int cenX, int cenY) {

图像滤镜艺术---Oilpaint油画滤镜

Oilpaint油画滤镜 图像油画效果实际上是将图像边缘产生一种朦胧,雾化的效果,同时,将一定的边缘模糊化,这样图像整体上看去像素与像素之间就像雾一样随机呈现. 算法过程如下: 假设当前像素为P(x,y),他的随机位置为Pd(dx,dy),那么算法公式如下: 其中,K(v)为最大值不大于v的随机数正数,v为雾化阈值,v值越大,雾化程度越明显,反之,雾化程度越小,v=0时,图像无变化效果. 核心代码如下: /// <summary> /// Mosaic filter. /// </sum

图像滤镜艺术---(Instagram)1977滤镜

图像特效---(Instagram)1977滤镜 本文介绍1977这个滤镜的具体实现,这个滤镜最早是Instagram中使用的 ,由于Instagram滤镜备受欢迎,因此,美图秀秀中也使用了这个滤镜,只是名字不是1977,而是1970. 原理不多说了,直接给出代码最实在,这个代码是经过优化过的,复杂的算法都已经写成了一个映射表,这样做可以大大提高效率,代码如下: private Bitmap FilterProcess(Bitmap a) { Bitmap srcBitmap = new Bit

图像滤镜艺术---Glow Filter发光滤镜

Glow Filter发光滤镜 Glow Filter发光滤镜是一种让图像产生发光效果的滤镜,它的实现算法如下: 1,对原图P进行高斯模糊得到图像A: 2,将P和A进行"叠加"图层混合处理,公式如下: Result(x,y) = ((basePixel(x,y) <= 128) ? (mixPixel(x,y) * basePixel(x,y) / 128):(255 - (255 - mixPixel(x,y)) * (255 - basePixel(x,y)) / 128))

图像滤镜艺术--Toaster滤镜

根据Instagram CEO的说法,Toaster滤镜是Instagram所有滤镜中最复杂的滤镜,这个滤镜给人一种新奇的红色烘烤感,很能让人联想起这个Toaster单词的本意呵呵,今天我将用C#实现这个滤镜,当然我也只是探索,如何逼近它的效果,差异的存在在所难免,大家勿怪哦. 按照之前的说法,还是先使用Photoshop进行模拟,然后根据模拟步骤,进行C#代码编写. 首先,看下效果图: (a)PS效果图 (b)Instagram效果图 (c)C#代码效果图 效果怎么样我说了不算呵呵,下面介绍P

iOS使用CoreImage处理图像40中可用的滤镜名称

NSString* localPath = [[NSBundle mainBundle] pathForResource:@"1" ofType:@"jpg"]; NSURL* fileUrl = [NSURL fileURLWithPath:localPath]; CIImage* image = [CIImage imageWithContentsOfURL:fileUrl]; CIContext* context = [CIContext contextWit

图像滤镜艺术---流行艺术风滤镜特效PS实现

今天,本人给大家介绍一款新滤镜:流行艺术风效果,先看下效果吧! 原图 流行艺术风效果图 上面的这款滤镜效果是不是很赞,呵呵,按照别人以往的逻辑,我会先介绍PS实现过程,然后,在下一篇博客中将介绍完整的C#代码实现,并附上程序DEMO给大家分享! 现在开始PS过程: 1,打开图像,复制两份图层A,B: 2,将B图层隐藏,对图层A执行: 反相操作-"明度"图层混合-透明度"50%" 如图所示: 3,可见B图层,对B执行: 阈值(128)-"正片叠底"

图像滤镜艺术---ZPhotoEngine超级算法库

一直以来,都有个想法,想要做一个属于自己的图像算法库,这个想法,在经过了几个月的努力之后,终于诞生了,这就是ZPhotoEngine算法库. 这个算法库目前包含两个模块:基础图像算法模块+滤镜模块,使用C语言实现,现在免费分享给大家,可以适用于PC/Android/Ios三大平台. 1,基础图像算法模块 这个模块,本人以Photoshop基础算法为原形,模拟出了PS大部分的基础算法. 为什么选择Photoshop算法?这个也是我的算法库一个优势,目前开源算法库多如牦牛,但是,能和PS媲美的,少之

图像滤镜艺术---乐高像素拼图特效

本文介绍乐高像素拼图特效滤镜的实现,这里仅仅介绍PS实现过程,关于程序的实现,大家可以使用ZPhotoEngine来实现,这个引擎可以在www.zealpixel.com上下载,是免费的. 现在介绍PS的实现过程: 1,打开一张美丽的图像: 原图 复制图层,命名为"马赛克",然后对该图层执行"滤镜-像素化-马赛克-20": 2,复制"马赛克"图层,命名为"马赛克副本": 3,对马赛克副本图层执行"调整-色调分离-4&