`
张国锋
  • 浏览: 57902 次
  • 性别: Icon_minigender_1
  • 来自: 山东青岛
社区版块
存档分类
最新评论

印章工具

    博客分类:
  • Java
阅读更多
package com.test;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Polygon;
import java.awt.RenderingHints;
import java.awt.Stroke;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

/**
 * 印章类.保存印章必须的参数和绘制方法.
 * 
 * @author i2534
 * 
 */
public class Seal {
	/**
	 * 印章名称距中心点偏移量,按照y轴方向
	 */
	private int nameOffset = 50;
	/**
	 * 印章宽度
	 */
	private int width = 230;
	/**
	 * 印章高度
	 */
	private int height = 230;
	/**
	 * 印章中心标志(默认为五角星)外接圆半径
	 */
	private float radius = 30;
	/**
	 * 印章所属单位的起始角度,以6点钟方向为中心,向两个方向平均扩展
	 */
	private float firmAngle = 120;
	/**
	 * 印章名称
	 */
	private String name = "支付成功";
	/**
	 * 印章名称颜色
	 */
	private Color nameColor = Color.RED;
	/**
	 * 印章所属单位
	 */
	private String firm = "财务支付专用章";
	/**
	 * 印章所属单位颜色
	 */
	private Color firmColor = Color.RED;
	/**
	 * 印章名称字体信息
	 */
	private Font nameFont = new Font("宋体", Font.PLAIN, 16);
	/**
	 * 印章所属单位字体信息
	 */
	private Font firmFont = new Font("宋体", Font.PLAIN, 24);
	/**
	 * 单位字体的宽度缩放比率(百分比).此参数可以使字体看起来瘦长
	 */
	private float firmScale = 1.0F;
	/**
	 * 边框线宽
	 */
	private float borderWidth = 5F;
	/**
	 * 边框颜色
	 */
	private Color borderColor = Color.RED;
	/**
	 * 印章标记(默认为五角星)线宽
	 */
	private float signBorderWidth = 3F;
	/**
	 * 印章标记颜色
	 */
	private Color signBorderColor = Color.RED;
	/**
	 * 印章标记填充颜色
	 */
	private Color signFillColor = Color.RED;

	public void draw(Graphics2D g2d) {
		
		// 把绘制起点挪到圆中心点
		g2d.translate(width / 2, height / 2);

		Stroke stroke = g2d.getStroke();// 旧的线性
		// 填充五角星
		Polygon polygon = getPentaclePoints(radius);
		if (signFillColor != null) {
			g2d.setColor(signFillColor);
			g2d.fill(polygon);
		}

		// 绘制五角星边框
		g2d.setStroke(new BasicStroke(signBorderWidth));
		g2d.setColor(signBorderColor);
		g2d.draw(polygon);

		// 绘制印章边框
		g2d.setColor(borderColor);
		g2d.setStroke(new BasicStroke(borderWidth));
		g2d.drawOval(-width / 2, -height / 2, width, height);
		g2d.setStroke(stroke);

		// 绘制印章名称
		g2d.setFont(nameFont);
		g2d.setColor(nameColor);
		FontMetrics fm = g2d.getFontMetrics();
		int w = fm.stringWidth(name);// 名称宽度
		int h = fm.getHeight();// 名称高度
		int y = fm.getAscent() - h / 2;// 求得中心线经过字体的高度的一半时的字体的起绘点
		g2d.drawString(name, -w / 2, y + nameOffset);

		// 绘制印章单位
		g2d.setFont(firmFont);
		g2d.setColor(firmColor);
		fm = g2d.getFontMetrics();
		h = fm.getHeight();// 字高度

		int count = firm.length();// 字数
		int r = width / 2;// 半径,就假设此印章是个矩形,方便计算

		float angle = (360 - firmAngle) / (count - 1);// 字间角度
		float start = 90 + firmAngle / 2;// 以x轴正向为0,顺时针旋转
		double vr = Math.toRadians(90);// 垂直旋转弧度
		char[] chars = firm.toCharArray();
		for (int i = 0; i < count; i++) {
			char c = chars[i];// 需要绘制的字符
			int cw = fm.charWidth(c);// 此字符宽度
			float a = start + angle * i;// 现在角度

			double radians = Math.toRadians(a);
			g2d.rotate(radians);// 旋转坐标系,让要绘制的字符处于x正轴
			float x = r - h;// 绘制字符的x坐标为半径减去字高度
			// g2d.drawLine(0, 0, (int) x, 0);// debug
			g2d.translate(x, 0);// 移动到此位置,此时字和x轴垂直
			g2d.rotate(vr);// 旋转90度,让字平行于x轴
			g2d.scale(firmScale, 1);// 缩放字体宽度
			g2d.drawString(String.valueOf(c), -cw / 2, 0);// 此点为字的中心点
			// 将所有设置还原,等待绘制下一个
			g2d.scale(1 / firmScale, 1);
			g2d.rotate(-vr);
			g2d.translate(-x, 0);
			g2d.rotate(-radians);
		}
		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
	}

	/**
	 * 获取具有指定半径外接圆的五角星顶点
	 * 
	 * @param radius
	 *            圆半径
	 */
	private Polygon getPentaclePoints(float radius) {
		if (radius <= 0)
			return null;
		float lradius = radius * 0.381966f;// 根据radius求内圆半径
		double halfpi = Math.PI / 180f;
		Point[] points = new Point[10];
		for (int i = 0; i < points.length; i++) {
			if (i % 2 == 1)
				points[i] = new Point(
						(int) (Math.sin(halfpi * 36 * i) * radius),
						(int) (Math.cos(halfpi * 36 * i) * radius));
			else
				points[i] = new Point(
						(int) (Math.sin(halfpi * 36 * i) * lradius),
						(int) (Math.cos(halfpi * 36 * i) * lradius));
		}
		Polygon polygon = new Polygon();
		for (Point p : points) {
			polygon.addPoint(p.x, p.y);
		}
		return polygon;
	}

	/**
	 * 导出此印章为透明背景的图片字节数组.
	 * 
	 * @param format
	 *            图片类型,如果为null,则默认为png
	 * @return 数组
	 * @throws IOException
	 *             写出图像数据出现问题
	 */
	public byte[] export2pic(String format) throws IOException {
		int fix = 5;// 宽高修正,如果宽高就为图片宽高,可能边框线被切割
		BufferedImage bi = new BufferedImage(getWidth() + fix * 2, getHeight()
				+ fix * 2, BufferedImage.TYPE_INT_ARGB);
		Graphics2D g2d = bi.createGraphics();
		g2d.translate(fix, fix);
		this.draw(g2d);
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		ImageIO.write(bi, format == null ? "png" : format, baos);
		return baos.toByteArray();
	}

	public int getWidth() {
		return width;
	}

	public int getHeight() {
		return height;
	}
	
	public static void main(String[] args) throws IOException {
		
		Seal seal = new Seal(); 
		BufferedImage image = new BufferedImage(seal.getWidth(), seal.getHeight(), BufferedImage.TYPE_INT_ARGB);
		
		
		Graphics2D g2d = image.createGraphics();
		
		seal.draw(g2d); 
		ImageIO.write(image, "png", new File("E:\\财务支付章.png"));
	}

}

 

分享到:
评论

相关推荐

    CDR辅助工具

    CDR辅助工具 可以简化很多工作 试试就知道了

    最新修复版PHP产品防伪查询网站源码系统(带90套证书模板)

    最新PHP产品防伪查询网站源码系统(带证书模板),证书模版含90套授权证书模板,非常适合做微商的站长们下载,做微商防伪查询很不错的一套源码带psd文件和印章工具。 安装说明: 环境要求:PHP+MYSQL,PHP 版本请...

    snagit截图工具的大量印章

    snagit截图工具的大量印章, 方便屏幕截图或者图片文件的加工和注释,美观。

    pdf批量添加水印工具

    绿色版工具,无需安装。一个非常强大的 PDF 水印工具,可以批量为 PDF 文件添加文本或图片水印,如文件名、公司名、签名、产品图片,从而保护 PDF 文件;它也支持为 PDF 文件添加日期时间、页码、作者等标记信息。

    VC下开发的PhotoDream图形图像处理软件

    矩形选择、移动图层、套索工具、魔术棒、放大镜、移动图像、添加文字、拾取颜色、钢笔、毛笔、橡皮擦、消除红眼、填充颜色、填充图案、印章工具、图形剪切、渐变填色、画线、图像变形、添加残像等... 基本的图像处理...

    "利用GDI+进行图像处理"源码发布

    矩形选择、移动图层、套索工具、魔术棒、放大镜、移动图像、添加文字、拾取颜色、钢笔、毛笔、橡皮擦、消除红眼、填充颜色、填充图案、印章工具、图形剪切、渐变填色、画线、图像变形、添加残像等... 各种基本的图像...

    利用GDI+进行图像处理

    矩形选择、移动图层、套索工具、魔术棒、放大镜、移动图像、添加文字、拾取颜色、钢笔、毛笔、橡皮擦、消除红眼、填充颜色、填充图案、印章工具、图形剪切、渐变填色、画线、图像变形、添加残像等... 各种基本的图像...

    cr2照片格式转换器DPP中文版.rar

    软件介绍: DPP即Digital Photo Professional,CR2文件是佳能相机一种专用的数码照片格式,普通的看图软件以及PS是无法打开的,需要使用这个其官方专用软件,才可以将.CR2格式的图片...内置印章工具及剪辑工具。

    产品防伪查询系统网站源码 带90套证书模板

    PHP产品防伪查询网站源码系统(带证书模板),证书模版含90套授权证书模板,非常适合做微商的站长们下载,做微商防伪查询很不错的一套源码带psd文件和印章工具。  安装说明:  环境要求:PHP+MYSQL,PHP 版本请...

    产品防伪查询网站源码 三色源码修复版+带90套证书模板.zip

    PHP产品防伪查询网站源码系统(带证书模板),证书模版含90套授权证书模板,非常适合做微商的站长们下载,做微商防伪查询很不错的一套源码带psd文件和印章工具。  安装说明:  环境要求:PHP+MYSQL,PHP 版本请使用...

    java绘制印章图片(圆形)

    使用jdk的绘图工具来绘制印章,该代码中只绘制了圆形印章,印章中的内容包括公司名称、中间的五角星以及印章的类型

    基于maven构建,使用javafx开发的一款印章生成工具,可快速生成各种样式印章

    SealBuilderTool是使用javafx开发的一款印章生成工具,可快速生成各种样式印章

    论文研究-利用COM开发电子印章系统的工具栏 .pdf

    利用COM开发电子印章系统的工具栏,马婵,,简要的介绍了COM的结构和特性,利用COM技术来解决电子印章系统与Word文档无缝结合的问题,并介绍了如何对Word进行第二次开发以及工具�

    PDF电盖章工具PDFstamp.rar

    PDFstamp 是一款简单实用的pdf电子盖章工具,采用C#开发,可搭配火箭水印电子印章使用,该pdf签章工具可以对PDF文档首页盖章、尾页盖章、全部多页一次性盖章,也能选择是否同时加盖骑缝章 1:由于每个用户制作的印章...

    印章管理办法模板.doc

    第一条 印章是公司经营管理活动中行使职权的重要凭证和工具,印章的管理,关系到公司正常的经营管理活动的开展,甚至影响到公司的生存和发展,为防止不必要事件的发生,维护公司的利益,制定本办法。 第二条 公司总...

    微商产品防伪查询系统网站源码-附90套证书PSD模板和印章生成工具.txt

    微商产品防伪查询系统网站源码-附90套证书PSD模板和印章生成工具

    HTML5 Canvas画印章

    NULL 博文链接:https://128kj.iteye.com/blog/2062673

Global site tag (gtag.js) - Google Analytics