三个对外方法实现功能

// 设置图片样式 长度 高度 背景色 设置背景,为null是空白背景
public void setImage(int width, int height, Color color,String imagepath)
// 设置字体样式 字体大小 字体间距 行间距
public void setFont(int size, int leftsize, int lineheight)

文本格式demo:
“16.某几何体的三视图如图所示,则组成该几何体的小正方体的个数是( ).\n” +"[image18.jpeg]"

// 输入一张图片的文本,“文本+[图片名]+文本\n”格式,根据\n 或字体一行的长度换行
输入生成图片地址的对象
输入文本中拼接图片的图片存储地址,对应文本中的图片名
public void txttoimg(String string, File imageFile, String imagePath)


package edu.math.HandwritingCore.TestExample;import java.awt.*;
import java.awt.font.TextAttribute;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.*;
import java.util.List;
import java.util.regex.Pattern;import com.sun.image.codec.jpeg.JPEGImageEncoder;
import com.sun.image.codec.jpeg.JPEGCodec;
import sun.plugin.dom.core.CoreConstants;import javax.imageio.ImageIO;/*** @Author:小党* @Date:Created in 15:10  2022/2/14* @Explain:*/
public class TxtToImage {/*** 图片宽度*/private int IMAGE_WIDTH = 1000;/*** 图片高度*/private int IMAGE_HEIGHT = 600;//  图片背景private Color IMAGE_COLOR = Color.WHITE;//= Color.CYAN; //蓝色/*** 图片类型*/private final int IMAGE_TYPE = BufferedImage.TYPE_INT_RGB;//  字体大小private int SIZE = 20;//  左间距private int LEFTSIZE = 10;//  行间距private int Y_LINEHEIGHT = 10;private BufferedImage image = new BufferedImage(IMAGE_WIDTH, IMAGE_HEIGHT, IMAGE_TYPE);
//    BufferedImage image = ImageIO.read(new File("D:\\b\\背景图片\\4.jpg"));public TxtToImage() throws IOException {}//      设置图片样式      长度         高度       背景色public void setImage(int width, int height, Color color,String imagepath) throws IOException {this.IMAGE_WIDTH = width;this.IMAGE_HEIGHT = height;this.IMAGE_COLOR = color;if (image != null){BufferedImage read = ImageIO.read(new File(imagepath));this.image = ImageUtils.resizeImage(read,IMAGE_WIDTH,IMAGE_HEIGHT);}}//  设置字体样式          字体大小    字体间距        行间距public void setFont(int size, int leftsize, int lineheight) {this.SIZE = size;this.LEFTSIZE = leftsize;this.Y_LINEHEIGHT = lineheight;}/*** @Author: dang on 2022/2/18 15:45* @Param string    输入一张图片的文本,“文本+[图片名]+文本\n”格式,根据\n 或字体一行的长度换行* @Param imageFile    输入生成图片地址的对象* @Param imagePath    输入文本中拼接图片的图片存储地址,对应文本中的图片名* @return:void* @description:*/public void txttoimg(String string, File imageFile, String imagePath) throws IOException {//获取图像上下文    Graphics的接口说明   https://www.oschina.net/uploads/doc/javase-6-doc-api-zh_CN/java/awt/Graphics.htmlGraphics g = createGraphics(image);System.out.println(g.getFont());System.out.println(g.getFontMetrics());//图片中文本高低+行高final int lineheight = SIZE + Y_LINEHEIGHT;int lineNum = 1;try {assert string.contains("\n");String[] split = string.split("\n");double v = SIZE + (SIZE * 0.2);//  计算一行的字符串的长度double v1 = IMAGE_WIDTH / v;int[] ints = new int[]{LEFTSIZE, lineheight, LEFTSIZE, lineheight};for (String line : split) {List<Integer> list = new ArrayList<>();Map<Integer, String> map = new HashMap<>();while (line.contains("[")) {int i = line.indexOf("[");int i1 = line.indexOf("]");String substring = line.substring(i + 1, i1);if (substring.contains(".")) {if (i == 0) {line = line.substring(0, i) + " " + line.substring(i1 + 1);list.add(i);map.put(i, substring);} else {line = line.substring(0, i) + line.substring(i1 + 1);list.add(i - 1);map.put(i - 1, substring);}}}int start = 0;char[] chars = line.toCharArray();if (list.size() == 0) {for (int j = 0; j < chars.length; j++) {//                        g.drawLine(ints[0], ints[1], ints[2], ints[3]-SIZE);int car = (int) chars[j];
//                        System.out.print(chars[j] + "---");
//                        System.out.println(car);getInts(v, ints, car);if (ints[0] > IMAGE_WIDTH - v * 1) {g.drawString(line.substring(start, j), LEFTSIZE, ints[1]);System.out.println(line.substring(start, j));System.out.println(Arrays.toString(ints));start = j;ints = new int[]{LEFTSIZE, ints[1] + lineheight, LEFTSIZE, ints[3] + lineheight};j--;} else if (j == chars.length - 1) {//          添加文本  左边距       每行的高度g.drawString(line.substring(start, j + 1), LEFTSIZE, ints[1]);ints = new int[]{LEFTSIZE, ints[1] + lineheight, LEFTSIZE, ints[3] + lineheight};break;}}} else {int num = ints[0];for (int j = 0; j < chars.length; j++) {if (list.contains(j)) {//                            g.drawString(line.substring(start, j + 1), ints[0], ints[1]);
//                            System.out.println(line.substring(start, j));for (int i = start; i < j + 1; i++) {//                                g.drawLine(ints[0], ints[1], ints[2], ints[3]-SIZE);int car = (int) chars[i];
//                                System.out.print(chars[i] + "---");
//                                System.out.println(car);getInts(v, ints, car);if (ints[0] > IMAGE_WIDTH - v * 1) {g.drawString(line.substring(start, i), num, ints[1]);
//                                    System.out.println(line.substring(start, i));
//                                    System.out.println(Arrays.toString(ints));start = i;ints = new int[]{LEFTSIZE, ints[1] + lineheight, LEFTSIZE, ints[3] + lineheight};num = ints[0];i--;} else if (i == j) {//          添加文本  左边距       每行的高度g.drawString(line.substring(start, i + 1), num, ints[1]);System.out.println(line.substring(start, i + 1));break;}}start = j + 1;String s = map.get(j);if (s.contains("wmf")){s = s.split("\\.")[0]+".png";}Image image1 = ImageIO.read(new File(imagePath + "\\" + s));int width = image1.getWidth(null);int height = image1.getHeight(null);if (height > lineheight*3) {g.drawImage(image1, ints[0], ints[1] +SIZE, null);} else if (height > lineheight) {g.drawImage(image1, ints[0], ints[1] - lineheight + (int) (Y_LINEHEIGHT * 0.6), null);} else {g.drawImage(image1, ints[0], ints[1] - SIZE, null);}ints[0] = num = ints[2] = ints[0] + width;} else if (j == chars.length - 1) {for (int i = start; i < j + 1; i++) {//                                g.drawLine(ints[0], ints[1], ints[2], ints[3]-SIZE);int car = (int) chars[i];
//                                System.out.print(chars[i] + "---");
//                                System.out.println(car);getInts(v, ints, car);}g.drawString(line.substring(start, j + 1), num, ints[1]);
//                            g.drawString(line.substring(start, j + 1), ints[0], ints[1] + SIZE);start = j + 1;if (j == chars.length - 1) {break;}}}}}g.dispose();//保存为jpg/png图片FileOutputStream fos = new FileOutputStream(imageFile);JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos);encoder.encode(image);fos.close();} catch (IOException e) {e.printStackTrace();}//             每行的高    字体大小     行间距         图片的宽度int[] ints = {lineheight, SIZE, (int) (SIZE * 0.2), IMAGE_WIDTH};}private void getInts(double v, int[] ints, int car) {if (car < 10000) {if (car == 32) { //  32英文空格ints[0] = ints[0] + (int) (v * 0.45);ints[2] = ints[2] + (int) (v * 0.45);} else if (car <= 47) {  //  运算符,47是/ints[0] = ints[0] + (int) (v * 0.5);ints[2] = ints[2] + (int) (v * 0.5);} else if (car == 91 || car == 93) {//  91[ 92]ints[0] = ints[0] + (int) (v * 0.4);ints[2] = ints[2] + (int) (v * 0.4);} else if (car < 60) {// 数字ints[0] = ints[0] + (int) (v * 0.7);ints[2] = ints[2] + (int) (v * 0.7);} else if (car > 60 && car < 97) {  //  大写字母ints[0] = ints[0] + (int) (v * 0.75);ints[2] = ints[2] + (int) (v * 0.75);} else if (car == 109) {ints[0] = ints[0] + (int) (v * 0.95);ints[2] = ints[2] + (int) (v * 0.95);} else if (car > 100 && car < 109) {ints[0] = ints[0] + (int) (v * 0.7);ints[2] = ints[2] + (int) (v * 0.7);} else {//  小写字母ints[0] = ints[0] + (int) (v * 0.55);ints[2] = ints[2] + (int) (v * 0.55);}} else if (car < 19967) {//ints[0] = ints[0] + (int) (v * 0.95);ints[2] = ints[2] + (int) (v * 0.95);} else if (19968 <= car && car < 40869) {//                    if (car < 19968 ){//                        ints[0] = ints[0] + (int) (v * 0.9);
//                        ints[2] = ints[2] + (int) (v * 0.9);
//                    }else {ints[0] = ints[0] + (int) v;ints[2] = ints[2] + (int) v;
//                    }} else {ints[0] = ints[0] + (int) v;ints[2] = ints[2] + (int) v;}}//  获取图片的宽高private static void getImgHW(String path) throws IOException {File file = new File(path);BufferedImage bufferedImage = ImageIO.read(new FileInputStream(file));int height = bufferedImage.getHeight();int width = bufferedImage.getWidth();long size = file.length() / 1024;System.out.println(height);System.out.println(width);System.out.println(size);}/*** 获取到图像上下文** @param image 图片* @return Graphics*/private Graphics createGraphics(BufferedImage image) {Graphics g = image.createGraphics();
//        g.setColor(IMAGE_COLOR); //设置背景色
//        g.fillRect(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT);//绘制背景g.setColor(Color.BLACK); //设置前景色Map<TextAttribute, Object> attributes = new HashMap<TextAttribute, Object>();Font font = new Font("微软雅黑", Font.PLAIN, SIZE);//      设置行间距attributes.put(TextAttribute.TRACKING, 0.2);Font font2 = font.deriveFont(attributes);//                                                字体大小g.setFont(font2); //设置字体return g;}}

java生成图片,可设置背景,文本+公式图片+图片相关推荐

