Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 438|回复: 0

[Swing学习]swing画印章

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-17 23:58:06 | 显示全部楼层 |阅读模式
    效果图:

    代码:
    1. import java.awt.BasicStroke;   
    2. import java.awt.Color;   
    3. import java.awt.Font;   
    4. import java.awt.FontMetrics;   
    5. import java.awt.Graphics2D;   
    6. import java.awt.Point;   
    7. import java.awt.Polygon;   
    8. import java.awt.Stroke;   
    9. import java.awt.image.BufferedImage;   
    10. import java.io.ByteArrayOutputStream;   
    11. import java.io.IOException;   
    12.   
    13. import javax.imageio.ImageIO;   
    14.   
    15. /**  
    16. * 印章类.保存印章必须的参数和绘制方法.  
    17. *   
    18. * @author i2534  
    19. *   
    20. */  
    21. public class Seal {   
    22.     /**  
    23.      * 印章名称距中心点偏移量,按照y轴方向  
    24.      */  
    25.     private int nameOffset = 50;   
    26.     /**  
    27.      * 印章宽度  
    28.      */  
    29.     private int width = 230;   
    30.     /**  
    31.      * 印章高度  
    32.      */  
    33.     private int height = 230;   
    34.     /**  
    35.      * 印章中心标志(默认为五角星)外接圆半径  
    36.      */  
    37.     private float radius = 30;   
    38.     /**  
    39.      * 印章所属单位的起始角度,以6点钟方向为中心,向两个方向平均扩展  
    40.      */  
    41.     private float firmAngle = 120;   
    42.     /**  
    43.      * 印章名称  
    44.      */  
    45.     private String name = "取钱专用章";   
    46.     /**  
    47.      * 印章名称颜色  
    48.      */  
    49.     private Color nameColor = Color.RED;   
    50.     /**  
    51.      * 印章所属单位  
    52.      */  
    53.     private String firm = "中国人民银行";   
    54.     /**  
    55.      * 印章所属单位颜色  
    56.      */  
    57.     private Color firmColor = Color.RED;   
    58.     /**  
    59.      * 印章名称字体信息  
    60.      */  
    61.     private Font nameFont = new Font("宋体", Font.PLAIN, 16);   
    62.     /**  
    63.      * 印章所属单位字体信息  
    64.      */  
    65.     private Font firmFont = new Font("宋体", Font.PLAIN, 24);   
    66.     /**  
    67.      * 单位字体的宽度缩放比率(百分比).此参数可以使字体看起来瘦长  
    68.      */  
    69.     private float firmScale = 1.0F;   
    70.     /**  
    71.      * 边框线宽  
    72.      */  
    73.     private float borderWidth = 5F;   
    74.     /**  
    75.      * 边框颜色  
    76.      */  
    77.     private Color borderColor = Color.RED;   
    78.     /**  
    79.      * 印章标记(默认为五角星)线宽  
    80.      */  
    81.     private float signBorderWidth = 3F;   
    82.     /**  
    83.      * 印章标记颜色  
    84.      */  
    85.     private Color signBorderColor = Color.RED;   
    86.     /**  
    87.      * 印章标记填充颜色  
    88.      */  
    89.     private Color signFillColor = Color.RED;   
    90.   
    91.     public void draw(Graphics2D g2d) {   
    92.         // 把绘制起点挪到圆中心点   
    93.         g2d.translate(width / 2, height / 2);   
    94.   
    95.         Stroke stroke = g2d.getStroke();// 旧的线性   
    96.         // 填充五角星   
    97.         Polygon polygon = getPentaclePoints(radius);   
    98.         if (signFillColor != null) {   
    99.             g2d.setColor(signFillColor);   
    100.             g2d.fill(polygon);   
    101.         }   
    102.   
    103.         // 绘制五角星边框   
    104.         g2d.setStroke(new BasicStroke(signBorderWidth));   
    105.         g2d.setColor(signBorderColor);   
    106.         g2d.draw(polygon);   
    107.   
    108.         // 绘制印章边框   
    109.         g2d.setColor(borderColor);   
    110.         g2d.setStroke(new BasicStroke(borderWidth));   
    111.         g2d.drawOval(-width / 2, -height / 2, width, height);   
    112.         g2d.setStroke(stroke);   
    113.   
    114.         // 绘制印章名称   
    115.         g2d.setFont(nameFont);   
    116.         g2d.setColor(nameColor);   
    117.         FontMetrics fm = g2d.getFontMetrics();   
    118.         int w = fm.stringWidth(name);// 名称宽度   
    119.         int h = fm.getHeight();// 名称高度   
    120.         int y = fm.getAscent() - h / 2;// 求得中心线经过字体的高度的一半时的字体的起绘点   
    121.         g2d.drawString(name, -w / 2, y + nameOffset);   
    122.   
    123.         // 绘制印章单位   
    124.         g2d.setFont(firmFont);   
    125.         g2d.setColor(firmColor);   
    126.         fm = g2d.getFontMetrics();   
    127.         h = fm.getHeight();// 字高度   
    128.   
    129.         int count = firm.length();// 字数   
    130.         int r = width / 2;// 半径,就假设此印章是个矩形,方便计算   
    131.   
    132.         float angle = (360 - firmAngle) / (count - 1);// 字间角度   
    133.         float start = 90 + firmAngle / 2;// 以x轴正向为0,顺时针旋转   
    134.         double vr = Math.toRadians(90);// 垂直旋转弧度   
    135.         char[] chars = firm.toCharArray();   
    136.         for (int i = 0; i < count; i++) {   
    137.             char c = chars[i];// 需要绘制的字符   
    138.             int cw = fm.charWidth(c);// 此字符宽度   
    139.             float a = start + angle * i;// 现在角度   
    140.   
    141.             double radians = Math.toRadians(a);   
    142.             g2d.rotate(radians);// 旋转坐标系,让要绘制的字符处于x正轴   
    143.             float x = r - h;// 绘制字符的x坐标为半径减去字高度   
    144.             // g2d.drawLine(0, 0, (int) x, 0);// debug   
    145.             g2d.translate(x, 0);// 移动到此位置,此时字和x轴垂直   
    146.             g2d.rotate(vr);// 旋转90度,让字平行于x轴   
    147.             g2d.scale(firmScale, 1);// 缩放字体宽度   
    148.             g2d.drawString(String.valueOf(c), -cw / 2, 0);// 此点为字的中心点   
    149.             // 将所有设置还原,等待绘制下一个   
    150.             g2d.scale(1 / firmScale, 1);   
    151.             g2d.rotate(-vr);   
    152.             g2d.translate(-x, 0);   
    153.             g2d.rotate(-radians);   
    154.         }   
    155.     }   
    156.   
    157.     /**  
    158.      * 获取具有指定半径外接圆的五角星顶点  
    159.      *   
    160.      * @param radius  
    161.      *            圆半径  
    162.      */  
    163.     private Polygon getPentaclePoints(float radius) {   
    164.         if (radius <= 0)   
    165.             return null;   
    166.         float lradius = radius * 0.381966f;// 根据radius求内圆半径   
    167.         double halfpi = Math.PI / 180f;   
    168.         Point[] points = new Point[10];   
    169.         for (int i = 0; i < points.length; i++) {   
    170.             if (i % 2 == 1)   
    171.                 points[i] = new Point(   
    172.                         (int) (Math.sin(halfpi * 36 * i) * radius),   
    173.                         (int) (Math.cos(halfpi * 36 * i) * radius));   
    174.             else  
    175.                 points[i] = new Point(   
    176.                         (int) (Math.sin(halfpi * 36 * i) * lradius),   
    177.                         (int) (Math.cos(halfpi * 36 * i) * lradius));   
    178.         }   
    179.         Polygon polygon = new Polygon();   
    180.         for (Point p : points) {   
    181.             polygon.addPoint(p.x, p.y);   
    182.         }   
    183.         return polygon;   
    184.     }   
    185.   
    186.     /**  
    187.      * 导出此印章为透明背景的图片字节数组.  
    188.      *   
    189.      * @param format  
    190.      *            图片类型,如果为null,则默认为png  
    191.      * @return 数组  
    192.      * @throws IOException  
    193.      *             写出图像数据出现问题  
    194.      */  
    195.     public byte[] export2pic(String format) throws IOException {   
    196.         int fix = 5;// 宽高修正,如果宽高就为图片宽高,可能边框线被切割   
    197.         BufferedImage bi = new BufferedImage(getWidth() + fix * 2, getHeight()   
    198.                 + fix * 2, BufferedImage.TYPE_INT_ARGB);   
    199.         Graphics2D g2d = bi.createGraphics();   
    200.         g2d.translate(fix, fix);   
    201.         this.draw(g2d);   
    202.         ByteArrayOutputStream baos = new ByteArrayOutputStream();   
    203.         ImageIO.write(bi, format == null ? "png" : format, baos);   
    204.         return baos.toByteArray();   
    205.     }   
    206.   
    207.     public int getWidth() {   
    208.         return width;   
    209.     }   
    210.   
    211.     public int getHeight() {   
    212.         return height;   
    213.     }   
    214.   
    215. }  
    216. 主类:
    217. import java.awt.*;
    218. import javax.swing.*;
    219. import javax.swing.border.*;
    220.   
    221. public class Main extends JFrame {   
    222.   
    223.     private JPanel contentPane;   
    224.     private JPanel panel;   
    225.   
    226.     /**  
    227.      * Launch the application.  
    228.      */  
    229.     public static void main(String[] args) {   
    230.         EventQueue.invokeLater(new Runnable() {   
    231.             public void run() {   
    232.                 try {   
    233.                     Main frame = new Main();   
    234.                     frame.setVisible(true);   
    235.                 } catch (Exception e) {   
    236.                     e.printStackTrace();   
    237.                 }   
    238.             }   
    239.         });   
    240.     }   
    241.   
    242.     /**  
    243.      * Create the frame.  
    244.      */  
    245.     public Main() {   
    246.         initComponents();   
    247.     }   
    248.   
    249.     private void initComponents() {   
    250.         setTitle("刻 章 办 证");//刻 章 居然违禁词   
    251.                 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
    252.         setBounds(100, 100, 450, 300);   
    253.         contentPane = new JPanel();   
    254.         contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));   
    255.         setContentPane(contentPane);   
    256.         contentPane.setLayout(new BorderLayout(0, 0));   
    257.         contentPane.add(getPanel(), BorderLayout.CENTER);   
    258.     }   
    259.   
    260.     private JPanel getPanel() {   
    261.         if (panel == null) {   
    262.             panel = new JPanel() {   
    263.                 private Seal seal = new Seal();   
    264.   
    265.                 protected void paintComponent(java.awt.Graphics g) {   
    266.                     super.paintComponent(g);   
    267.   
    268.                     g.translate((getWidth() - seal.getWidth()) / 2,   
    269.                             (getHeight() - seal.getHeight()) / 2);   
    270.   
    271.                     seal.draw((Graphics2D) g);   
    272.                 };   
    273.             };   
    274.             panel.setBackground(Color.WHITE);   
    275.         }   
    276.         return panel;   
    277.     }   
    278. }  
    复制代码

       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/11/17/235805625.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 07:35 , Processed in 0.332682 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表