更高级的方法

Nov 2, 2017 10:31:32 PM

作者:wendal, pangwu86(pangwu86@gmail.com)

所谓的高级

其实就是针对一些图片实际使用场景而封装的方法,因为生成结果是图片不方便验证结果,所以请自行肉眼判断

添加水印

添加位置默认提供9个选择:

  • Images.WATERMARK_TOP_LEFT
  • Images.WATERMARK_TOP_CENTER
  • Images.WATERMARK_TOP_RIGHT
  • Images.WATERMARK_CENTER_LEFT
  • Images.WATERMARK_CENTER
  • Images.WATERMARK_CENTER_RIGHT
  • Images.WATERMARK_BOTTOM_LEFT
  • Images.WATERMARK_BOTTOM_CENTER
  • Images.WATERMARK_BOTTOM_RIGHT
    例如:上面中间添加图片水印, 75%透明度,10像素边距
  1. img = Images.addWatermark(bgImg, watermarkImg, 0.75f, Images.WATERMARK_TOP_CENTER, 10);

效果如图:

更高级的方法 - 图1

生成文字

根据文字生成图片的小工具,文字会自动居中。

直接生成黑底白字

  1. img = Images.createText("随便写");

手动设置图片大小,文字/背景色,字体,字体样式, 字体大小等

  1. img = Images.createText("这是非常长的一句话,你可能会觉得真的有那么长吗,是的还是挺长的", 1100, 200, "#F00", "#FF0", "微软雅黑", 32, Font.PLAIN);

效果如图:

更高级的方法 - 图2

生成头像

根据文字生成图片的小工具,适用于一些生成头像的场景。这里根据文字长度做了一点限制,2字以内显示,超过只显示第一个文字。

直接生成黑底白字

  1. img = Images.createAvatar("王小二");

效果如图:

更高级的方法 - 图3

手动设置图片大小,文字/背景色,字体,字体样式, 字体大小等

  1. img = Images.createAvatar("小二", 256, "rgba(255,0,0,1)", "rgb(0,0,255)", "微软雅黑", 64, Font.ITALIC);

效果如图:

更高级的方法 - 图4

生成验证码

将指定的文字内容生成验证码。验证码的生成步骤如下:

  • 随机选择颜色与字体
  • 文字写入
  • 添加干扰线
  • 图像整体进行扭曲
    对于验证码内容,可以使用Nutz中Lang包提供的R.captchaNumber或R.captchaChar,也可以填入任意内容。

比如生成6位数字验证码:

  1. img = Images.createCaptcha(R.captchaNumber(6));

效果如下:

更高级的方法 - 图5

比如生成6位字符+数字验证码:

  1. img = Images.createCaptcha(R.captchaChar(6));

效果如下:

更高级的方法 - 图6

如果要生成其他字符的,比如中文,则需要手动指定字体名称,否者容易产生乱码:

  1. img = Images.Images.createCaptcha("胖五是好人", 0, 0, null, "#FFF", "微软雅黑");

效果如下:

更高级的方法 - 图7

也可以指定前后背景颜色,这样不会显得那么花哨了:

  1. img = Images.createCaptcha(R.captchaChar(10), 0, 0, "#000", "#FFF", null);

效果如下:

更高级的方法 - 图8

灰度图

变灰度图的原理就是将每个像素的RGB值设置成一样,这样整个图片只有黑白与中间的过渡色了。

  1. img = Images.grayImage(srcImg);

原图:

更高级的方法 - 图9

灰度图:

更高级的方法 - 图10

三原色通道

熟悉PS的同学应该知道通道这个概念, 这里提供了直接生成各个通道的图片的方法

更高级的方法 - 图11

通道的选项:

  • Images.CHANNEL_RED
  • Images.CHANNEL_GREEN
  • Images.CHANNEL_BLUE
  1. img = Images.channelImage(srcImg, Images.CHANNEL_RED);

红色通道图:

更高级的方法 - 图12

绿色通道图:

更高级的方法 - 图13

蓝色通道图:

更高级的方法 - 图14

正片叠底效果

这算是比较高级的图像处理了,PS中可以通过修改图层上的设置而达到效果。

具体的实现原理可以看下这个文章 《图层混合模式“正片叠底”颜色计算公式的详解》,讲的还算通俗。

下面这个图可以说是最佳示例了:

更高级的方法 - 图15

  1. img = Images.multiply(bgImg, itemImg, 0, 0);

使用场景么,一般可用于两张图片融合,比如给金将军加个太阳什么的

将军图:

更高级的方法 - 图16

太阳图:

更高级的方法 - 图17

正片叠底后的效果:

更高级的方法 - 图18

抠图方法1

通过指定背景像素,然后遍历像素后,在指定范围内的就当做背景然后设置为透明。

该方法适合背景与前景相差特别大的图片,最好是背景颜色基本一致,前景背景有明显分隔界限。

比如来个机器猫:

更高级的方法 - 图19

选区0,0像素当做背景即可,范围20

  1. img = Images.cutoutByPixel(srcImg, 0, 0, 20);

抠图后:

更高级的方法 - 图20

抠图方法2

通过指定某个通道或采用亮度作为透明的依据进行图片透明处理。

比如这个蓝色火焰与黑色背景融合在一起的图:

更高级的方法 - 图21

如果采用指定背景进行Cut,效果如下:

更高级的方法 - 图22

很明显,这样过渡区域的像素处理的很不自然。

通过亮度来抠图:

  1. img = Images.cutoutByLuminance(srcImg);

效果如图:

更高级的方法 - 图23

看上去好多了,但是蓝色被消除的太多了,再改用蓝色通道进行抠图:

  1. img = Images.cutoutByChannel(srcImg, Images.CHANNEL_BLUE);

效果如图:

更高级的方法 - 图24

该例子引用了 ~的星辰大海的这篇blog ,有兴趣看原理的可以了解下。

本页面的文字允许在知识共享 署名-相同方式共享 3.0协议GNU自由文档许可证下修改和再使用。

原文: http://nutzam.com/core/img/advanced.html