java文字竖排_java生成竖排文字图片

这篇博客展示了如何使用Java编程将文字竖向排列并生成图片。通过加载字体文件,设置文字样式,然后利用Graphics2D进行绘制,实现文字的旋转和定位,最后输出为JPEG格式的图片。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值