博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《Java数字图像处理:编程技巧与应用实践》——1.2 Java 2D API
阅读量:5942 次
发布时间:2019-06-19

本文共 3100 字,大约阅读时间需要 10 分钟。

本节书摘来自华章计算机《Java数字图像处理:编程技巧与应用实践》一书中的第1章,第1.2节,作者 贾志刚,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.2 Java 2D API

当Graphics向下转型为Grahpics2D时,Java 2D的图形绘制引擎得以访问,一个功能更加丰富的图形库呈现在读者眼前,它就是Java 2D API。如果你问笔者Java 2D与Swing有何关系,可以很认真地说,二者毫无瓜葛,Java通过引入Swing、Java 2D与Java 3D,极大地丰富了Java的图形功能,使应用程序接口更加完善,为各种可能的图形开发提供了可靠保证与全面支持,从而也使得学习Java图形方面的知识时不再那么无助了。下面来看一下Java 2D对图形支持与改进都包括了哪些:

  • 为显示设备与打印机提供统一的绘制引擎。
  • 一个广泛的几何形状支持。
  • 文档打印支持。
  • 可控制的绘制质量。
  • 增强的色彩支持。
  • 文字、形状、图像绘制检测。

1.2.1 基本的Java 2D图形绘制

Java 2D图形绘制支持的图形形状如图1-1所示。

screenshot

Java 2D图形绘制最常见的是将绘制代码放在paintComponent(Graphics g)方法中,显示时Swing会首先调用paint()方法。该方法会调用下面的三个方法:

  • paintComponent(Graphics g)
  • paintBorder(Graphics g)
  • paintChildren(Graphics g)

在绝大多数情况下,图形绘制只需要重载paintComponent()方法来实现。一个基本图形绘制代码如下:

public void paintComponent(Graphics g){    Graphics2D g2d = (Graphics2D)g;    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,         RenderingHints.VALUE_ANTIALIAS_ON);         //反锯齿    g2d.setPaint(Color.BLUE);         // 设置画笔颜色    g2d.drawRect(10, 10, 50, 50);     // 绘制矩形    g2d.dispose();             // 释放资源}

1.2.2 使用Java 2D实现太极图形绘制

太极在中国源远流长,黑白相间的太极图案已经是一个文化标志,这里将使用Java 2D的图形绘制技术实现太极图案的绘制。如果仔细观察太极图案,就会发现它是非常精准的黑白对称图案。可通过设置画笔颜色来实现黑白颜色控制,利用Java 2D Area对图形布尔操作的支持实现太极图形绘制。Java 2D Area对图形Shape对象进行支持的四种布尔操作如下。

  • Union(加操作):保留两个几何形状及其重叠部分。
  • Subtraction(减操作):从第一个几何形状减去与第二个几何形状重叠的部分。
  • Intersection(可以看成与操作):只保留两个几何形状重叠的部分。
  • Exclusion-or(XOR异或操作):保留两个几何形状不重叠的部分。

这四种操作的示意图如图1-2所示。

screenshot

实现太极图案的相关代码如下:

protected void paintComponent(Graphics g) {      Graphics2D g2 = (Graphics2D)g;      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,                    RenderingHints.VALUE_ANTIALIAS_ON);      // R = 150      Shape lefthalfCirle = new Ellipse2D.Double(10,10, 300,300);    // R = 150        Shape righthalfCircle = new Ellipse2D.Double(10,10, 300,300);      // R/2 = 75         Shape innerCircle1 = new Ellipse2D.Double(85,10, 150,150);      // R = 150      Shape innerCircle2 = new Ellipse2D.Double(85,160, 150,150);     Shape rectangel1 = new Rectangle2D.Double(160, 10, 150, 300);      Shape rectangel2 = new Rectangle2D.Double(10, 10, 150, 300);            Area left = new Area(lefthalfCirle);      Area right = new Area(righthalfCircle);            Area area11 = new Area(rectangel1);      Area area22 = new Area(rectangel2);            left.subtract(area11);      right.subtract(area22);            Area inner1 = new Area(innerCircle1);      Area inner2 = new Area(innerCircle2);            left.add(inner1);      right.add(inner2);        // trick is here !!!     right.subtract(inner1);                  // create minor circle here!!!  // ++ 60, R = 150     Shape minorWhiteCircle = new Ellipse2D.Double(150,70, 20,20);       Shape innerBlackCircle = new Ellipse2D.Double(150,230, 20,20);            // draw two big frame shape here...      g2.setPaint(Color.WHITE);      g2.fill(left);      g2.setPaint(Color.BLACK);      g2.fill(right);            // draw minor circle here!!!      g2.fill(minorWhiteCircle);      g2.setPaint(Color.WHITE);      g2.fill(innerBlackCircle);  }

运行源文件中第1章中的完整代码可以看到一个标准的太极图案。

书中所有完整的源代码均已打包上传至www.hzbook.com和github,下载后按章节索引即可找到相应的代码,强烈建议运行每个源代码实例,将源代码看成本书的一部分。

转载地址:http://uyhtx.baihongyu.com/

你可能感兴趣的文章
数值积分中的辛普森方法及其误差估计
查看>>
Web service (一) 原理和项目开发实战
查看>>
跑带宽度多少合适_跑步机选购跑带要多宽,你的身体早就告诉你了
查看>>
广平县北方计算机第一届PS设计大赛
查看>>
深入理解Java的接口和抽象类
查看>>
java与xml
查看>>
Javascript异步数据的同步处理方法
查看>>
iis6 zencart1.39 伪静态规则
查看>>
SQL Server代理(3/12):代理警报和操作员
查看>>
基于事件驱动的DDD领域驱动设计框架分享(附源代码)
查看>>
Linux备份ifcfg-eth0文件导致的网络故障问题
查看>>
2018年尾总结——稳中成长
查看>>
JFreeChart开发_用JFreeChart增强JSP报表的用户体验
查看>>
度量时间差
查看>>
通过jsp请求Servlet来操作HBASE
查看>>
crontab执行shell脚本日志中出现乱码
查看>>
Shell编程基础
查看>>
Shell之Sed常用用法
查看>>
3.1
查看>>
校验表单如何摆脱 if else ?
查看>>