  1. EasyExcel导出添加水印(设置背景,非插入图片的方式)

    引言 本文添加水印通过java生成图片,设置为excel背景图片实现.不仅仅局限于EasyExcel,凡是采用POI实现都可以采用该方案,但唯一的局限在于必须使用POI中的XSSFWorkbook对象 ...

  2. java 将 text 文字、文本 内容 转为 图片

    java 将 text 文字.文本 内容 转为 图片 参考了大神的代码,大神的分割算法很精妙,将大神的代码进行了优化,做个留存 大神博客地址:https://xunming.blog.csdn.net ...

  3. JAVA实现可设置背景的MDI窗口

    JAVA实现可设置背景的MDI窗口 我们都知道,MDI(Multiple Document Interface)即多文档界面.使用MDI窗体时,将在一个父窗体内建立工作区,父窗体能够令一个以上的子窗体 ...

  4. java图标中设置背景、文本框设置大小、标签中字体的格式

    ImageIcon icon = new ImageIcon("C:\\Users\\lenovo\\Pictures\\Saved Pictures\\小.jpg");dayBt ...

  5. java的jna电脑桌面背景_获取bing图片并自动设置为电脑桌面背景(使用 URLDownloadToFile API函数)...

    众所周知,bing搜索网站首页每日会更新一张图片,张张漂亮(额,也有一些不合我口味的),特别适合用来做电脑壁纸. 我们想要将bing网站背景图片设置为电脑桌面背景的通常做法是: 上网,搜索bing 找 ...

