原文:图像滤镜艺术--Toaster滤镜

    根据Instagram CEO的说法,Toaster滤镜是Instagram所有滤镜中最复杂的滤镜,这个滤镜给人一种新奇的红色烘烤感,很能让人联想起这个Toaster单词的本意呵呵,今天我将用C#实现这个滤镜,当然我也只是探索,如何逼近它的效果,差异的存在在所难免,大家勿怪哦。

    按照之前的说法,还是先使用Photoshop进行模拟,然后根据模拟步骤,进行C#代码编写。

首先,看下效果图:

 

                                                               (a)PS效果图

                                                             (b)Instagram效果图

                                                         (c)C#代码效果图

    效果怎么样我说了不算呵呵,下面介绍PS实现步骤:

    1,打开测试图像,命名为图层Source

    2,创建三个模板,这里三个模板我已经给大家提供,在下载包里,当然这三个模板是我根据Instagram变换出来的,大家只需要拿来使用就行了,将三个模板分别命名为a,b,c,如下图所示:

    3,对图层a执行"混合图层"---"正片叠底"

    4,对图层b执行"混合图层"---"滤色":

    5,对图层c执行"混合图层"---"柔光":

    这样效果图就出来了,看起来是不是相当简单呢?

    下面我们介绍C#代码实现:

    这里实现的关键也就是讲三个图层分别按照相应的图层混合模式混合起来就可以了,我这里新建了一个ToasterFilter的类,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging; namespace SpecialeffectDemo
{
unsafe class ToasterFilter
{
public ToasterFilter(Bitmap src,Bitmap bg_a,Bitmap bg_b,Bitmap bg_c)
{
this.srcBitmap = src;
this.mapa = bg_a;
this.mapb = bg_b;
this.mapc = bg_c;
}
private Bitmap srcBitmap = null;
private Bitmap mapa = null;
private Bitmap mapb = null;
private Bitmap mapc = null;
public Bitmap Apply()
{
if (srcBitmap != null)
{
Bitmap src = new Bitmap(srcBitmap);
int w = srcBitmap.Width;
int h = srcBitmap.Height;
BitmapData srcData = src.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
BitmapData mapaData = mapa.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
BitmapData mapbData = mapb.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
BitmapData mapcData = mapc.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
byte* p = (byte*)srcData.Scan0;
byte* pa = (byte*)mapaData.Scan0;
byte* pb = (byte*)mapbData.Scan0;
byte* pc = (byte*)mapcData.Scan0;
int r = 0, g = 0, b = 0, a = 0, t = 0;
for (int j = 0; j < h; j++)
{
for (int i = 0; i < w; i++)
{
b = p[0];
g = p[1];
r = p[2]; b = SpecialEffectClass.ModeMultiplyEffect(b, pa[0]);
g = SpecialEffectClass.ModeMultiplyEffect(g, pa[1]);
r = SpecialEffectClass.ModeMultiplyEffect(r, pa[2]); b = SpecialEffectClass.ModeFilterColorEffect(b, pb[0]);
g = SpecialEffectClass.ModeFilterColorEffect(g, pb[1]);
r = SpecialEffectClass.ModeFilterColorEffect(r, pb[2]); a = pc[3];
if (a == 255)//由于模板图像中存在透明度变化,因此选用32位bgra格式
{
b = SpecialEffectClass.ModeSmoothLightEffect(b, pc[0]);
g = SpecialEffectClass.ModeSmoothLightEffect(g, pc[1]);
r = SpecialEffectClass.ModeSmoothLightEffect(r, pc[2]);
}
else
{
t = SpecialEffectClass.ModeSmoothLightEffect(b, pc[0]);
b = (b * (255 - a) + t * a)/255;
t = SpecialEffectClass.ModeSmoothLightEffect(g, pc[1]);
g = (g * (255 - a) + t * a)/255;
t = SpecialEffectClass.ModeSmoothLightEffect(r, pc[2]);
r = (r * (255 - a) + t * a)/255;
}
p[0] = (byte)b;
p[1] = (byte)g;
p[2] = (byte)r;
p += 4;
pa += 4;
pb += 4;
pc += 4;
}
p += srcData.Stride - w * 4;
pa += mapaData.Stride - w * 4;
pb += mapbData.Stride - w * 4;
pc += mapcData.Stride - w * 4;
}
src.UnlockBits(srcData);
mapa.UnlockBits(mapaData);
mapb.UnlockBits(mapbData);
mapc.UnlockBits(mapcData);
return src;
}
else
{
return null;
}
} }
}

注意:由于图层C是具有不同的透明度的,因此,我们在程序中要使用PixelFormat.Format32bppArgb,而不再是24位;

程序效果图稍微偏暗,大家可以调整一下亮度即可,最后,放上Demo的下载链接,当然,里面有两个包,一个是Photoshop文件,供大家进行PS实践检验,一个是C#的Demo:http://download.csdn.net/detail/trent1985/8132433

如有问题,联系我。邮箱:dongtingyueh@163.com,QQ:13634132112

 

最后,分享一个专业的图像处理网站(微像素),里面有很多源代码下载:

