公章绘制
概述
使用场景
如果需要生成一个公章,但又不想通过三方付费生成公章,但生成的公章没有数字证书、时间戳、电子存证等一系列依据法律法规设定的电子签名技术的。
绘制思路
相关变量
private final static int CANVASSIZE = 508; // 画布大小(宽高)
private final static int BORDERWIDTH = 6;// 圆形边框宽度
private final static int FONTBASESIZE = 60;// 字体基础大小
private final static int RGB = 0xFF4141; // 文字颜色、边框颜色、五角星颜色
private final static int STARRADIO = 80; // 五角星长半径(中心点到顶点距离)
private final static String FONTFAMILYNAME = "FangSong_GB2312";//字体
private final static float ZOOMRADIO = 1.4f;//字体y轴缩放比例
private final static int ANGLE = MyAngleEnum.ANGLE_150.getAngle();//底部文字空白角度
1. 生成画布
●规定画布宽高都为a,然后创建一个BufferedImage对象,用于在内存中存储图像数据。然BufferedImage对象使用createGraphics()方法创建一个Graphics2D对象,Graphics2D提供了一系列绘制和变换方法,可以进行文字、图像、几何形状等元素的绘制。
int fontTextLen = companyName.length;
int fontSize = FONTBASESIZE - fontTextLen; // 动态设置大小
BufferedImage bufferedImage = new BufferedImage(CANVASSIZE, CANVASSIZE, BufferedImage.TYPE_4BYTE_ABGR);
RenderingHints hints = new RenderingHints(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
hints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);//其他图形抗锯齿
Graphics2D g2d = bufferedImage.createGraphics();
g2d.setRenderingHints(hints);
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC, 0));
g2d.fillRect(0, 0, CANVASSIZE, CANVASSIZE);
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC, 1));
g2d.setStroke(new BasicStroke(BORDERWIDTH));
g2d.setPaint(Color.decode(String.valueOf(RGB)));
2.绘制圆
●使用Graphics2D中的drawOval绘制椭圆的方法来绘制印章外圆。
●获取绘制圆的左上角的X坐标和左上角的Y坐标,假设圆形边框的宽度为b,绘制圆的左上角坐标就为(b/2,b/2),然后获取要绘制的圆的宽度和高度,因为是圆所以宽度和高度相等,宽高都为(a-b-1),因为精度问题所以多减一,然后使用Graphics2D中的drawOval方法进行绘制。
g2d.drawOval(BORDERWIDTH / 2, BORDERWIDTH / 2, CANVASSIZE - BORDERWIDTH - 1, CANVASSIZE - BORDERWIDTH - 1); // 由于计算精度问题,需要多减一。
3.绘制五角星
●基本公式(求旋转后点坐标公式)
在平面坐标上,任意点P(x1,y1),绕一个坐标点Q(x2,y2)旋转θ角度后,新的坐标设为(x, y)的计算公式:
x= (x1 - x2)*cos(θ) - (y1 - y2)*sin(θ) + x2 ;
y= (x1 - x2)*sin(θ) + (y1 - y2)*cos(θ) + y2 ;
●画布中心点为五角星中心点O,中心点O坐标为(a/2,a/2),五角星长半径(线段AO长度)为r
●计算五角星五个顶点坐标,先计算A点坐标,因为A点在O点正上方,可知A点坐标为(a/2,a/2-r),
原点O到五个顶点的距离都相等,因此可以使用点旋转公式求得其他角的坐标。角AOB,角BOC,角COD,
角DOE,角EOA都为2π/5,因此可以得出其余四个点相对于A点旋转的角度,然后带入公式求顶点坐标。