  6. java给frame设置背景_JAVA设置FRAME背景总结设置背景图片

    Java中有关Frame背景的设置总结 我们在进行图形用户界面编程时,为了做出一个漂亮.个性化的界面,那么界面的背景就必须考虑了.要想灵活使用背景,就一定要对frame的基本有一些了解,因为在java ...

  7. 设置背景图时防止图片拉伸的解决方法

    在设置背景图时,如果图片不够大会被拉伸,使图片失真,如果图片太大会对view控件的显示造成影响. 如果只是在ImageView中设置图片的话,在程式中可以利用setScaleType进行动态设定,在x ...

  8. java原生的Graphics2D_背景图上添加图片

    1.初始化 public void init(){private String backgroundImgPath="背景图片位置";private String contentI ...

  9. java swing 图片容器_Java Swing中两种设置背景图(容器图片)

    在java swing中需要为容器添加图片,或者背景图片. 提供两种简单的解决方案,一种利用JPanel,另一种利用JLabel 1.JPanel(源代码) package oo; import ja ...

  10. 在java代码中设置TextView文本内容可滚动

    TextView scrollTv = (TextView) findViewById(R.id.tv_scroll); scrollTv.setMovementMethod(ScrollingMov ...

最新文章

  1. python 中if __name__ = '__main__' 的作用
  2. 在EXCEL里如何输入X的平方
  3. win7系统下载 ghost win7 Sp1 64位纯净3月版
  4. 聊聊程序员的成长与价值提升
  5. 【树状数组】CF961E Tufurama
  6. 同样是卖票,为啥阿里卖电影票就不卡?技术上做了啥???
  7. linux vi刷新页面,vim的神级配置 - bubifengyun的个人页面 - OSCHINA - 中文开源技术交流社区...
  8. 【英语学习】【Level 07】U03 Amazing wonders L4 The Qin Dynasty legacy
  9. ehcache springboot_Spring Boot 入门示例合集(附源代码)
  10. MySQL sleep函数使用详解
  11. 面经 |算法工程师面试题汇总分享
  12. C++伪(pseudo)随机数生成及简单应用
  13. macOS Big Sur的小部件使用技巧
  14. 拓端tecdat|R语言极值理论EVT:基于GPD模型的火灾损失分布分析
  15. win7系统怎么用计算机,win7电脑配置怎么查看_win7系统查看电脑配置的方法
  16. hdoj2084:数塔(dp基础题----递归写法/状态转移方程法)
  17. app逆向 安卓开发环境搭建
  18. 爬虫 第七讲 MongoDB
  19. APFNet训练+测试复现过程记录
  20. 操作系统学习笔记(五)---进程同步

热门文章

  1. git-cz 一款git commit 统一规范的工具
  2. 集线器等(概念,工作原理,以及,应用场景)
  3. 论文分享:基于深度强化学习的无人机三维导航
  4. L2-3 清点代码库 (25 分)(C/C++)
  5. [UOJ198][CTSC2016]时空旅行
  6. fractions -- 分数
  7. 讲讲Python爬虫绕过登录的小技巧
  8. 短线王的盯盘宝怎么样_短线王炒股十大技巧!
  9. 预先下载的keras库中神经网络模型指定存放路径及如何上传的问题
  10. 服务器dnf虚拟机多开吃显存吗,安卓模拟器多开对显卡有没有什么要求?