Skip to content

glCoding/Gorgeous.JS

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

# Gorgeous.JS #

Gorgeous.JS是一个基于Canvas的图像处理库,它可以直接在浏览器中操作图像,内置多种滤镜,还可以方便地添加自定义效果。

您可以点击这里查看Test和Demo。

已有特性

  • 滤镜效果:支持多种平滑、锐化、边缘检测等基础操作,内置多种常用滤镜;
  • 图像存储:支持直接使用Canvas进行绘制,也可输出为HTML的 <img> 方便用户保存;
  • 方便扩展:所有的处理操作都可以注册别名,支持中文命名,而且可以方便地添加自定义滤镜;

计划中特性

  • 空间操作:支持图片的旋转、缩放等空间操作;
  • 图片叠加:支持图片叠加方法以及透明度运算;
  • 频域操作:支持傅里叶变换,可以在频域对图片进行处理。

Demo

//注册自定义效果“灰色浮雕”为组合使用“Emboss”和“gray”两种效果
g.register('灰色浮雕', ['Emboss'], ['gray']);

//加载图片并进行处理
g.loadImage('img/baboon.png', function (oimg) {
    var imd = new g.ImageData(oimg);
    imd.use('灰色浮雕').getImage(function (rimg) {
        //展示处理前后的图像
        document.body.appendChild(oimg);
        document.body.appendChild(rimg);
    });
})

效果如下:

原始图像 处理后的图像


Github地址:https://github.com/Foolyou/Gorgeous.JS

邮箱: chen-an@outlook.com

知乎: @陈安


开始使用Gorgeous.JS

##开胃菜##

  1. 这里获取Gorgeous.JS,也可以在Github Repo获取完整的仓库,执行npm run build(需要node.js环境)之后在build目录下获取gorgeous.min.js。

  2. 建立GorgeousStart目录,结构如下:

        GorgeousStart
            |--lib
                |--gorgeous.min.js
            |--img
                |--baboon.png
            |-index.html
    

    将gorgeous.min.js放入lib目录下,测试图片baboon.png放入img目录下。

  3. 编辑index.html如下:

<title>Gorgeous Start</title>

Gorgeous 开胃菜

<script src="lib/gorgeous.min.js"></script> <script> //记得先将gorgeous命名空间简记为g,方便后续使用 var g = gorgeous; var src = 'img/baboon.png';
		//载入大猩猩图片并使用它创建g.ImageData对象
		g.ImageData(src, function (imd) {
			//将图像灰度化并显示出来
			imd.use('gray').getImage(function (img) {
				document.body.appendChild(img);
			});
			//对灰度化后的图片进行直方图均衡化提高对比度
			imd.use('equalize').getImage(function (img) {
				document.body.appendChild(img);
			});
		});			
	</script>
