1. 概述

本教程将介绍几个主流的Java图像处理库,并演示如何实现基础图像操作——加载图片并在图片上绘制形状。我们将重点分析以下四个库:

  • ✅ AWT(及Swing)
  • ✅ ImageJ
  • ✅ OpenIMAJ
  • ✅ TwelveMonkeys

这些库各有特点,从基础图形操作到专业图像处理都能覆盖。对于有经验的开发者来说,选择合适的库能避免重复造轮子,快速实现功能。

2. AWT图像处理

AWT是Java内置的图形库,无需额外安装。虽然它主要用于GUI开发,但也提供了基础的图像编辑能力。适合处理简单图像操作,但功能相对有限。

2.1 加载图像

通过BufferedImage类读取磁盘图片文件:

String imagePath = "path/to/your/image.jpg";
BufferedImage myPicture = ImageIO.read(new File(imagePath));

⚠️ 注意:文件路径需正确,否则会抛出IOException

2.2 编辑图像

使用Graphics2D对象绘制形状(比基础Graphics功能更强):

Graphics2D g = (Graphics2D) myPicture.getGraphics();
g.setStroke(new BasicStroke(3));  // 设置线条粗细
g.setColor(Color.BLUE);          // 设置颜色
g.drawRect(10, 10, myPicture.getWidth() - 20, myPicture.getHeight() - 20);

这里绘制了一个距离图片边框10像素的蓝色矩形框。

2.3 显示图像

通过Swing组件显示处理后的图像:

JLabel picLabel = new JLabel(new ImageIcon(myPicture));  // 创建图片标签
JPanel jPanel = new JPanel();                            // 创建面板
jPanel.add(picLabel);                                    // 添加标签到面板

JFrame f = new JFrame();                                 // 创建窗口
f.setSize(new Dimension(myPicture.getWidth(), myPicture.getHeight()));  // 设置窗口大小
f.add(jPanel);                                           // 添加面板到窗口
f.setVisible(true);                                      // 显示窗口

简单粗暴,但要注意窗口大小需手动设置,否则可能显示不全。

3. ImageJ专业图像处理

ImageJ是专为图像处理设计的Java库,比AWT更强大。它包含大量现成的图像处理算法,特别适合科研和复杂图像分析场景。

3.1 Maven依赖

pom.xml中添加依赖:

<dependency>
    <groupId>net.imagej</groupId>
    <artifactId>ij</artifactId>
    <version>1.51h</version>
</dependency>

最新版本可在Maven仓库查询。

3.2 加载图像

使用IJ类的静态方法加载图片:

ImagePlus imp = IJ.openImage("path/to/your/image.jpg");

3.3 编辑图像

通过ImageProcessor对象进行图像编辑(类比AWT的Graphics):

ImageProcessor ip = imp.getProcessor();
ip.setColor(Color.BLUE);    // 设置颜色
ip.setLineWidth(4);          // 设置线宽
ip.drawRect(10, 10, imp.getWidth() - 20, imp.getHeight() - 20);

3.4 显示图像

一行代码搞定显示:

imp.show();

比AWT简洁得多,底层已封装好窗口管理逻辑。

4. OpenIMAJ多媒体处理

OpenIMAJ是功能全面的多媒体处理库,不仅支持图像处理,还涵盖计算机视觉、机器学习等领域。适合需要多媒体综合处理能力的项目。

4.1 Maven依赖

添加核心图像处理依赖:

<dependency>
    <groupId>org.openimaj</groupId>
    <artifactId>core-image</artifactId>
    <version>1.3.5</version>
</dependency>

最新版本见官方仓库

4.2 加载图像

使用ImageUtilities读取多波段浮点图像(如RGB):

MBFImage image = ImageUtilities.readMBF(new File("path/to/your/image.jpg"));

MBF(Multi-Band Float)支持多种颜色表示方式,不限于RGB。

4.3 编辑图像

绘制矩形需要先定义多边形顶点(注意图像坐标系Y轴向下):

// 定义四个顶点
Point2d tl = new Point2dImpl(10, 10);
Point2d bl = new Point2dImpl(10, image.getHeight() - 10);
Point2d br = new Point2dImpl(image.getWidth() - 10, image.getHeight() - 10);
Point2d tr = new Point2dImpl(image.getWidth() - 10, 10);

// 创建多边形
Polygon polygon = new Polygon(Arrays.asList(tl, bl, br, tr));

// 绘制多边形(形状、线宽、RGB颜色值)
image.drawPolygon(polygon, 4, new Float[] { 0f, 0f, 255.0f });

4.4 显示图像

使用DisplayUtilities显示:

DisplayUtilities.display(image);

同样一行代码完成显示,封装了底层窗口创建逻辑。

5. TwelveMonkeys图像IO扩展

TwelveMonkeys是Java原生ImageIO的增强库,主要解决格式支持问题。原生Java仅支持5种格式(JPEG/PNG/BMP/WEBMP/GIF),而TwelveMonkeys扩展支持了ICO/TIFF/PSD等十几种格式。

核心优势

  • ✅ 无缝集成:代码与原生ImageIO完全一致
  • ✅ 按需加载:运行时自动注册插件
  • ✅ 格式丰富:支持ICO/TIFF/PSD等专业格式

使用示例

以读取ICO图标文件为例:

String imagePath = "path/to/your/image.ico";
BufferedImage myPicture = ImageIO.read(new File(imagePath));

Maven依赖

需添加对应格式的依赖(以ICO为例):

<dependency>
    <groupId>com.twelvemonkeys.imageio</groupId>
    <artifactId>imageio-bmp</artifactId>  <!-- ICO基于BMP格式 -->
    <version>3.3.2</version>
</dependency>
<dependency>
    <groupId>com.twelvemonkeys.imageio</groupId>
    <artifactId>imageio-core</artifactId>
    <version>3.3.2</version>
</dependency>

⚠️ 注意:必须添加imageio-core作为基础依赖,否则无法自动加载插件。

6. 总结对比

库名称 适用场景 优势 劣势
AWT 简单图像操作 Java内置,零依赖 功能基础,效率一般
ImageJ 专业图像处理/科研 算法丰富,社区活跃 学习曲线较陡
OpenIMAJ 多媒体综合处理 功能全面,支持机器学习 依赖较多,包体积大
TwelveMonkeys 特殊格式支持 无缝扩展原生API 仅解决IO问题

选型建议

  • 基础操作 → AWT足够
  • 专业图像处理 → ImageJ或OpenIMAJ
  • 特殊格式支持 → TwelveMonkeys
  • 综合需求 → OpenIMAJ + TwelveMonkeys组合

踩坑提醒:在处理图像坐标时,注意Y轴方向(向下为正),与数学坐标系相反。绘制形状时需调整坐标计算逻辑,避免位置错乱。


原始标题:Working with Images in Java | Baeldung

« 上一篇: JAXB指南