图像滤镜艺术--Toaster滤镜的更多相关文章

  1. 图像滤镜艺术---Wave滤镜

    原文:图像滤镜艺术---Wave滤镜 Wave Filter水波滤镜 水波滤镜是通过坐标变换来模拟水波效果,使图像呈现出水波的特效.这个滤镜有一个可调参数:水波的扭曲程度. 代码如下; //     ...

  2. 图像滤镜艺术---Swirl滤镜

    原文:图像滤镜艺术---Swirl滤镜 Swirl Filter Swirl 滤镜是实现图像围绕中心点(cenX,cenY)扭曲旋转的效果,效果图如下: 原图 效果图 代码如下:         // ...

  3. 图像滤镜艺术---Hudson滤镜(Instagram)

    原文:图像滤镜艺术---Hudson滤镜(Instagram)     今天给大家实现的是Instagram中的Hudson滤镜,为什么介绍Instagram滤镜,原因很简单,Instagram本身就 ...

  4. 图像滤镜艺术----Brannan滤镜

    原文:图像滤镜艺术----Brannan滤镜     作为第一篇文章,本人将介绍Instagram中Brannan 滤镜的实现过程,当然,是自己的模拟而已,结果差异敬请谅解.     先看下效果图: ...

  5. Atitit 图像处理之仿油画效果 Oilpaint油画滤镜 水彩画 漫画滤镜 v2

    Atitit 图像处理之仿油画效果 Oilpaint油画滤镜 水彩画 漫画滤镜 v2 1.1. 具体源码参考1 2. ,油画 水彩画具有几个比较明显的特点如下:1 2.1. 明暗层次(灰度)较少  也 ...

  6. 图像滤镜艺术---PS图像转手绘特效实现方案

    原文:图像滤镜艺术---PS图像转手绘特效实现方案 手绘效果实现方案 本文介绍一种PS手绘效果的实现方案,PS步骤来自网络,本文介绍代码实现过程. 整体看来,虽然效果还是有很大差异,但是已经有了这种特 ...

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

    原文:图像滤镜艺术---流行艺术风滤镜特效PS实现 今天,本人给大家介绍一款新滤镜:流行艺术风效果,先看下效果吧! 原图 流行艺术风效果图 上面的这款滤镜效果是不是很赞,呵呵,按照本人以往的逻辑,我会 ...

  8. 图像滤镜艺术---微软自拍APP滤镜实现合集DEMO

    原文:图像滤镜艺术---微软自拍APP滤镜实现合集DEMO 微软最近推出了自家的美颜app,大家有兴趣可以在苹果商店中下载一下看一看,今天,我们要说的便是这款app中的所有滤镜实现问题. 这款app中 ...

  9. 图像滤镜艺术---保留细节的磨皮滤镜之PS实现

    原文:图像滤镜艺术---保留细节的磨皮滤镜之PS实现 目前,对于人物照片磨皮滤镜,相信大家没用过也听过吧,这个滤镜的实现方法是多种多样,有难有简,有好有差,本人经过长时间的总结,得出了一种最简单,效果 ...

随机推荐

  1. css画电脑键盘

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. ITFriend创业败局(二):初创公司应该怎样分配股权

    说到金钱,中国人有句口头禅,"谈钱多伤感情".这句话非常能代表,在熟人之间,中国人不喜欢在金钱上"斤斤计较". 但是,对于一起出来创业,尤其是没有经验的年轻人来 ...

  3. PCI的imagework已由freeview软件代替

    作者:朱金灿 来源:http://blog.csdn.net/clever101 在PCI 9.1中重要模块集成显示环境imagework还存在,但是到了PCI 10.0中imagework已经消失了 ...

  4. AJAX跨域与JSONP的一点实践经验

    前几个周,项目中遇到了AJAX跨域的问题,然后找资料解决了. 首先要说明一点,关于AJAX的跨域原理和实践,我的经验还是比较少的,我只是大致看了下网上的资料,结合自己的理解,找到了解决办法,暂时不去仔 ...

  5. spring security之httpSecurity 专题

    37.5.2 Resolving the CsrfToken Spring Security provides CsrfTokenArgumentResolver which can automati ...

  6. 【BZOJ 1037】[ZJOI2008]生日聚会Party

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1037 [题意] [题解] /* 设f[i][j][k][l] 表示前i个人中,有j个男 ...

  7. kindeditor 4 指定生成文件的时间日期/动态获取My97的时间

    最近后台要求要指定上传附件的时间日期,编辑器是kindeditor,仔细研究后发现可以借助clickToolbar事件,传递时间到后台,但是中途发现传递的时间总是初始化my97的时间,改变后的时间只有 ...

  8. 卷积神经网络(CNN)的细节问题(滤波器的大小选择)

    0. 滤波器的大小选择 大部分卷积神经网络都会采用逐层递增(1⇒ 3 ⇒ 5 ⇒ 7)的方式. 每经过一次池化层,卷积层过滤器的深度都会乘以 2: 1. 权值共享:减轻过拟合 & 降低计算量 ...

  9. qmake生成vcproj & sln

    qmake生成的vs工程与环境变量中的 qmakespec相关,可以有两种方法: 1.默认情况下,即环境变量qmakespec为你装的qt for vs的版本,默认生成的为该版本的vs工程,如,你装的 ...

  10. node lesson3

    var express = require('express'); var superagent = require('superagent'); var cheerio = require('che ...