`
i2534
  • 浏览: 182986 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

来,让我们一起画个印章吧

    博客分类:
  • util
阅读更多

这几天发现有哥们在介绍如何画出swing,正好我也受命做一个简单的印章.今天完工,抽出来一个典型的凑下热闹,让大家乐呵乐呵.

还是老习惯,不多说,上代码和图片.

 

主类:

package i2534.iteye.com;

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.Stroke;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
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);
		}
	}

	/**
	 * 获取具有指定半径外接圆的五角星顶点
	 * 
	 * @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;
	}

}

 

这个简单了,就是一个单纯的JFrame显示界面,拖拽出来的:

 

package i2534.iteye.com;

import java.awt.BorderLayout;

public class Main extends JFrame {

	private JPanel contentPane;
	private JPanel panel;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Main frame = new Main();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public Main() {
		initComponents();
	}

	private void initComponents() {
		setTitle("刻 章 办 证");//刻 章 居然违禁词
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(new BorderLayout(0, 0));
		contentPane.add(getPanel(), BorderLayout.CENTER);
	}

	private JPanel getPanel() {
		if (panel == null) {
			panel = new JPanel() {
				private Seal seal = new Seal();

				protected void paintComponent(java.awt.Graphics g) {
					super.paintComponent(g);

					g.translate((getWidth() - seal.getWidth()) / 2,
							(getHeight() - seal.getHeight()) / 2);

					seal.draw((Graphics2D) g);
				};
			};
			panel.setBackground(Color.WHITE);
		}
		return panel;
	}
}

 

运行结果:


 

经过老三提醒,可以使用

Graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

 进行抗锯齿处理.这个看需要自己酌情选择.

 

  • 大小: 28.8 KB
分享到:
评论
5 楼 xfxlch 2014-04-23  
up
Thx
4 楼 evan0625 2011-11-01  
楼主威武,,,,千秋万代,一统江湖。
非常感谢  
3 楼 xutao5641745 2011-07-11  
楼主威武,,,,千秋万代,一统江湖。
2 楼 xdoc 2011-07-08  
不错,顶一个
1 楼 修补匠 2011-07-04  
给顶一个。

相关推荐

    threejs 修改版本 可以看到印章签章 vuepdf预览

    在这个场景中,我们将利用Three.js创建3D模型来模拟印章和签名的视觉效果。 1. **集成Three.js到Vue项目**: 在Vue项目中引入Three.js,可以通过npm安装修改版的库,命令如下: ``` npm install three --save `...

    jquery仿盖章效果并合成图片.zip

    "jQuery仿盖章效果并合成图片"这个项目就是一个典型的例子,它利用jQuery库来模拟传统的盖章动作,并通过前端技术将盖章后的效果与原有图片合成在一起。以下是对这一技术进行的详细解析。 首先,我们需要了解jQuery...

    ps cs3新增仿章工具

    总的来说,Photoshop CS3中的仿章工具是一个强大且实用的功能,尤其对于初学者来说,它提供了一个易于上手的途径,帮助他们快速掌握印章设计。通过不断实践和探索,你可以在设计领域中游刃有余,创造出更多独特且...

    photoshop的PSD素材

    同时,还可以通过调整图层顺序来改变元素的前后关系,或者利用图层组将相关图层组织在一起,便于管理和操作。 此外,对于不熟悉Photoshop的用户,也可以通过软件如GIMP或在线编辑工具,尽管功能可能有限,但依然...

    Sephora家庭日执行方案.pptx

    【Sephora家庭日执行方案】是一个以互动...通过这种方式,Sephora家庭日不仅是一个销售活动,更是一个品牌建设和客户关系维护的平台,它巧妙地将产品、游戏和体验结合在一起,创造了一个充满乐趣和互动的美妆夏日盛宴。

    国花牡丹花纹背景连绵山川中国风乐器主题ppt模板.rar

    总结来说,这个PPT模板融合了丰富的中国元素,旨在创造一个具有深厚文化底蕴的演示环境,适合用于介绍中国文化、音乐表演、艺术展览等相关主题的展示。在实际应用中,用户可以根据需要替换文字内容,调整色彩搭配,...

    Stranger Lands - StampIT v2.1.0

    Unity提供了一个非常方便的方法,可以将这些图像与它们内置的地形工具混合在一起。Unity地形工具提供了一个带有画笔预览的编辑器,可以在应用之前详细调整印章。 为了获得更好的体验,除了通过包管理器安装的内置...

    小班六一游园活动游戏(50个).doc

    1. **喂老虎**:这个游戏锻炼孩子的定点投掷技巧,需要准备钻洞、大袋子、乒乓球和画有老虎头的纸板。幼儿站在定点线上,尝试将乒乓球投入"虎口",进球数达到一定数量即可获得奖励。 2. **打保龄球**:利用矿泉水瓶...

    一个文本域优化的思考.docx

    团队开始时候是采用的用户访谈以及邀请伙伴一起使用并且建群收集意见的方式,但是这个方式在执行中有着明显的弊端:需求很散、描述不清、执行录入习惯不同和态度敷衍。改进后的调研措施是从交付物(报告)入手,产品...

    幼儿园新年新生游园邀请函多篇.pdf

    我们精心准备了多个寓教于乐的游戏项目,如“快乐小画家”、“小小建筑师”、“智勇大闯关”等,旨在让孩子们在游戏中锻炼社交能力、认知发展和动手能力,同时加深与父母间的情感纽带。游戏过后,孩子们将获得游园卡...

    大班美术.docx

    \n\n总的来说,大班的印画衣服活动是一个集趣味性、教育性和创造性于一体的美术活动,它能有效促进幼儿的艺术素养,激发他们的想象力和创新精神,同时也在无形中提升了他们的动手能力和社交技巧。

    幼儿园游园活动游戏大全.doc

    孩子们站在定点线上,尝试将乒乓球投入画有老虎头的袋子中,成功投进3个或以上就能获得奖励。 2. **打保龄球**:这是一个室外游戏,分为小班、中班和大班三个区域,难度逐渐增加。孩子们需要用球滚动击倒排列的矿泉...

    office 电子签名控件

    文档保存在一起,印章或签名可以功过系统的验证来判断真伪。 12.盖章数据是根据标准的加密方式.用户只有通过明钥和密钥的认证后才可以得到用户的盖章数据.大大加强了盖章的安全性. 13.控件的二次开发提供强大的...

    初中语文文摘历史我的邻居吴冠中

    他的故事是中国现代艺术史上的宝贵财富,也是我们每一个人在生活和艺术探索中学习的榜样。通过了解和学习吴冠中先生的生活和艺术态度,我们或许能够更好地理解艺术的本质,更深刻地体会生活中的美。

    小班综合活动 会响的小路.doc

    - **美术活动**:进行印章画《落叶》,将故事与艺术创作结合,让孩子在绘画中表达自己的想法,提高艺术创造力。 通过以上活动,小班的孩子们不仅能够接触到故事中的情感表达和角色互动,还能在实践中探索声音、...

    宣传片脚本文案经典范例.doc

    三正集团的宣传片脚本文案便是一个精心策划的经典范例,它通过七个部分将集团的各个方面展现在观众面前,下面,让我们一起详细解读这个脚本文案的经典之处。 宣传片的序幕部分以一本古色古香的线装书开场,这不仅仅...

    Photoshop图像特效设计100例 PDF

    9. **合成技术**:通过图层混合模式和调整图层,将多个图像元素巧妙地融合在一起,创造出令人惊叹的视觉合成效果。 10. **动作与批处理**:记录并重复一系列操作,提高工作效率,尤其适合批量处理类似的任务。 11....

    PS网页设计.pptx

    1. **认识Photoshop**:Photoshop是一个专业级的图像编辑软件,提供丰富的图像创作和修改功能,如图像裁剪、色彩调整、图层管理、滤镜应用等,对于网页设计师来说,它是实现创意设计的重要工具。 2. **界面认识**:...

    photoshop联盟教程-平面设计师手册.rar

    - 油画和克隆印章工具:如何使用这些工具进行图像修复、去除瑕疵或创意绘画。 - 调整图层:通过调整图层来改变图像的颜色、对比度、亮度等,同时保持原始数据不受影响。 4. **色彩管理** - 色彩模式:了解RGB、...

    重阳节公益活动策划案.pptx

    2. 活动主题:“与树宝宝一起爱环保”,通过树宝宝这一吉祥物形象,传达保护环境和爱护自然的信息,同时结合了重阳节的传统元素。 3. 活动时间:2019年10月7日至8日,为期两天,涉及15个项目的社区,预计参与人数为...

Global site tag (gtag.js) - Google Analytics