原 OSGL 工具库 - 图片处理的艺术之

OSGL 工具库 - 图片处理的艺术 中我们讲述了如何使用 OSGL Img 提供的 API 对图片进行各种加工处理, 包括

  • 剪切
  • 缩放
  • 加水印
  • 翻转
  • 图像模糊
  • 图像拼接
  • 使用管道来对图片进行多种加工

本文是讲述如何在 OSGL Img 处理框架中自定义图像处理器.

假设我们需要对图像进行暗化处理, 我们定义处理器代码如下:

public class Sunglass extends Img.Processor {
    private float alpha = 0.3f;

    Sunglass() {}
    Sunglass(float alpha) {this.alpha = alpha;}

    @Override
    protected BufferedImage run() {
        int w = sourceWidth;
        int h = sourceHeight;
        Graphics2D g = g();
        g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
        g.drawImage(source, 0, 0, w, h, null);
        return target;
    }
}

试用 Sunglass 处理器:

// style A
new Sunglass(0.7f)
        .process(img2())
        .pipeline()
        .resize(0.5f)
        .writeTo("/tmp/img2_sunglass_style_a.jpg");
// style B
source(img2())
        .resize(0.3f)
        .pipeline(new Sunglass())
        .writeTo("/tmp/img2_sunglass_style_b.png");

如果希望完美整合 Sunglass 到 OSGL Img 管道 API, 我们需要适配 Sunglass 到 OSGL Img 管道 API 框架中:

public class FluentSunglass extends Img.Processor<FluentSunglass, FluentSunglass.Stage> {

    public static class Stage extends Img.ProcessorStage<Stage, FluentSunglass> {
        public Stage(BufferedImage source, FluentSunglass processor) {
            super(source, processor);
        }
        public Stage alpha(float alpha) {
            processor.alpha = alpha;
            return this;
        }

        public Stage dark() {
            return alpha(0.3f);
        }

        public Stage light() {
            return alpha(0.7f);
        }

        public Stage darker() {
            return alpha(0.1f);
        }

        public Stage lighter() {
            return alpha(0.9f);
        }
    }

    float alpha;

    public FluentSunglass() {
        super();
    }

    @Override
    protected BufferedImage run() {
        return new Sunglass(alpha).source(source).run();
    }
}

试用 FluentSunglass 处理器:

// lighter
source(img2())
        .resize(0.3f)
        .pipeline(FluentSunglass.class)
        .lighter()
        .writeTo("/tmp/img2_f_sunglass_lighter.png");
// darker
source(img2())
        .resize(0.3f)
        .pipeline(FluentSunglass.class)
        .dark()
        .writeTo("/tmp/img2_f_sunglass_darker.png");

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据小魔方

一点儿建议、一枚彩蛋~~~

这段时间写了太多的教程,感觉自己都写烦了,不知道大家看的烦不烦,今天没有教程,写一点儿心得总结下这段时间以来的经验和体会,顺便介绍一款图表插件,也将是小魔方下一...

3435
来自专栏张善友的专栏

Windows Phone 7 实战第二天 二维码QRcode

越来越多的收据具备自动对焦的拍摄功能,这也意味着这些手机可以具备条码扫描功能,手机具备条码扫描功能,可以优化购物流程,快速存储电子名片(二维码)等。 QR 码是...

22110
来自专栏一名叫大蕉的程序员

震惊!无人问津的文章竟然是这样写出来的No.98

1102
来自专栏北京马哥教育

Python自动生成表情包,Python在手,从此斗图无敌手!

作为一个数据分析师,应该信奉一句话——"一图胜千言"。不过这里要说的并不是数据可视化,而是一款全民向的产品形态——表情包!!!!

844
来自专栏IT派

一个很皮的实践 Python自动生成表情包

作为一个数据分析师,应该信奉一句话----"一图胜千言"。不过这里要说的并不是数据可视化,而是一款全民向的产品形态----表情包!!!!

1090
来自专栏拂晓风起

cocos2d-js 和 createjs 性能对比(HTML5)

1254
来自专栏极客猴

Python 绘图,我只用 Matplotlib(二)

上篇文章,我们了解到 Matplotlib 是一个风格类似 Matlab 的基于 Python 的绘图库。它提供了一整套和matlab相似的命令API,十分适合...

481
来自专栏周明礼的专栏

Threejs 快速入门

在什么都是3D,看电影3D,打游戏3D,估计3D打车,很快就会面世。那么作为前端开发的标准语言,JS和3D能不能也搞出点大新闻呢?刚好最近在做一个活动时,就遇到...

2.5K1
来自专栏程序你好

.Net 基于GDI+的图件绘制平台的设计与实现(一)

732
来自专栏数据小魔方

图表美化教程|图案与形状填充

今天跟大家分享简单的信息图制作方法——形状/图案填充法。 ▽▼▽ 今天教大家简单的图表形状填充。 ●●●●● 首先是一个已经做好的柱形图。 ? 每天都看着这样的...

2746

扫码关注云+社区