刚刚发布的 osgl 工具包 加入了一个新成员: org.osgl.util.Img
, 这个工具可以让你轻松自由地处理图像数据
图像数据输入
Img
工具采用 InputStream
来获取图像数据。
开场前,我们先看看这篇博客中用到的三个图片:img1
, img2
and img3
:
- img1
- img2
- img3
获得原始图像输入:
博客中我们将使用下面的工厂方法来获得需要的图像数据:
private static InputStream img1() {
URL url = ImgTest.class.getResource("/img/img1.png");
return IO.is(url);
}
private static InputStream img2() {
URL url = ImgTest.class.getResource("/img/img2.jpg");
return IO.is(url);
}
private static InputStream img3() {
return IO.is(ImgTest.class.getResource("/img/img3.png"));
}
1. 剪切
我们使用 img1
来做剪切实验,从 (30, 30)
到 (100, 100)
:
Img.crop(source(img1()))
.from(30, 30)
.to(100, 100)
.writeTo(new File("/tmp/img1_crop.gif"));
2. 缩放
Img
提供两种缩放方式:
2.1 缩放到给定的长宽:
Img.resize(source(img1()))
.to(100, 200)
.writeTo(new File("/tmp/img1_resize.png"));
2.2 按比例缩放:
Img.resize(source(img1()))
.to(2.0f)
.writeTo(new File("/tmp/img1_resize_x2.png"));
按比例缩小的例子:
source(img2())
.resize(0.5f)
.writeTo("/tmp/img2_resize_scale.png");
2.3 缩放到指定长宽值并保持长宽比例:
source(img1())
.resize(100, 200)
.keepRatio()
.writeTo(new File("/tmp/img1_resize_keep_ratio.png"));
3. 加水印
使用默认设置:
source(img1())
.watermark("CONFIDENTIAL")
.writeTo("/tmp/img1_watermark_def.png");
也可以配置水印的位置颜色等参数:
source(img1())
.watermark("CONFIDENTIAL")
.offsetY(-200)
.color(Color.DARK_GRAY)
.writeTo("/tmp/img1_watermark.png");
4. 翻转
Img
支持水平或者垂直翻转:
source(img1())
.flip()
.writeTo("/tmp/img1_flip_h.png");
source(img1())
.flipVertial()
.writeTo("/tmp/img1_flip_v.png");
5. 图像模糊:
使用不同模糊级别的效果:
source(img1()).blur().writeTo("/tmp/img1_blur_default.png");
source(img2()).blur(10).writeTo("/tmp/img2_blur_10.jpg");
source(img2()).blur(2).writeTo("/tmp/img2_blur_2.jpg");
source(img3()).blur(5).writeTo("/tmp/img3_blur_5.jpg");
6. 图像拼接
source(img2())
.appendWith(source(img3()))
.writeTo("/tmp/img_concat_2_3.png");
source(img2())
.appendTo(source(img3()))
.writeTo("/tmp/img_concat_3_2.png");
垂直拼接并不做比例校正:
source(img2()).appendWith(source(img1()))
.noScaleFix()
.vertically()
.writeTo("/tmp/img_concat_2_1.png");
拼接三张图片:
concat(source(img1()), source(img2()))
.appendWith(source(img3()))
.vertically()
.writeTo("/tmp/img_concat_123.png");
另一种拼接方式:
concat(source(img2()))
.with(source(img3()))
.vertically()
.appendWith(source(img1()))
.writeTo("/tmp/img_concat_231.png");
7. 使用管道来对图像进行多种加工:
source(img1())
.resize(300, 400)
.pipeline()
.crop(50, 50, 250, 350)
.pipeline()
.watermark("HELLO OSGL")
.writeTo("/tmp/img1_pipeline.png");
总结
本篇博客我们演示了如何使用 OSGL Img 工具来处理图像数据,包括:
- 剪切
- 缩放
- 水印
- 翻转
- 模糊
- 拼接
- 以及使用管道来进行多种操作
如果需要使用 OSGL Img 工具,可以在你的 pom.xml
文件中加入一下依赖:
<dependency>
<groupId>org.osgl</groupId>
<artifactId>osgl-tool</artifactId>
<version>${osgl-tool.version}</version>
</dependency>
当前 osgl-tool.version
是 1.8.1
.
特别提示
使用 act-1.8.3 或者 act-1.8.4 的不需要单独引入 osgl-tool 的依赖了
在 OSGL 开发艺术系列的下一篇中, 我们会介绍如何在 OSGL Img 框架中整合自定义图像处理器