java生成竖排文字图片

it2022-06-27  80

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;        }    }}

转载于:https://www.cnblogs.com/plf112233/p/3544222.html

相关资源:java 生成 eps

最新回复(0)