当前位置: 首页 > news >正文

Java 使用html2image将html生成缩略图图片

POM文件添加Maven依赖

		<dependency><groupId>gui.ava</groupId><artifactId>html2image</artifactId><version>0.9</version></dependency>

主要代码:

        String coverPath = null;try {HtmlImageGenerator imageGenerator = new HtmlImageGenerator();imageGenerator.loadHtml(lzDocs.getContent());//也可以根据html url引用 loadUrl的方式加载Thread.sleep(1000); //有时会有加载图片延迟,因此这里设置下延时BufferedImage cover = imageGenerator.getBufferedImage();//获取图片cover = ImageUtils.getCoverImage(cover);//将图片转成综略图String coverName = UUIDGenerator.generate().toString() + ".png";MultipartFile mpFile = FileUtils.imageToMpFile(cover, coverName);coverPath = sysBaseAPI.upload(mpFile,"cover", uploadType);//上传文件到服务器} catch (Exception e) {e.printStackTrace();}

图片工具类,供主要代码调用

public class ImageUtils {/*** bufferedImage转InputStream*/public static InputStream bufferedImageToInputStream(BufferedImage image) {ByteArrayOutputStream os = new ByteArrayOutputStream();try {ImageIO.write(image, "png", os);InputStream input = new ByteArrayInputStream(os.toByteArray());return input;} catch (IOException e) {}return null;}/*** 获取图片大小信息*/public static Rectangle getImgRect(BufferedImage image) throws IOException {Iterator readers = ImageIO.getImageReadersByFormatName("png");ImageReader reader = (ImageReader) readers.next();InputStream source = bufferedImageToInputStream(image);ImageInputStream iis = ImageIO.createImageInputStream(source);reader.setInput(iis, true);int imageIndex = 0;return new Rectangle(0, 0, reader.getWidth(imageIndex), reader.getHeight(imageIndex));}/*** 图片裁剪,按指定大小裁剪*/public static BufferedImage imageCut(BufferedImage image, Rectangle rect) throws IOException {// 取得图片读入器Iterator readers = ImageIO.getImageReadersByFormatName("png");System.out.println(readers);ImageReader reader = (ImageReader) readers.next();System.out.println(reader);// 取得图片读入流InputStream source = bufferedImageToInputStream(image);ImageInputStream iis = ImageIO.createImageInputStream(source);reader.setInput(iis, true);// 图片参数ImageReadParam param = reader.getDefaultReadParam();int imageIndex = 0;//Rectangle rect = new Rectangle(0, 0, reader.getWidth(imageIndex), 100);param.setSourceRegion(rect);BufferedImage bi = reader.read(0, param);iis.close();source.close();return bi;}/*** 压缩图片,用于高质量图片质量降低,改变图片大小*/public static BufferedImage compressImage(BufferedImage imageByte, int ppi) {BufferedImage smallImage = null;int width = 0, height = 0;if (imageByte == null)return null;InputStream byteInput = bufferedImageToInputStream(imageByte);try {Image image = ImageIO.read(byteInput);int w = image.getWidth(null);int h = image.getHeight(null);// adjust weight and height to avoid image distortiondouble scale = 0;scale = Math.min((float) ppi / w, (float) ppi / h);width = (int) (w * scale);width -= width % 4;height = (int) (h * scale);if (scale >= (double) 1)return imageByte;BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);buffImg.getGraphics().drawImage(image.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);//ByteArrayOutputStream out = new ByteArrayOutputStream();//ImageIO.write(buffImg, "png", out);smallImage = buffImg;} catch (IOException e) {e.printStackTrace();}return smallImage;}/*** 将BufferedImage转换为byte[]* @param image* @return*/public static byte[] bufferedImageToByteArray(BufferedImage image) throws IOException{ByteArrayOutputStream os = new ByteArrayOutputStream();ImageIO.write(image, "png", os);return os.toByteArray();}/*** 将BufferedImage转换pdf*/public static String imageToPdf(List<BufferedImage> images) throws IOException {log.info("图片转pdf开始===============");String newFile = StrUtil.uuid().replace("-", "") + ".pdf";PdfWriter pdfWriter = new PdfWriter( newFile);PdfDocument pdfDocument = new PdfDocument(pdfWriter);Document document = new Document(pdfDocument);for (BufferedImage image : images) {byte[] data = bufferedImageToByteArray(image);com.itextpdf.layout.element.Image img = new com.itextpdf.layout.element.Image(ImageDataFactory.createPng(data));document.add(img);}document.close();log.info("图片转pdf结束===============");return newFile;}/*** 获取缩略图图片,用作封面,按长宽比例设备,高度太高裁掉,高度太低补余白*/public static BufferedImage getCoverImage (BufferedImage originalImage) throws IOException {BufferedImage result = null;// 获取图片的长宽int originalWidth = originalImage.getWidth();int originalHeight = originalImage.getHeight();Rectangle rect = ImageUtils.getImgRect(originalImage);if (rect.getHeight() > rect.getWidth()) {rect.setRect(0,0, rect.getWidth(), rect.getWidth() / 1.3);result = ImageUtils.imageCut(originalImage, rect);} else {int newWidth = 800;int newHeight = 600;// 计算缩放比例double scale = Math.min((double) newWidth / originalWidth, (double) newHeight / originalHeight);// 计算调整后的长宽int scaledWidth = (int) (originalWidth * scale);int scaledHeight = (int) (originalHeight * scale);// 创建新的BufferedImage对象,添加余白BufferedImage resizedImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);Graphics2D g = resizedImage.createGraphics();Color fillColor = new Color(255, 255, 255); // 白颜色g.setColor(fillColor);g.fillRect(0, 0, newWidth, newHeight);g.drawImage(originalImage, 0, 0, scaledWidth, scaledHeight, null);g.dispose();result = resizedImage;}return result;}}

相关文章:

  • Liunx Centos 防火墙操作
  • ingress介绍和ingress通过LoadBalancer暴露服务配置
  • 第一百九十三回 滚动布局的使用示例
  • HTTP、HTTPS、SSL协议以及报文讲解
  • GO设计模式——13、享元模式(结构型)
  • MAC PHP版本安装问题
  • MySQL数据库从小白到入门(二)
  • 2023年5个自动化EDA库推荐
  • Elasticsearch 8.9 flush刷新缓存中的数据到磁盘源码
  • Unity 状态系统
  • 题目:纪念品分组(蓝桥OJ 532)
  • 二百一十、Hive——Flume采集的JSON数据文件写入Hive的ODS层表后字段的数据残缺
  • 玩转大数据10:深度学习与神经网络在大数据中的应用
  • B树你需要了解一下
  • 【python、opencv】opencv仿射变换原理及代码实现
  • SegmentFault for Android 3.0 发布
  • [deviceone开发]-do_Webview的基本示例
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 2018一半小结一波
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • E-HPC支持多队列管理和自动伸缩
  • HTML5新特性总结
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JavaScript创建对象的四种方式
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • oldjun 检测网站的经验
  • Redux 中间件分析
  • 蓝海存储开关机注意事项总结
  • 聊聊flink的TableFactory
  • 通过npm或yarn自动生成vue组件
  • 项目实战-Api的解决方案
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 云大使推广中的常见热门问题
  • hi-nginx-1.3.4编译安装
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • !!Dom4j 学习笔记
  • #define,static,const,三种常量的区别
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (4)STL算法之比较
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)linux下的时间函数使用
  • (转)可以带来幸福的一本书
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .net6+aspose.words导出word并转pdf
  • .NET面试题(二)