图像柔光效果(SoftGlow)的规律及其实现。

by admin on 2018年12月18日

1. 安装nodejs

  • 去 https://nodejs.org/en/下载安装文件安装即可。

  • 安完成后,在巅峰输入node -v回车打印出nodejs的本子号,表达nodejs安装成功。

  • 每当终极输入npm -v
    扭曲车打印出npm的本子号,表明npm也安成功(node安装包着已经购并了npm,由此于安装nodejs的同时为安装了npm)。

  • 这里推荐用nvm安装。附上链接地址
    http://www.cnblogs.com/yesyes/p/7403184.html

  图像柔光效果在成千上万商业软件中都暴发落实,比如美图秀秀,光影魔术手等。其能对老图像发同样可新的比坦荡感觉光线较和的效用,给丁一如既往种朦胧美,如下面几乎帧图所示:

2. 设置npm

由于哲学原理,https://www.npmjs.com每当境内看不稳定,由此提出以国内镜向站点https://npm.taobao.org
具体方法如下:

夫当windows下找到了npmrc。 mac下小还无找到。

          哲学原理 1       
  哲学原理 2       
 哲学原理 3     
 哲学原理 4

3. 安装gulp(全局)

  • 在巅峰输入npm install gulp -g

  • 安完成后,同样输入gulp -v输出相应的版本号,则证实安装成功。

时至前日gulp安装好


     
方今,关于该算法的可控参数,美图秀贡士供了一个档次(0-100%)控制量,其算法调节的效能以及增幅都比小,光影魔术手有柔化程度和高光柔化多只参数,其中柔化程度决定柔化的不明效果,高光柔化调节图像的亮度。
还有一些开源之软件假设Imagestone、paint.net、gimp也生softglow算法,他们都提供了3只控制量:半径、亮度、相比较度(锐度),其中Imagestone其实是翻译的gimp的算法,而GIMP和paint.net的算法在基本原理上是平等的,细节及有着区别而已。

4. 布置项目

下边为一个略案例来做示范:创一个gulp文件夹作为项目根本目录,项目结构如下:!
哲学原理 5
俺们坐常用之 gulp-uglify、gulp-concat、gulp-minify-css为例。
率先配置package.json文件,有三栽办法:

  • 可就此记事本之类的创立一个

  • 用npm init建

  • 呢得复制在此之前项目之创设好的package.json

我们就此npm init 的点子来创建package.json
在极端以当前目录切换来路所当目,然后输入npm init,一路回车,最后以档次根本目录下生成package.json:

{
  "name": "gulp_test", /*项目名,切记这里命名不要与模块一样,如命名为gulp,要地安装gulp时就会出错*/
  "version": "1.0.0", /*版本号*/
  "description": "", /*描述*/
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "", /*作者*/
  "license": "ISC" /*项目许可协议*/
}

注是自我自己加的,npm
init生成是尚未注释的,而且json文件为无帮助注释,那点得留心!

   
 我们以paint.net的贯彻过程也例举办认证,在paint.net的源代码中,GlowEffect.cs为促成该效用的文书,我抽取其有源代码简要表达下这多少个算法的进程。

5. 地点安装gulp及gulp插件

        public GlowEffect()  : base(StaticName, StaticImage, null, EffectDirectives.None, true)
        {
            this.blurEffect = new BlurEffect();
            this.bcAdjustment = new BrightnessAndContrastAdjustment();
            this.screenBlendOp = new UserBlendOps.ScreenBlendOp();
        }

地面安装gulp

npm install gulp --save-dev

装到位后,我们再拘留项目受到的扭转:
如图:

  1. gulp模块下充斥及路蒙之node_modules文件夹着。

  2. package.json中写副了devDependencies字段,并以拖欠字段下填充了gulp模块名

–svae-dev 的意向就是是拿刚刚安装之模块写副package.json中。

哲学原理 6

世家或许会晤觉得小意想不到,刚不是安装了gulp吗?对,这是大局安装,为底是能当端终运行gulp任务的,这里是路级别之装置,真正的gulp模块安装及项目标node_modules/下了,前面的插件都是依赖gulp模块的。

     以及代码有:

地点安装gulp插件

接下去安装者提到的老两只插件,在终点中输入
npm install --save-dev gulp-uglify gulp-concat gulp-minify-css
装好,如下图

哲学原理 7

   public override unsafe void Render(
            EffectConfigToken parameters, 
            RenderArgs dstArgs, 
            RenderArgs srcArgs, 
            System.Drawing.Rectangle[] rois, 
            int startIndex, 
            int length)
        {
            // First we blur the source, and write the result to the destination surface
            // Then we apply Brightness/Contrast with the input as the dst, and the output as the dst
            // Third, we apply the Screen blend operation so that dst = dst OVER src

            ThreeAmountsConfigToken token = (ThreeAmountsConfigToken)parameters;

            AmountEffectConfigToken blurToken = new AmountEffectConfigToken(token.Amount1);
            this.blurEffect.Render(blurToken, dstArgs, srcArgs, rois, startIndex, length);

            BrightnessAndContrastAdjustmentConfigToken bcToken = new BrightnessAndContrastAdjustmentConfigToken(token.Amount2, token.Amount3);
            this.bcAdjustment.Render(bcToken, dstArgs, dstArgs, rois, startIndex, length);

            for (int i = startIndex; i < startIndex + length; ++i)
            {
                Rectangle roi = rois[i];

                for (int y = roi.Top; y < roi.Bottom; ++y)
                {
                    ColorBgra* dstPtr = dstArgs.Surface.GetPointAddressUnchecked(roi.Left, y);
                    ColorBgra* srcPtr = srcArgs.Surface.GetPointAddressUnchecked(roi.Left, y);

                    screenBlendOp.Apply(dstPtr, srcPtr, dstPtr, roi.Width);
                }
            }
        }

