package com.kadang.designer.web.action;
import java.awt.Color;
import
java.awt.Font;
import java.awt.FontFormatException;
import
java.awt.Graphics2D;
import java.awt.RenderingHints;
import
java.awt.font.TextLayout;
import java.awt.image.BufferedImage;
import
java.io.BufferedInputStream;
import java.io.File;
import
java.io.FileInputStream;
import java.io.FileNotFoundException;
import
java.io.IOException;
import java.io.InputStream;
import
javax.imageio.ImageIO;
import
org.apache.commons.lang.StringUtils;
public class DrawImageDemo
{
public static void main(String[] args)
{
String fileName = "STLITI.ttf";//
楷体
int bold = 0; //
是否加粗
int italic = 0; //
是否斜体
int size = 100;
String text =
"春眠不觉晓,\n处处闻啼鸟。\n夜来风雨声,\n花落知多少。";
//String text = "我送检单是\naab,,xxxb\n接口的零啊11食 ";
// String text =
"花夜处春\n落来处眠\n知风闻不\n多雨啼觉\n少声鸟晓\n。,。,";
// String text = "夜 \n中\n的\n时\n大\nA\n懂\n禁\n小";
// String text = "啊";
// String text = "春a";
int rgb = 125; // 颜色
// 设置字体
Font font =
getFont(fileName);
font =
deriveFont(font, bold, italic, size);
// generate font image
//
BufferedImage img = CreateFontImgWithGraphics(text, rgb, grid,
font,
// (int)rect.getWidth(),
(int)rect.getHeight());
BufferedImage
img = CreateFontImgWithGraphics(text, rgb, true, font);
// 图片生成路径
File
file = new File("F:\\test.jpg");
try
{
ImageIO.write(img,
"JPEG", file);
//
Iterator iter = ImageIO.getImageWritersByFormatName("PNG");
// ImageWriter writer =
(ImageWriter) iter.next();
// ImageWriteParam iwp = writer.getDefaultWriteParam();
//
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
// iwp.setCompressionQuality(1); //
best quality
//
FileImageOutputStream output = new FileImageOutputStream(file);
//
writer.setOutput(output);
// IIOImage image = new IIOImage(img, null, null);
// writer.write(null, image,
iwp);
//
writer.dispose();
} catch (IOException
e) {
e.printStackTrace();
}
}
private static Font
deriveFont(Font font, int bold, int italic, int size) {
int style = Font.PLAIN;
if (bold > 0) {
style = style | Font.BOLD;
}
if (italic
> 0) {
style =
style | Font.ITALIC;
}
return font.deriveFont(style, size);
}
// 获取字体
private static
Font getFont(String fileName) {
File
file = new File("Z:\\font\\" + fileName);
InputStream fi = null;
BufferedInputStream fb = null;
Font nf = null;
try
{
//
字体文件
fi = new
FileInputStream(file);
fb = new BufferedInputStream(fi);
// 生成字体
nf = Font.createFont(Font.TRUETYPE_FONT,
fb);
} catch (FileNotFoundException e)
{
e.printStackTrace();
} catch
(FontFormatException e) {
e.printStackTrace();
} catch
(IOException e) {
e.printStackTrace();
}
return nf;
}
private static BufferedImage
CreateFontImgWithGraphics(String text, int rgb, boolean isVertical, Font font)
{
// 字体大小
int fontSize = font.getSize();
// 高、宽比例
float
radio = 1.4f;
// 文字图片边框
float border = (float) (fontSize *
0.1);
// 设置每行的固定高度,用于横排
int line_height = Math.round(fontSize *
radio);
//
设置每行的固定宽度度,用于竖排
int line_width =
Math.round(fontSize * radio);
//
文字
String lines[] =
text.split("\n");
String
line;
TextLayout
layout;
//
计算图片的width,height
BufferedImage tmp =
new BufferedImage(1, 1, BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D gtmp = (Graphics2D)
tmp.getGraphics();
//
dwh用于根据实际文件来计算图片某一边的长度,dx用于对图片水平方向的空白补齐,dy用于对图片垂直方向的空白补齐
float dwh = 0, dx = 0, dy = 0;
for (int i = 0; i < lines.length; i++)
{
line =
lines[i];
if
(StringUtils.isNotBlank(line)) {
layout = new TextLayout(line, font,
gtmp.getFontRenderContext());
dwh = Math.max(layout.getAdvance(),
dwh);
dy = (float) Math.min(-((isVertical ? fontSize : line_height) -
layout.getBounds().getHeight()) / 2, dy);
}
}
// 横排文字:width不固定,height固定;
竖排文字:width固定,height不固定
//
文字图片的宽
int width =
Math.round((isVertical ? line_width * lines.length : dwh) + 2 *
border);
// 文字图片的高
int height = Math.round((isVertical ? dwh : line_height
* lines.length) + 2 * border);
//
创建文字图片
BufferedImage image = new
BufferedImage(width < 1 ? 1 : width, // width
height < 1 ? 1
: height, // height
BufferedImage.TYPE_4BYTE_ABGR);// RGB
mode
// get graphics
context
Graphics2D g = (Graphics2D)
image.getGraphics();
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g.setColor(new Color(rgb));
g.setFont(font);
//
初始化第一个字的坐标
float xpos = isVertical ?
width : border + dx, ypos = border + dy;
// 每行字
for (int i = 0; i <
lines.length; i++) {
line = lines[i];
if (isVertical) {
xpos -= line_width;
ypos = border + dy;
} else {
xpos = border +
dx;
ypos += line_height;
}
//
如果该行为空行,直接跳过
if
(StringUtils.isBlank(lines[i])) {
continue;
}
// 每个字符
for (int j = 0; j < line.length(); j++)
{
char c = line.charAt(j);
// 用于获取字的该advance
layout = new
TextLayout(String.valueOf(c), font, g.getFontRenderContext());
g.scale(1.0,
1.0); // 比例
if (c > 32 && c < 126 &&
isVertical) {
g.rotate(Math.PI / 2, xpos, ypos +
layout.getAdvance());
g.drawString(String.valueOf(c), xpos , ypos+
layout.getAdvance());
g.rotate(-Math.PI / 2, xpos, ypos +
layout.getAdvance());
} else {
g.drawString(String.valueOf(c), xpos, isVertical ? ypos +
layout.getAdvance() : ypos);
}
System.out.println(c + ", xy:xpos ="
+ xpos + ",ypos=" + (ypos + layout.getAdvance()));
if (isVertical)
{
ypos += layout.getAdvance();
} else
{
xpos += layout.getAdvance();
}
}
}
g.drawString(String.valueOf("a"), 160, 81);
System.out.println("width:" + width + ", height:" +
height);
// g.setStroke(new
BasicStroke(4.0f));// 线条粗细
//
g.setColor(Color.blue);// 线条颜色
//
g.drawLine(440, 0, 440, 580);// 线条起点及终点位置
// g.setStroke(new BasicStroke(4.0f));// 线条粗细
// g.setColor(Color.red);// 线条颜色
// g.drawLine(0, 110, 620, 110);//
线条起点及终点位置
g.dispose();
return image;
}
static class Rect {
private float height;
private float width;
public Rect() {
}
public Rect(float height,
float width) {
super();
this.height = height;
this.width = width;
}
public float getHeight()
{
return
height;
}
public void setHeight(float height) {
this.height =
height;
}
public float getWidth() {
return width;
}
public
void setWidth(float width) {
this.width = width;
}
}
}
原文:http://www.cnblogs.com/plf112233/p/3544222.html