生成的效果图示例:
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: 和生成图形校验码有相似的地方,但也有不同的地方。总之最终希望,通过传入一个中文字符串,进行产生出一个类似上述的效果图。
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: 和生成图形校验码有相似的地方,但也有不同的地方。总之最终希望,通过传入一个中文字符串,进行产生出一个类似上述的效果图。
接受字符串
搞个image 然后去paint
最后ImageIO.write 一下, 挺简单的
自己弄弄吧
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"));
FontMetrics(Font font)
charWidth(string)光影先不管吧 哈哈
还有什么难点?剩下就是花时间了
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
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);
}
g.setPaint(paint);就可以实现图中的渐变效果
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();
}
}
传输的可以限制为PNG的。
给出一个比较接近楼主样图的版本
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参数就行了
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("我喜欢麦当劳");
}
}这个程序是精确调整后的成果了
楼主看一下是否满意吧