• 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 = "春眠不觉晓, 处处闻啼鸟。 夜来风雨声, 花落知多少。";
            //String text = "我送检单是 aab,,xxxb 接口的零啊11食 ";
            // String text = "花夜处春 落来处眠 知风闻不 多雨啼觉 少声鸟晓 。,。,";
            // String text = "夜   中 的 时 大 A 懂 禁 小";
            // 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(" ");
            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 + ", 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;
            }

        }
    }

  • 相关阅读:
    ==和equals
    instanceof和相关函数
    格式化输出
    [转]使用String的intern方法节省内存
    [转]请别再拿“String s = new String("xyz");创建了多少个String实例”来面试了吧
    Go编程语言学习笔记
    [javascript]什么是闭包?
    [javascript]彻底理解 JS 中 this 的指向
    constrained属性
    Python python 数据类型的相互转换
  • 原文地址:https://www.cnblogs.com/plf112233/p/3544222.html
Copyright © 2020-2023  润新知