图像滤镜艺术--Toaster滤镜

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

 

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

目录
相关文章
|
C# 计算机视觉
图像滤镜艺术--大雾效果滤镜
原文:图像滤镜艺术--大雾效果滤镜 今天给大家介绍一款大雾效果的滤镜,先看下效果图:                                                               ...
1114 0
|
C# 计算机视觉
图像滤镜艺术--暴雨滤镜
原文:图像滤镜艺术--暴雨滤镜     今天给大家介绍的是一款暴雨滤镜,可以将一些风和日丽的风景照片变换为暴雨效果的照片,废话不多说,先给大家看下效果:                             ...
1104 0
|
C#
图像滤镜艺术--大雪滤镜
原文:图像滤镜艺术--大雪滤镜   今天给大家介绍一款大雪滤镜,可以使你夏天的照片瞬间幻化为大雪纷飞的场景哦!先看下效果图:   上面三张图像分别是(a)原始图像,(b)PS效果图,(c)C#代码效果图 这个大雪滤镜也比较简单,按照之前的步骤,我们依次介绍PS实现过程以及代码实现过程。
1232 0
|
C# 计算机视觉
图像滤镜艺术---Swirl滤镜
原文:图像滤镜艺术---Swirl滤镜Swirl Filter Swirl 滤镜是实现图像围绕中心点(cenX,cenY)扭曲旋转的效果,效果图如下: 原图 效果图 代码如下:         //         ///     ...
920 0
|
C#
图像滤镜艺术---暗调滤镜
原文:图像滤镜艺术---暗调滤镜本文介绍暗调滤镜的实现过程,这个滤镜主要是呈现一种暗调,对比度明显的效果,原理很简单,公式如下: newR = R*R/255; newG = G*G/255; newB = B*B/255; 实现代码如下:  private Bitmap Filte...
918 0
|
C#
图像滤镜艺术---连环画滤镜
原文:图像滤镜艺术---连环画滤镜 小时候我们都喜欢看连环画,虽然是黑白色的,但是也能让我们看的津津有味。 今天,我在这里介绍一种连环画特效的实现方法,带你回到那个记忆的年代。
961 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#
图像滤镜艺术---霓虹、浮雕、木刻滤镜
原文:图像滤镜艺术---霓虹、浮雕、木刻滤镜  图像特效往往可以将普通的照片呈现出一种令人耳目一新的效果,特效的种类繁多,比如各种流行的 滤镜特效等等,今天,我们介绍几种最简单的滤镜:霓虹效果,浮雕效果和木刻效果。
1730 0
|
算法 vr&ar
图像滤镜艺术---漫画滤镜
原文:图像滤镜艺术---漫画滤镜 漫画滤镜 所谓漫画滤镜就是通过复杂的算法来模拟漫画的特点,从而使真实照片呈现出漫画的风格。要实现漫画的效果,首先要了解漫画的特点,漫画具有几个比较明显的特点如下: 1,颜色泛用 漫画中,使用的颜色比较单一,一般不会超过7种颜色,不像真实照片那样,具有丰富的...
1391 0
|
C#
图像滤镜艺术---怀旧风格滤镜
原文:图像滤镜艺术---怀旧风格滤镜怀旧风格滤镜 本文介绍一款怀旧风格滤镜特效的代码实现,这个滤镜效果跟前面我们介绍的老照片滤镜效果相比,听起来感觉没太大差,实际上老照片不仅 有怀旧的风格,更多了一些怀旧的痕迹,比如照片的褶皱,裂纹等等,而怀旧风格,只是一种发黄的颜色风格而已。
1134 0