用了大半天的时间才把这个公章做好,个人感觉这里面需要比较多的数学知识,当然都是比较简单的了。
Graphics2D
根据API上的说法是,在使用Graphics2D类库的时候,这是进行操作的主要类,类似于提供了一种context。Graphics2D为抽象类,继承自Graphics类,所以在操作前,需要先获取一种可以操作的对象,然后再创建Graphics2D对象。
Graphics2D可以支持三种操作:图形操作(画各种图形,填充)、写文字、变换(比如旋转、切割等)
BufferedImage bi = new BufferedImage(canvasWidth, canvasHeight, BufferedImage.TYPE_INT_ARGB);//创建了bufferedImage对象,可以在最后保存为图片
Graphics2D g2d = bi.createGraphics();//创建Graphics2D对象
填充
填充图形时,首先要设置画笔,然后调用g2d对象的fill函数,如
g2d.setPaint(Color.WHITE);//设置画笔颜色
g2d.fillRect(0, 0, canvasWidth, canvasWidth);//填充区域,将区域背景设置为白色
除了fillRect外,还有很多其他填充方法,还有fill(Shape s),因此基本可以满足大多数需求。
画圆
再画圆的时候,首先要生成一个Shape对象,然后调用g2d.draw(shape)即可,因此,这里面如何生成Shape对象就很重要了。
可以看一下Shape类结构,shape是一个接口类,实现了众多实现类,比如Arc(弧度)、贝塞尔曲线、椭圆、线等等。这里我们要使用Arc,既然可以生成弧度,那么当然就可以生成圆。
g2d.setPaint(Color.red);//设置画笔
g2d.setStroke(new BasicStroke(5));//设置画笔的粗度
Shape circle = new Arc2D.Double(0,0,circleRadius*2,circleRadius*2,0,360,Arc2D.OPEN);//构造圆形,Arc2D为抽象类,Arc2D.double和Arc2D.float为它的具体实现类。
g2d.draw(circle);//OK,现在已经有了一个圆
画线
我们需要的是距离圆心上下等距的两条线。所以,这里我们要知道距离有多远,或者说线段的顶点与圆心的连线,如下图所示,这个夹角的大小,我称为lineArc(注意必须是弧度),根据这个角,我们就得到了上线段的两个顶点(radius-radius*sin(α),radius-radius*cos(α)),(radius+radius*sin(α),radius-radius*cos(α)),同理下线段的两个顶点也知道了。再然后调用drawLine即可,如果需要更改颜色,或者更改画笔,随时都可以通过set来更改。
double halfHeight = circleRadius * (Math.cos(lineArc));
double halfWidth = circleRadius * (Math.sin(lineArc));
g2d.drawLine((int)(circleRadius-halfWidth),(int)(circleRadius-halfHeight),(int)(circleRadius+halfWidth),(int)(circleRadius-halfHeight));//
g2d.drawLine((int)(circleRadius-halfWidth),(int)(circleRadius+halfHeight),(int)(circleRadius+halfWidth),(int)(circleRadius+halfHeight)
写字
写字看起来最简单,直接调用g2d.drawString()即可了,是的,是这样,但是又不仅仅如此,因为我们常常对这些字的格式有很高的要求。这得让我们仔细思考两个问题。
- 从哪里开始绘制?也就是说固定那个坐标,固定字的左上角ÿ