原 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 条评论
登录 后参与评论

相关文章

来自专栏算法+

双边滤波算法的简易实现bilateralFilter

没怎么看过双边滤波的具体思路,动手写一写,看看能不能突破一下。 最后,感觉算法还是要分开 水平 与 垂直 方向进行分别处理,才能把速度提上去。 没耐性写下去了,...

4926
来自专栏码神联盟

人脸识别 | Java 实现 AI人工智能技术 - 人脸识别-附源码

一是这几天确实比较忙,工作是饭碗,不能砸了吧,不然康哥吃啥,孩子的奶粉又得买了。靠工资肯定不够奶粉啊,还得有自己的一些其他项目,您说对吧,另外还在总结《Spri...

3.9K7
来自专栏CDA数据分析师

翻译 | 简单而有效的EXCEL数据分析小技巧

介绍 我一直很欣赏EXCEL蕴藏的巨大能量。这款软件不仅具备基本的数据运算,还能使用它对数据进行分析。EXCEL被广泛运用到很多领域,例如:金融建模和商业预测。...

18110
来自专栏Golang语言社区

PhysX SDK物理引擎开发包使用及获取c++源码教程

PS: 社区目前正在预演MMO类型的大型3D 服务器架构(Go实现),PX首选作为物理引擎使用。

2023
来自专栏Python入门

python可视化神器——pyecharts库

pyecharts 是一个用于生成 Echarts 图表的类库。Echarts 是百度开源的一个数据可视化 JS 库。用 Echarts 生成的图可视化效果非常...

7435
来自专栏落影的专栏

使用AudioToolbox编码AAC

前言 使用VideoToolbox硬编码H.264 使用VideoToolbox硬解码H.264 这次在编码H.264视频流的同时,录制并编码AAC音频流。...

4077
来自专栏linjinhe的专栏

WiscKey:LSM-Tree 写放大优化WiscKey 简介WiscKey 带来的好处WiscKey 面临的问题和挑战参考文档

WiscKey 的提出,主要是为了优化 LSM-Tree 的写放大问题。此前已经有不少论文讨论过这个问题,如 LSM-trie 和 PebblesDB,但是大部...

1792
来自专栏PPV课数据科学社区

【工具】用R软件绘制中国分省市地图

【注】新版本的maptools包对很多函数进行了修改,对于修改的内容,文章中用红色的文字进行了说明。 鉴于最近有不少人在讨论用R软件绘制地图的问题,我也就跟着凑...

4329
来自专栏何俊林

MediaCodec进行音频合成

4143
来自专栏CDA数据分析师

实战案例 | 使用机器学习和大数据预测心脏病

大数据和机器学习的组合是一项革命性的技术,如果以恰当的方式使用它,它可以在任何工业上产生影响。在医疗保健领域,它在很多情况下都有重要的使用,例如疾病检测、找到流...

4666

扫码关注云+社区