</body>
```

打开index.html网页,可以看到如下两幅图:

灰度化 直方图均衡化

创建g.ImageData对象

在上面的代码中,我们使用图片源地址来初始化g.ImageData对象。实际上在Gorgeous里,一共有六种方式可以创建g.ImageData对象:

  1. 使用图片源地址

    g.ImageData({string}, {function ({g.ImageData})})

    如上,向g.ImageData()传入两个参数,一个字符串src存储着图片源地址,以及一个回调函数callback,callback接受一个指向创建好的g.ImageData对象的参数imd。当图片加载成功,g.ImageData初始化完毕时,callback就会被调用。

    Example:

    g.ImageData('img/baboon.png', function (imd) {
        //Do someting with imd.
    });
    
  2. 使用加载好的<img>

    g.ImageData({Image})

    向构造函数传入一个Image对象,函数将返回一个指向创建好的g.ImageData对象的引用。

    Example:

    //获取Image对象img的代码
    //...
    var imd = g.ImageData(img);
    //Do something with imd
    

    Gorgeous提供了函数g.loadImage({string}, {function ({Image})})方便图片的动态加载。 Example:

    g.loadImage('baboon.png', function (img) {
        var imd = g.ImageData(img);
        //Do something with img and imd.
    });
    
  3. 使用HTMLCanvasElement对象

    g.ImageData({HTMLCanvasElement})

    Gorgeous提供了g.makeCanvasContext(width, height)函数来创建Canvas,这个函数会返回一个CanvasRenderingContext2D对象ctx,你可以用ctx.canvas来获取HTMLCanvasElement。

    Example:

    //获取Canvas对象canvas的代码
    //...
    var imd = g.ImageData(canvas);
    //Do something with imd
    
  4. 使用CanvasRenderingContext2D对象

g.ImageData({CanvasRenderingContext2D})

  1. 使用由Canvas获取的原生ImageData对象

g.ImageData({ImageData})

  1. 使用已有的g.ImageData对象(相当于整体拷贝)

g.ImageData({g.ImageData})

以上方式都会返回一个创建好的g.ImageData对象,你可以自由选择是否使用new运算符。实际上使用new来创建新对象会减少一次函数调用,但是一般来说这并不会带来多少性能提升,所以不必在意。

使用滤镜效果

创建好g.ImageData对象之后,就可以使用use()方法对图像进行操作了。 g.ImageData.prototype.use({string}, ...)

use()方法接受一个字符串参数作为要使用的滤镜效果名称, 并将剩余参数传递给该滤镜。处理结束后该方法将返回原对象方便进行链式调用。 例如, imd.use('mosaic', 10, 10);将调用'mosaic'滤镜, 为图像打上10x10的马赛克。

滤镜名称将会被转为小写, 首尾空格都会被去掉, 同时字符间空格都会被缩减为一个, 例如'gaussian blur'与' Gaussian   Blur '是等价的, 你可以放心使用。

use()方法还可以接受一系列的数组, 数组中第一项是滤镜名称, 后面的项是相应的参数。 imd.use(['gaussian blur', 5], ['gray'])会先对图片进行高斯模糊, 然后对它进行灰度化。

注册新的滤镜效果

g.register()函数支持添加自定义滤镜效果、 为滤镜添加别名以及滤镜组合功能。

  1. 自定义滤镜

    1. 添加掩模

    g.register({string}, {Array}, {number}, {number}, {number}, {number})

    第一个参数是滤镜名称, 第二个参数是掩模矩阵(你需要将之向量化) ,第三、四个参数分别为width和height, 代表掩模的宽高; 第四个参数factor表示矩阵乘的因子(默认为1), 第五个参数bias是对卷积结果的偏置(默认为0)。

    例如

    g.register('平均值滤波', [
      1, 1, 1,
      1, 1, 1,
      1, 1, 1
    ], 3, 3, 1/9);
    

    将建立一个均值滤波器。

    1. 添加处理函数

      g.register({string}, {function (...)})

      同样, 第一个参数是滤镜名称, 而第二个参数是一个用来处理图像的函数, 当使用imd.use()方法调用这个滤镜时, Gorgeous会以imd为this调用这个函数, 并把其他参数一并传给函数。具体的处理函数写法请参考开发者手册。

  2. 别名

    g.register({string}, {string})

    这会将第一个参数定义的滤镜绑定到以第二个参数为名的滤镜上。如g.register('马赛克', 'mosaic')将会使滤镜'马赛克'成为'mosaic'的别名。

  3. 滤镜组合

    g.register({string}, [{string}, ...], [{string}, ...], ...)

    即使现有的滤镜可以满足你的需求, 每次都要使用一串use()来调用它们仍显得很麻烦。 这时你就可以使用上面的形式来将一系列滤镜操作统一为一个滤镜。 例如:g.register('灰色马赛克浮雕', ['gray'], ['mosaic', 8, 8], ['emboss'])

Tips:

  1. 自定义滤镜时最好使用如下命名格式 '命名空间.滤镜名称', 以防止意外覆盖Gorgeous自带滤镜。

  2. g.register()以及g.ImageData.prototype.use()未来会添加直接在字符串中提供参数的功能, 可能会用到$#^等特殊字符, 因此在滤镜命名时请不要使用这些符号。

滤镜列表

  1. 平滑

    名称 参数 效果
    blur 使图片模糊(尚不完善)
    Gaussian blur radius, repeat 使用box blur逼近高斯模糊,radius控制高斯分布的模糊半径(默认为5); repeat值默认为5, 此值越大越接近高斯模糊效果。
    Mean 均值滤波(尚不完善)
    Median radius 根据参数指定掩模半径进行中值滤波(去噪), radius默认为5
    Horizontal motion blur radius radius控制水平方向运动模糊程度, 默认为5
    Vertical motion blur radius radius控制垂直方向运动模糊程度, 默认为5
  2. 锐化

    名称 参数 效果
    sharpen 增强边缘
    Excessive sharpen 突出边缘
  3. 变形

    名称 参数 效果
    mosaic width, height 马赛克效果, 参数用来控制马赛克格子大小
    emboss 浮雕效果

About

A JavaScript Library for Digital Image Processing.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published