6. 创建gulpfile.js文件

在列根本目录下创办gulpfile.js文件,然后编写如下代码,这多少个代码没什么好讲的,具体可以参见gulp的api

/*引入gulp及相关插件 require('node_modules里对应模块')*/
var gulp = require('gulp');
var minifyCss = require("gulp-minify-css");
var uglify = require('gulp-uglify');
var concat = require('gulp-concat');
//压缩
gulp.task('minify-css', function () {
    gulp.src('css/*.css')
        .pipe(minifyCss())
        .pipe(gulp.dest('dist/css/'));
});
//
gulp.task('script', function () {
    gulp.src(['src/a.js',"src/b.js"])
        .pipe(concat('all.js'))
        .pipe(uglify())
        .pipe(gulp.dest('dist/js'));
});
gulp.task('default',['minify-css','script']); 

事实上的花色必将没这样简单,想想我们一般无法对有几乎独文件操作,应该是针对相同批文件操作,这样的关系到文件匹配的问题了,暂时不开展了。

  
 由以上代码开首得出结论:他们是为高斯模糊和亮度比较度调节两独滤镜为根基,稍作混合即可。

7. 运行gulp

可以看出,我们当gulpfile.js创设了3独任务,其实是简单个,最终一个是统一者两单任务。
然后大家即便足以以巅峰来运转方面的作务了,在极限输入

gulp minify-css

运转结果而下图:在dist/css/目录下生成了大家减弱后底css文件。
哲学原理 8

      第一步:备份原始图像;

8. 用webStrom运行

顶即为到,咱们基本明白gulp在档次受到的下了,只少基本流程是从未问题了。可是,时刻以极限依然有点好之,上边咱们一直在webStrom中运行方面的gulp任务。
于webStrom中开拓gulpfile.js文件 》右键采用 Show Gulp Tasks
》Gulp面板上业已排有gulpfile.js创设的职责 》选中任务运行即可。
凡是无是雅便宜!

哲学原理 9

 

     
第二步:对原图像按指定的半径举行高斯歪曲;

小结

仿佛手续多,其实并未几步,我们是打零开如说于的重中之重是为了演示整个经过精晓其中的规律,对于一般用户来说,nodejs
npm应该早装好了。
其实咱们第一得开的如下:

  1. 创设package.json,上边大家用的 npm
    init方法,实际操作中我们一般是管在此之前创制好之package.json直接将过来,放到项目根目录下,然后
    npm install 一下,这样我们设用到之gulp插件自动就设置好了。

  2. 编辑gulpfile.js,gulp就这来api,我们常由此到的或者就这么些插件,所以大家了好编写一个gulpfile.js然后在是基础及改动一下哪怕进行了。

     
第三步:对模糊后底图像继续开展亮度和相比较度的调;

     
第四步:用原图像的备份数据通原始图像(经过上述二以及三处理后底图像)遵照Photoshop的滤色(Screen)形式开展夹。

     
关于滤色格局的鱼龙混杂算法这里大概的领取一下:  Blend = X + Y – X * Y / 255 ;
 其中X和Y分别表示基色和混合色,Blend表示结果色。

     
算法的源码可以参考我当地点说的几乎个开源之软件,当然这说不定需要您闹得的编程基础,毕竟这些软件之框架还相比较复杂。 

     
关于算法的施行进度好说唯有在乎第二步,因为亮度相比度的调试实际上是单查表的进程(PS的亮度比较度命其实如比较大家想像的复杂点的,这多少个有会再谈,也得参见阿发伯的博文http://blog.csdn.net/maozefa/article/details/4778934),而第四步其实为是得用查表的法来增速的(可是早晚假若为此平等号的道)。高斯模糊这么些科长谈的问题,在自所搜索了之网页遭到凡是尚未孰被来过一个完完全全的、完美的、执行进度以及指定半径无关的、可运行的VB或VC或JAVA程序源代码(一般都是叫有参考著作介绍)。我要好发其一点的代码,可是自己耶不愿意共享。真正暴发趣味之本人引进而失去摸GIMP的算法代码,在GIMP的整套源码系统,至少为有了三栽高斯模糊优化的代码,分别位居blur-gauss.c(给出了2种植:RLE及IIR优化代码)以及contrast-retinex.c中(代码特别简单),当然,那个代码假诺提取出还应当举行代码层面的整与优化。Paint.net也提供了高斯模糊函数,可是期实质并无是高斯模糊,而是同种用线性分布的权重函数代替恒值权重,可是大算法里面没有浮点运算,并且还留存比Paint.net里的代码快多纵执行时给半径无关的优化算法,而且该优化算法比另外真正的高斯模糊优化算法要及早1加倍多,而功效及别不特别,可视作实时性特别强的场合的备用算法。

 
  同样,提供个编译好之文书为起趣味研讨该算法的情人看效果:

 
  http://files.cnblogs.com/Imageshop/SoftGlow.rar

   哲学原理 10 

 

 ***************************笔者:
laviewpbt   时间: 2013.6.20    联系QQ:  33184777
 转载请保留本行信息*************************

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图