java生成图片,可设置背景,文本+公式图片+图片
三个对外方法实现功能
// 设置图片样式 长度 高度 背景色 设置背景,为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生成图片,可设置背景,文本+公式图片+图片相关推荐
- EasyExcel导出添加水印(设置背景,非插入图片的方式)
引言 本文添加水印通过java生成图片,设置为excel背景图片实现.不仅仅局限于EasyExcel,凡是采用POI实现都可以采用该方案,但唯一的局限在于必须使用POI中的XSSFWorkbook对象 ...
- java 将 text 文字、文本 内容 转为 图片
java 将 text 文字.文本 内容 转为 图片 参考了大神的代码,大神的分割算法很精妙,将大神的代码进行了优化,做个留存 大神博客地址:https://xunming.blog.csdn.net ...
- JAVA实现可设置背景的MDI窗口
JAVA实现可设置背景的MDI窗口 我们都知道,MDI(Multiple Document Interface)即多文档界面.使用MDI窗体时,将在一个父窗体内建立工作区,父窗体能够令一个以上的子窗体 ...
- java图标中设置背景、文本框设置大小、标签中字体的格式
ImageIcon icon = new ImageIcon("C:\\Users\\lenovo\\Pictures\\Saved Pictures\\小.jpg");dayBt ...
- java的jna电脑桌面背景_获取bing图片并自动设置为电脑桌面背景(使用 URLDownloadToFile API函数)...
众所周知,bing搜索网站首页每日会更新一张图片,张张漂亮(额,也有一些不合我口味的),特别适合用来做电脑壁纸. 我们想要将bing网站背景图片设置为电脑桌面背景的通常做法是: 上网,搜索bing 找 ...
- java给frame设置背景_JAVA设置FRAME背景总结设置背景图片
Java中有关Frame背景的设置总结 我们在进行图形用户界面编程时,为了做出一个漂亮.个性化的界面,那么界面的背景就必须考虑了.要想灵活使用背景,就一定要对frame的基本有一些了解,因为在java ...
- 设置背景图时防止图片拉伸的解决方法
在设置背景图时,如果图片不够大会被拉伸,使图片失真,如果图片太大会对view控件的显示造成影响. 如果只是在ImageView中设置图片的话,在程式中可以利用setScaleType进行动态设定,在x ...
- java原生的Graphics2D_背景图上添加图片
1.初始化 public void init(){private String backgroundImgPath="背景图片位置";private String contentI ...
- java swing 图片容器_Java Swing中两种设置背景图(容器图片)
在java swing中需要为容器添加图片,或者背景图片. 提供两种简单的解决方案,一种利用JPanel,另一种利用JLabel 1.JPanel(源代码) package oo; import ja ...
- 在java代码中设置TextView文本内容可滚动
TextView scrollTv = (TextView) findViewById(R.id.tv_scroll); scrollTv.setMovementMethod(ScrollingMov ...
最新文章
- python 中if __name__ = '__main__' 的作用
- 在EXCEL里如何输入X的平方
- win7系统下载 ghost win7 Sp1 64位纯净3月版
- 聊聊程序员的成长与价值提升
- 【树状数组】CF961E Tufurama
- 同样是卖票,为啥阿里卖电影票就不卡?技术上做了啥???
- linux vi刷新页面,vim的神级配置 - bubifengyun的个人页面 - OSCHINA - 中文开源技术交流社区...
- 【英语学习】【Level 07】U03 Amazing wonders L4 The Qin Dynasty legacy
- ehcache springboot_Spring Boot 入门示例合集(附源代码)
- MySQL sleep函数使用详解
- 面经 |算法工程师面试题汇总分享
- C++伪(pseudo)随机数生成及简单应用
- macOS Big Sur的小部件使用技巧
- 拓端tecdat|R语言极值理论EVT:基于GPD模型的火灾损失分布分析
- win7系统怎么用计算机,win7电脑配置怎么查看_win7系统查看电脑配置的方法
- hdoj2084:数塔(dp基础题----递归写法/状态转移方程法)
- app逆向 安卓开发环境搭建
- 爬虫 第七讲 MongoDB
- APFNet训练+测试复现过程记录
- 操作系统学习笔记(五)---进程同步
热门文章
- git-cz 一款git commit 统一规范的工具
- 集线器等(概念,工作原理,以及,应用场景)
- 论文分享:基于深度强化学习的无人机三维导航
- L2-3 清点代码库 (25 分)(C/C++)
- [UOJ198][CTSC2016]时空旅行
- fractions -- 分数
- 讲讲Python爬虫绕过登录的小技巧
- 短线王的盯盘宝怎么样_短线王炒股十大技巧!
- 预先下载的keras库中神经网络模型指定存放路径及如何上传的问题
- 服务器dnf虚拟机多开吃显存吗,安卓模拟器多开对显卡有没有什么要求?