图像滤镜艺术---保留细节的磨皮之C#程序实现

上一篇博文“保留细节的磨皮滤镜之PS实现”一文中。我简介了本人自己总结的一种非常easy的磨皮滤镜,这个滤镜在磨光皮肤的同一时候,会保留非常不错的细节,今天,我将介绍使用C#程序实现这个磨皮的过程。

这里,我们相同是使用ZPhotoEngine库来实现,毕竟这个库中实现的效果跟PS是差点儿一模一样的。关于下载地址,文章最后会给出。废话不多说了,磨皮过程例如以下:

一。对原图的副本a运行表面模糊,半径15;

二。对原图运行高反差保留,半径1.0。

三。对高反差结果与原图做线性光图层处理,50%透明度就可以;

依据以上三步,我的磨皮类主要代码例如以下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;

namespace TestDemo
{
    unsafe class ImageFilter
    {
        ZPhotoEngineDll zp = new ZPhotoEngineDll();
        public Bitmap SoftSkinFilter(Bitmap src, int blurRadius)
        {
            //表面模糊图层
            Bitmap a = zp.SurfaceBlur(src, 28, blurRadius);
            //高反差图层
            Bitmap highPass = zp.HighPassProcess(src, 1.0f);
            BitmapData srcData = a.LockBits(new Rectangle(0, 0, a.Width, a.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
            BitmapData dstData = highPass.LockBits(new Rectangle(0, 0, highPass.Width, highPass.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
            byte* p = (byte*)srcData.Scan0;
            byte* dstP = (byte*)dstData.Scan0;
            int offset = srcData.Stride - a.Width * 4;
            int temp = 0;
            for (int j = 0; j < a.Height; j++)
            {
                for (int i = 0; i < a.Width; i++)
                {
                    ////////////////Process image...
                    //线性光图层混合
                    temp = zp.ModeLinearLight(p[0], dstP[0]);
                    //透明度50%
                    dstP[0] = (byte)((p[0] + temp) >> 1);
                    temp = zp.ModeLinearLight(p[1], dstP[1]);
                    dstP[1] = (byte)((p[1] + temp) >> 1);
                    temp = zp.ModeLinearLight(p[2], dstP[2]);
                    dstP[2] = (byte)((p[2] + temp) >> 1);
                    dstP += 4;
                    p += 4;
                }
                dstP += offset;
                p += offset;
            }
            a.UnlockBits(srcData);
            highPass.UnlockBits(dstData);
            return highPass;
        }

    }
}

界面部分主要代码例如以下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Imaging;

namespace TestDemo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        #region  变量声明
        //图像路径
        private String curFileName = null;
        //当前图像变量
        private Bitmap curBitmap = null;
        //原始图像变量
        private Bitmap srcBitmap = null;
        //
        ImageFilter imfilter = new ImageFilter();
        #endregion

        #region  图像打开保存模块
        //打开图像函数
        public void OpenFile()
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "全部图像文件 | *.bmp; *.pcx; *.png; *.jpg; *.gif;" +
                   "*.tif; *.ico; *.dxf; *.cgm; *.cdr; *.wmf; *.eps; *.emf|" +
                   "位图( *.bmp; *.jpg; *.png;...) | *.bmp; *.pcx; *.png; *.jpg; *.gif; *.tif; *.ico|" +
                   "矢量图( *.wmf; *.eps; *.emf;...) | *.dxf; *.cgm; *.cdr; *.wmf; *.eps; *.emf";
            ofd.ShowHelp = true;
            ofd.Title = "打开图像文件";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                curFileName = ofd.FileName;
                try
                {
                    curBitmap = (Bitmap)System.Drawing.Image.FromFile(curFileName);
                    srcBitmap = new Bitmap(curBitmap);
                }
                catch (Exception exp)
                { MessageBox.Show(exp.Message); }
            }
        }
        //保存图像函数
        public void SaveFile()
        {
            SaveFileDialog sfd = new SaveFileDialog();
            sfd.Filter = "PNG文件(*.png)|*.png";
            if (sfd.ShowDialog() == DialogResult.OK)
            {
                pictureBox1.Image.Save(sfd.FileName, ImageFormat.Png);
            }

        }
        //打开图像
        private void openBtn_Click(object sender, EventArgs e)
        {
            OpenFile();
            if (curBitmap != null)
            {
                pictureBox1.Image = (Image)curBitmap;
            }
        }
        //保存图像
        private void saveBtn_Click(object sender, EventArgs e)
        {
            if (pictureBox1.Image != null)
                SaveFile();
        }
        #endregion

        //确定
        private void okBtn_Click(object sender, EventArgs e)
        {
            if (pictureBox1.Image != null)
            {
                int radius =  Convert.ToInt32(textBox1.Text.ToString());
                if (radius >= 0 && radius <= 20)
                {
                    pictureBox1.Image = (Image)imfilter.SoftSkinFilter(curBitmap, radius);
                }
            }
        }

    }
}

