在 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");