刚刚发布的 osgl 工具包 加入了一个新成员: org.osgl.util.Img
, 这个工具可以让你轻松自由地处理图像数据
图像数据输入
Img
工具采用 InputStream
来获取图像数据。
开场前,我们先看看这篇博客中用到的三个图片:img1
, img2
and 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 的依赖了