程序界面例如以下:


最后,放上效果图:

原图                                                                                  C#程序效果图

PS效果图

大家能够对照一下,PS效果跟本文实现效果是一模一样的,区别差点儿是肉眼看不到的呵呵。

最后,放上一些下载连接:

1,ZPhotoEngine库下载连接:点击打开链接

2,磨皮代码DEMO免费下载连接:点击打开链接

时间: 2024-09-30 00:20:13

图像滤镜艺术---保留细节的磨皮之C#程序实现的相关文章

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

目前,对于人物照片磨皮滤镜,相信大家没用过也听过吧,这个滤镜的实现方法是多种多样,有难有简,有好有差,本人经过长时间的总结,得出了一种最简单,效果又不失细节与真实感的方法,对于这个方法,本人将先介绍它的PS实现,在下一篇博客中,我们将具体介绍它的C#代码实现. PS实现过程如下: 1,打开人物图像,复制图层,命名为"HighPass": 2,对HighPass执行"滤镜-表面模糊",半径-15即可,这里可以根据具体图像,适当调整半径大小: 3,复制原始图层,命名为&

图像滤镜艺术--编码基础(Photoshop基础变换的代码实现)

自从上一篇博客写完之后,到现在已经有段时间了,这段时间不是不想接着写,只是想做的更好了在写出来给大家看呵呵. 今天,我将给大家介绍制作图像滤镜的基础,也就是PS中的基本命令如何用代码实现,这里包括各种混合图层,去色命令,亮度对比度调整,饱和度调整以及曲线调整等,这些命令都是最基础的,如果我们掌握了这些知识,那么,一些复杂的滤镜也就有稳定的根基了. 1,混合图层 PS中,混合图层是制作滤镜的必需品,他包括了正常模式,溶解模式,变暗模式,正片叠底,颜色加深,线性加深,深色模式,变亮模式,滤色模式,颜

图像滤镜艺术---(Sketch Filter)素描滤镜

(Sketch Filter)素描滤镜 素描滤镜的实现方法比较简单,这里我们直接写出算法过程如下: 1,对原图S进行去色命令得到灰度图A: 2,对A进行反色得到图像B: 3,对B进行高斯模糊得到图C: 4,将C与B进行颜色减淡的图层混合算法: P(x,y) = Pb(x,y) + (Pb(x,y)* Pc(x,y)) / (256 - Pc(x,y)); 在步骤3中,可以添加变量edgeIntensity(edgeIntensity>=0),来控制素描的边缘强度: 以上就是素描的算法实现. 核心

图像滤镜艺术---霓虹、浮雕、木刻滤镜

图像特效往往可以将普通的照片呈现出一种令人耳目一新的效果,特效的种类繁多,比如各种流行的 滤镜特效等等,今天,我们介绍几种最简单的滤镜:霓虹效果,浮雕效果和木刻效果. 1,霓虹滤镜 霓虹是用来描绘图像的轮廓,勾画出颜色变化的边缘,加强其过度效果,使图像产生轮廓发光的效果.主要原理是根据当前像素与其右方和下方像素的梯度运算,然后将结果值作为当前像素值,即将原图当前下像素的RGB分量与其右方和下方像素做梯度 运算(差的平方和平方根),然后将梯度值作为处理后的像素的RGB三个分量. 算法过程如下公式所

图像滤镜艺术---流行艺术风滤镜特效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图像转手绘特效实现方案

手绘效果实现方案 本文介绍一种PS手绘效果的实现方案,PS步骤来自网络,本文介绍代码实现过程. 整体看来,虽然效果还是有很大差异,但是已经有了这种特效的风格了,毕竟PS效果图中关于头发的部分是人工手动涂抹实现的,这一点,程序是无法自动实现的,这一点还需要大家理解. 本人实现的算法流程如下: 大家可以对照一下看看. 这里贴出图像转手绘效果的PS实现教程,这个教程如下(如果图片无法显示,请看点击打开链接): 先看效果: 原图 最终效果及局部细节 眼睛的处理,大家可以参考这篇教程:http://wei

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

微软最近退出了自家的美颜app,大家有兴趣可以在苹果商店中下载一下看一看,今天,我们要说的便是这款app中的所有滤镜实现问题. 这款app中一共有14款滤镜效果,分别是:自然.增强.1965.X-PRO.布兰登.沧桑.复古.凉爽.迈耶.清晨.柔嫩.深沉.水墨.糖果: 这14款滤镜中,"自然"这一款滤镜是结合人脸识别的,在有人脸识别的情况下,会弹出调节bar,没有人脸时,改效果为默认效果,无法调节:"增强"属于细节的增强与锐化,这里也不算入特效滤镜中去,对于剩下的12

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

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