生成的效果图示例:
http://hi.csdn.net/attachment/201101/5/39488_12942130574e2P.png一些说明:
1).文字是可变的,其个数也是可变的(区间为[2,6])
2).牌子高度51
3).牌子整体高度95
4).牌子立柱高度38
5).文字字体样式(黑体 30点 R255 G255 B255)
6).狐形牌子边框为3注意:牌子的宽度是随文字个数进行自适应的。
PS: 和生成图形校验码有相似的地方,但也有不同的地方。总之最终希望,通过传入一个中文字符串,进行产生出一个类似上述的效果图。

解决方案 »

  1.   

    graphics paint 好麻烦的 又没技术含量
    接受字符串
    搞个image 然后去paint
    最后ImageIO.write 一下, 挺简单的
    自己弄弄吧
      

  2.   

    int width = 400;
    int height = 300;
    // 创建BufferedImage对象
    BufferedImage image = new BufferedImage(width, height,     BufferedImage.TYPE_INT_RGB);
    // 获取Graphics2D
    Graphics2D g2d = image.createGraphics();
    // 画图
    g2d.setColor(new Color(255,0,0));
    g2d.setStroke(new BasicStroke(1));
    g2d.draw
    //释放对象
    g2d.dispose();
    // 保存文件    
    ImageIO.write(image, "png", new File("c:/test.png"));
      

  3.   

    得到字符宽度
    FontMetrics(Font font)
    charWidth(string)光影先不管吧 哈哈
    还有什么难点?剩下就是花时间了
      

  4.   

    能生成PNG格式的就能透明了。这个不是重点。
      

  5.   

    看我的模仿,颜色是用取色软件在你的图片取得。系统黑体有的问题、第一个图片的字体不正常。
    import java.awt.*;
    import java.awt.geom.*;
    import java.awt.image.*;
    import java.io.*;public class ImageGenerate {
    private static final int BOARD_HEIGHT=51; //  牌子高度
    private static final int BOARD_SPACE=10; // 文字两边留白宽度
    private static final int FULL_BOARD_HEIGHT=95; // 总高度
    private static final int BORDER_WIDTH=3; // 边框宽度
    private static final int TEXT_HEIGHT=30; // 字体大小
    private static final int BOARD_ARC_WIDTH=12; // 弧的宽度
    private static final Font TEXT_FONT= new Font("黑体",Font.BOLD,TEXT_HEIGHT); /**
     * text : 长度 2-6
     * font : 
     * imagefile : 输出文件
     */
    public static void generate(String text,Font font,File imagefile) throws IOException {

    // 3*2 + 10*2 + 30*6 = 206 + 字间距 < 300 ?
    BufferedImage image = new BufferedImage(300,FULL_BOARD_HEIGHT,BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2d = (Graphics2D)image.getGraphics();
    int text_width = g2d.getFontMetrics(font).stringWidth(text);
    // 牌子宽度 
    int width = BORDER_WIDTH * 2 + BOARD_SPACE*2 + text_width; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

    g2d.setFont(font);
    g2d.setPaint(Color.WHITE);
    g2d.fill(new Rectangle2D.Double(0,0,width,FULL_BOARD_HEIGHT)); RoundRectangle2D.Double outer = new RoundRectangle2D.Double(0,0,width,BOARD_HEIGHT+BORDER_WIDTH*2,BOARD_ARC_WIDTH,BOARD_ARC_WIDTH);
    Color board_color = new Color(110,110,110);
    g2d.setPaint(board_color);
    g2d.fill(outer); RoundRectangle2D.Double board = new RoundRectangle2D.Double(BORDER_WIDTH,BORDER_WIDTH,width-BORDER_WIDTH*2,BOARD_HEIGHT,BOARD_ARC_WIDTH,BOARD_ARC_WIDTH);
    g2d.setPaint(new Color(206,6,0));
    g2d.fill(board);

    g2d.setPaint(Color.WHITE);
    g2d.drawString(text,11,40); Ellipse2D.Double shadow = new Ellipse2D.Double(width/2-8,88,16,7);
    g2d.setPaint(Color.BLACK);
    g2d.fill(shadow); // 柱子 宽度 8 
    GeneralPath column = new GeneralPath();
    column.moveTo(width/2-4,57);
    column.lineTo(width/2+4,57);
    column.lineTo(width/2+4,93);
    column.curveTo(width/2+4,93,width/2,95,width/2-4,93);
    column.lineTo(width/2-4,57);
    column.closePath();
    //Rectangle2D.Double column = new Rectangle2D.Double(width/2 -4, 57,8,36);
    float[] fractions = {0,0.3f,1};
    Color[] colors = {new Color(150,150,150),new Color(221,221,221),new Color(159,159,159)};
    g2d.setPaint(new LinearGradientPaint(width/2-4,57,width/2+4,57,fractions,colors));
    g2d.fill(column); javax.imageio.ImageIO.write(image.getSubimage(0,0,width,FULL_BOARD_HEIGHT),"PNG",imagefile);
    } public static void main(final String[] args) throws Exception {
    generate("我喜欢麦当劳",TEXT_FONT,new File("/tmp/image.png"));
    Font droid = Font.createFont(Font.TRUETYPE_FONT,new File("/tmp/DroidSansFallback.ttf"));
    generate("我喜欢麦当劳",droid.deriveFont(30f),new File("/tmp/image2.png"));
    Font lihei = Font.createFont(Font.TRUETYPE_FONT,new File("/tmp/LiHeiPro.ttf"));
    generate("我喜欢麦当劳",lihei.deriveFont(30f),new File("/tmp/image3.png"));
    }
    }image.png
    image1.png
    image2.png
      

  6.   


    public static void generate(String text,Font font,File imagefile) throws IOException {

    // 3*2 + 10*2 + 30*6 = 206 + 字间距 < 300 ?
    BufferedImage image = new BufferedImage(300,FULL_BOARD_HEIGHT,BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2d = (Graphics2D)image.getGraphics();
    int text_width = g2d.getFontMetrics(font).stringWidth(text);
    // 牌子宽度 
    int width = BORDER_WIDTH * 2 + BOARD_SPACE*2 + text_width;
                    // 透明
    image = g2d.getDeviceConfiguration().createCompatibleImage(width,FULL_BOARD_HEIGHT,Transparency.TRANSLUCENT);
    g2d.dispose();
    g2d = image.createGraphics(); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

    g2d.setFont(font); RoundRectangle2D.Double outer = new RoundRectangle2D.Double(0,0,width,BOARD_HEIGHT+BORDER_WIDTH*2,BOARD_ARC_WIDTH,BOARD_ARC_WIDTH);
    Color board_color = new Color(110,110,110);
    g2d.setPaint(board_color);
    g2d.fill(outer); RoundRectangle2D.Double board = new RoundRectangle2D.Double(BORDER_WIDTH,BORDER_WIDTH,width-BORDER_WIDTH*2,BOARD_HEIGHT,BOARD_ARC_WIDTH,BOARD_ARC_WIDTH);
    g2d.setPaint(new Color(206,6,0));
    g2d.fill(board);

    g2d.setPaint(Color.WHITE);
    g2d.drawString(text,11,40); Ellipse2D.Double shadow = new Ellipse2D.Double(width/2-8,88,16,7);
    g2d.setPaint(Color.BLACK);
    g2d.fill(shadow); // 柱子 宽度 9 
    GeneralPath column = new GeneralPath();
    column.moveTo(width/2-4,57);
    column.lineTo(width/2+4,57);
    column.lineTo(width/2+4,93);
    column.curveTo(width/2+4,93,width/2,95,width/2-4,93);
    column.lineTo(width/2-4,57);
    column.closePath();
    float[] fractions = {0,0.3f,0.7f,1};
    Color[] colors = {new Color(150,150,150),new Color(221,221,221),new Color(150,150,150),new Color(159,159,159)};
    g2d.setPaint(new LinearGradientPaint(width/2-4,57,width/2+4,57,fractions,colors));
    g2d.fill(column); g2d.dispose();
    javax.imageio.ImageIO.write(image,"PNG",imagefile);
    }
      

  7.   

    再加个LinearGradientPaint paint = new LinearGradientPaint(0, 0, 0, 100, new float[] {0.0f, 0.5f, 1.0f}, new Color[]{Color.DARK_GRAY, Color.WHITE, Color.DARK_GRAY});
    g.setPaint(paint);就可以实现图中的渐变效果
      

  8.   

    看了下楼上的代码,要是我传输的是jpg的,你的就产生不了png的图片吧!!因为你本身传的是npg的。
      

  9.   

    代码自己重构一下吧,基本上功能就是这样做的
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.FontMetrics;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.LinearGradientPaint;
    import java.awt.Paint;
    import java.awt.Rectangle;
    import java.awt.RenderingHints;import javax.swing.JFrame;
    import javax.swing.JPanel;@SuppressWarnings("serial")
    public class Test extends JPanel {    public Test() {
            setFont(getFont().deriveFont(Font.BOLD, 35.0f));
        }    @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g;
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);        FontMetrics metrics = g2d.getFontMetrics();
            String str = "^-哆啦A梦-^";
            int sw = metrics.stringWidth(str);
            int sh = metrics.getAscent() + metrics.getDescent();        g2d.translate(30, 30);        // 绘制外圈
            Rectangle rect = new Rectangle(0, 0, sw + 20, sh + 20);
            float[] fractions = new float[] { 0.0f, 0.35f, 0.65f, 1.0f };
            Color[] colors = new Color[] { Color.DARK_GRAY, new Color(230, 230, 230),
                    new Color(230, 230, 230), Color.DARK_GRAY.darker() };
            Paint p = new LinearGradientPaint((float) rect.getX(), (float) rect.getY(),
                (float) rect.getX(), (float) rect.getHeight(), fractions, colors);
            g2d.setPaint(p);
            g2d.fillRoundRect(0, 0, (int) rect.getWidth(), (int) rect.getHeight(), 10, 10);        // 绘制字符串的红色背景
            g2d.setPaint(Color.decode("#E20000"));
            int margin = 4;
            g2d.fillRoundRect(margin, margin, (int) rect.getWidth() - margin * 2,
                (int) rect.getHeight() - margin * 2, 10, 10);        // 绘制字符串
            g2d.setPaint(Color.WHITE);
            g2d.drawString(str, (int) (rect.getWidth() - sw) / 2, (int) (rect.getHeight() - sh) / 2
                    + metrics.getAscent());        // 绘制柱子和阴影
            int pw = 12; // pillar
            int ph = 100;
            int x = (int) (rect.getWidth() - pw) / 2;
            int y = (int) (rect.getY() + rect.getHeight());        // 绘制阴影
            int shadowW = 20;
            int shadowH = 12;
            g2d.setPaint(Color.DARK_GRAY);
            g2d.fillOval(x + pw / 2 - shadowW / 2, y + ph - shadowH / 2 - 2, shadowW, shadowH);        // 绘制柱子
            fractions = new float[] { 0.1f, 0.35f, 1.0f };
            colors = new Color[] { Color.DARK_GRAY, new Color(230, 230, 230), Color.DARK_GRAY.darker() };
            p = new LinearGradientPaint(x, y, x + pw, y, fractions, colors);
            g2d.setPaint(p);
            g2d.fillRect(x, y, pw, ph);
        }    private static void createGuiAndShow() {
            JFrame frame = new JFrame("");
            frame.getContentPane().add(new Test());        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(500, 400);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }    public static void main(String[] args) {
            createGuiAndShow();
        }
    }
      

  10.   


    传输的可以限制为PNG的。
      

  11.   

    我把楼上的一些代码重构了一下,然后加入了一些细致的调整
    给出一个比较接近楼主样图的版本
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.FontMetrics;
    import java.awt.Graphics2D;
    import java.awt.LinearGradientPaint;
    import java.awt.Paint;
    import java.awt.Rectangle;
    import java.awt.RenderingHints;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;import javax.imageio.ImageIO;public class Test {

    public static void paintPNG(String str) {

    BufferedImage bufImg = new BufferedImage(1, 1, BufferedImage.TYPE_4BYTE_ABGR);
    Graphics2D g2d = bufImg.createGraphics();
    g2d.setFont(new Font("黑体", Font.PLAIN, 30));
    FontMetrics metrics = g2d.getFontMetrics();
    int sw = metrics.stringWidth(str);
    int sh = metrics.getAscent() + metrics.getDescent();
    g2d.dispose();
    bufImg = new BufferedImage(sw + 20 , 95, BufferedImage.TYPE_4BYTE_ABGR);
    g2d = bufImg.createGraphics();
    g2d.setFont(new Font("黑体", Font.PLAIN, 30));
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
    RenderingHints.VALUE_ANTIALIAS_ON);
    // g2d.translate(30, 30);
    // 绘制外圈
    Rectangle rect = new Rectangle(0, 0, sw + 20, 58);
    float[] fractions;
    Color[] colors;
    Paint p;
    // 绘制柱子和阴影
    int pw = 11; // pillar
    int ph = 34;
    int x = (int) (rect.getWidth() - pw) / 2;
    int y = (int) (rect.getY() + rect.getHeight());
    // 绘制阴影
    int shadowW = 20;
    int shadowH = 8;
    g2d.setPaint(Color.BLACK);
    g2d.fillOval(x + pw / 2 - shadowW / 2, y + ph - shadowH / 2 - 2,
    shadowW, shadowH);
    // 绘制柱子
    fractions = new float[] { 0.0f, 0.2f, 0.27f, 1.0f };
    colors = new Color[] {new Color(124, 124, 124),
    new Color(186, 186, 186),
    new Color(241, 241, 241),
    new Color(80, 80, 80)};
    p = new LinearGradientPaint(x, y, x + pw, y, fractions, colors);
    g2d.setPaint(p);
    g2d.fillRoundRect(x, y-3, pw, ph+4, 10, 6);
    fractions = new float[] { 0.0f, 0.35f, 0.65f, 0.97f, 1.0f};
    colors = new Color[] {new Color(90, 90, 90),
    new Color(233, 233, 233), new Color(233, 233, 233),
    new Color(106, 106, 106), new Color(103, 103, 103, 200)};

    p = new LinearGradientPaint((float) rect.getX(), (float) rect
    .getY(), (float) rect.getX(), (float) rect.getHeight(),
    fractions, colors);
    g2d.setPaint(p);
    g2d.fillRoundRect(0, 0, (int) rect.getWidth(), (int) rect.getHeight(),
    10, 10);
    // 绘制字符串的红色背景
    g2d.setPaint(Color.decode("#E20000"));
    int margin = 3;
    g2d.fillRoundRect(margin, margin, (int) rect.getWidth() - margin * 2,
    (int) rect.getHeight() - margin * 2, 10, 10);
    // 绘制字符串
    g2d.setPaint(Color.WHITE);
    g2d.drawString(str, (int) (rect.getWidth() - sw) / 2, (int) (rect
    .getHeight() - sh)
    / 2 + metrics.getAscent());
    try {
    ImageIO.write(bufImg, "PNG", new File("D:/image1.png"));
    } catch (IOException e) {
    e.printStackTrace();
    }
    } public static void main(String[] args) {
    paintPNG("我喜欢麦当劳");
    }
    }
    其是我最想说的一句就是,想生成一个透明的BufferedImage用TYPE_4BYTE_ABGR参数就行了
      

  12.   

    import java.awt.Color;
    import java.awt.Font;
    import java.awt.FontMetrics;
    import java.awt.Graphics2D;
    import java.awt.LinearGradientPaint;
    import java.awt.Paint;
    import java.awt.Rectangle;
    import java.awt.RenderingHints;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;import javax.imageio.ImageIO;public class Test {

    public static void paintPNG(String str) {

    BufferedImage bufImg = new BufferedImage(1, 1, BufferedImage.TYPE_4BYTE_ABGR);
    Graphics2D g2d = bufImg.createGraphics();
    g2d.setFont(new Font("微软雅黑", Font.PLAIN, 30));
    FontMetrics metrics = g2d.getFontMetrics();
    int sw = metrics.stringWidth(str);
    int sh = metrics.getAscent() + metrics.getDescent();
    g2d.dispose();
    bufImg = new BufferedImage(sw + 20 , 95, BufferedImage.TYPE_4BYTE_ABGR);
    g2d = bufImg.createGraphics();
    g2d.setFont(new Font("微软雅黑", Font.PLAIN, 30));
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
    RenderingHints.VALUE_ANTIALIAS_ON);
    // g2d.translate(30, 30);
    // 绘制外圈
    Rectangle rect = new Rectangle(0, 0, sw + 20, 58);
    float[] fractions;
    Color[] colors;
    Paint p;
    // 绘制柱子和阴影
    int pw = 11; // pillar
    int ph = 34;
    int x = (int) (rect.getWidth() - pw) / 2;
    int y = (int) (rect.getY() + rect.getHeight());
    // 绘制阴影
    int shadowW = 19;
    int shadowH = 8;
    g2d.setPaint(Color.BLACK);
    g2d.fillOval(x + pw / 2 - shadowW / 2, y + ph - shadowH / 2 - 2,
    shadowW, shadowH);
    // 绘制柱子
    fractions = new float[] { 0.0f, 0.2f, 0.27f, 0.36f, 0.9f };
    colors = new Color[] {new Color(124, 124, 124),
    new Color(186, 186, 186),
    new Color(241, 241, 241),
    new Color(230, 230, 230),
    new Color(80, 80, 80)};
    p = new LinearGradientPaint(x, y, x + pw, y, fractions, colors);
    g2d.setPaint(p);
    g2d.fillRoundRect(x, y-3, pw, ph+4, 10, 6);
    fractions = new float[] { 0.0f, 0.35f, 0.65f, 0.97f, 1.0f};
    colors = new Color[] {new Color(90, 90, 90),
    new Color(233, 233, 233), new Color(233, 233, 233),
    new Color(106, 106, 106), new Color(103, 103, 103, 160)};
    p = new LinearGradientPaint((float) rect.getX(), (float) rect
    .getY(), (float) rect.getX(), (float) rect.getHeight(),
    fractions, colors);
    g2d.setPaint(p);
    g2d.fillRoundRect(0, 0, (int) rect.getWidth(), (int) rect.getHeight(),
    20, 20);
    // 绘制字符串的红色背景
    fractions = new float[] { 0.05f, 0.11f, 0.86f, 0.92f, 0.93f};
    colors = new Color[] {new Color(178, 6, 0),
    new Color(207, 7, 0), new Color(207, 7, 0),
    new Color(184, 6, 0), new Color(165, 30, 25)};
    p = new LinearGradientPaint((float) rect.getX(), (float) rect
    .getY(), (float) rect.getX(), (float) rect.getHeight(),
    fractions, colors);
    g2d.setPaint(p);
    int margin = 3;
    g2d.fillRoundRect(margin, margin, (int) rect.getWidth() - margin * 2,
    (int) rect.getHeight() - margin * 2, 15, 15);
    fractions = new float[] { 0.01f, 0.02f, 0.04f, 0.95f, 0.98f};
    colors = new Color[] {new Color(186, 68, 46),
    new Color(190, 7, 0, 255), new Color(207, 7, 0, 0),
    new Color(207, 7, 0, 0), new Color(181, 7, 0, 255)};
    p = new LinearGradientPaint((float) rect.getX(), (float) rect
    .getY(), (float) rect.getWidth(), (float) rect.getY(),
    fractions, colors);
    g2d.setPaint(p);
    g2d.fillRoundRect(margin, margin, (int) rect.getWidth() - margin * 2,
    (int) rect.getHeight() - margin * 2, 15, 15);
    g2d.setPaint(new Color(207, 7, 0, 50));
    g2d.drawLine((int)rect.getWidth() - 3, 9, 
    (int)rect.getWidth() - 3, (int)rect.getHeight() - 9);
    // 绘制字符串
    g2d.setPaint(Color.WHITE);
    g2d.drawString(str, (int) (rect.getWidth() - sw) / 2, (int) (rect
    .getHeight() - sh)
    / 2 + metrics.getAscent());
    try {
    ImageIO.write(bufImg, "PNG", new File("D:/image1.png"));
    } catch (IOException e) {
    e.printStackTrace();
    }
    } public static void main(String[] args) {
    paintPNG("我喜欢麦当劳");
    }
    }这个程序是精确调整后的成果了
    楼主看一下是否满意吧