java生成竖排文字图片
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;
}
}
}
java生成竖排文字图片的更多相关文章
- Java生成动态GIF图片
写selenium自动化时,为了查看运行效果,后给浏览器截图,想到可以生成gif图片来快速预览.看到已经有人实现了,直接拿过来. 共涉及到三个java文件,分别是NeuQuant.java,LZWEn ...
- java生成简单验证码图片
概要 最近项目需要用java实现输出随机验证码图片到前台,正好有机会接触下java的绘图类,完成需求后也有时间做个总结,写篇随笔记录下也希望能帮助到有同样需求的人! 需求流程图 1.生成随机数 在ja ...
- java生成随机验证码图片
import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; i ...
- java 生成透明背景图片
//开始绘图 graphics2d.setBackground(Color.WHITE); graphics2d.clearRect(0, 0, width, height); graphics2d. ...
- Java 实现word 中写入文字图片的解决方案
JAVA生成WORD文件的方法目前有以下两种方式: 一种是jacob 但是局限于windows平台 往往许多JAVA程序运行于其他操作系统 在此不讨论该方案; 一种是poi但是他的excel处理很程序 ...
- asp.net生成缩略图、文字图片水印
/// <summary> /// 会产生graphics异常的PixelFormat /// </summary> private static PixelFormat[] ...
- C#一些常用的图片操作方法:生成文字图片 合并图片等
生成文字图片: /// <summary> /// 生成文字图片 /// </summary> /// <param name="text">& ...
- java图片裁剪和java生成缩略图
一.缩略图 在浏览相冊的时候.可能须要生成相应的缩略图. 直接上代码: public class ImageUtil { private Logger log = LoggerFactory.getL ...
- php生成文字图片效果
php生成文字图片效果最近看到php的GD功能,试着做了一个基本生成文字图片效果的代码: 显示文字图片页面:demo.php<?php$str = $_REQUEST['str'] ? $_RE ...
随机推荐
- model is null
在action实现页面跳转过程中,可以实现页面的跳转,但页面无内容,无渲染,在控制台输出视图名,会报出url路径+"model is null" 这是在导包的错,正确的为: imp ...
- poj 2446 Chessboard (二分匹配)
Chessboard Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 12800 Accepted: 4000 Descr ...
- asp.net用url重写URLReWriter实现任意二级域名
本文转自 http://www.cnblogs.com/notus/archive/2007/03/13/673222.html
- python-flask 框架使用 flask_mongoengine
开发环境配置 再使用 mongodb 之前,需要先安装 pymongo ,以及flask_mongoengine 1. 切换到 virtualenv 环境 . /pyenv/bin/activate ...
- ABAP 加锁与解锁
维护一个旧程序,直接用UPDATE更新数据库透明表,现要求加上正在操作提示,以免数据出错. 1.先找到PA30多人修改时对应的锁对象. 2.在UPDATE前加锁,调用函数. CALL FUNCTION ...
- div box container随主体内容自动扩展适应的实现
/**顶部部分*/ .con-tl{ background:url(../images/left.png) no-repeat 0 0 rgba(0, 0, 0, 0); padding-left: ...
- python py生成为pyc文件
生成单个pyc文件 python就是个好东西,它提供了内置的类库来实现把py文件编译为pyc文件,这个模块就是 py_compile 模块. 使用方法非常简单,如下所示,直接在idle中,就可以把一个 ...
- button 边框
[_saveButton.layer setMasksToBounds:YES]; [_saveButton.layer setCornerRadius:8.0]; //设置矩圆角半径 [_saveB ...
- CodeIgnitor 创建admin和其他目录,前后端分离,很巧妙的方式,网上查找其他的都不是使用这种方式实现的。
在index.php的第97和98行的注释, // The directory name, relative to the "controllers" folder. Leave ...
- easyUI学习1
panel组件: <div id="p" class="easyui-panel" title="My Panel" style=&q ...