Java使用html2image将html生成缩略图图片的实现示例

 更新时间:2023年12月04日 09:30:28   作者:我是唐赢  
本文主要介绍了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 distortion
            double 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;
    }



}

到此这篇关于Java使用html2image将html生成缩略图图片的实现示例的文章就介绍到这了,更多相关Java 生成缩略图图片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • SpringSecurity中的UserDetails和UserDetailsService接口详解

    SpringSecurity中的UserDetails和UserDetailsService接口详解

    这篇文章主要介绍了SpringSecurity中的UserDetails和UserDetailsService接口详解,UserDetailsService 在 Spring Security 中主要承担查询系统内用户、验证密码、封装用户信息和角色权限,需要的朋友可以参考下
    2023-11-11
  • 深入理解Mybatis一级缓存

    深入理解Mybatis一级缓存

    客户端向数据库服务器发送同样的sql查询语句,如果每次都去访问数据库,会导致性能的降低,那么怎么提高呢?下面小编给大家分享下mybatis为我们提供了一级缓存的策略
    2016-12-12
  • spring-cloud Sleuth的使用方法

    spring-cloud Sleuth的使用方法

    这篇文章主要介绍了spring-cloud Sleuth的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-02-02
  • Caffeine本地缓存示例详解

    Caffeine本地缓存示例详解

    Caffeine是一种高性能的缓存库,是基于Java 8的最佳(最优)缓存框架,这篇文章主要介绍了Caffeine本地缓存相关知识,需要的朋友可以参考下
    2023-07-07
  • Java成员变量的隐藏(实例讲解)

    Java成员变量的隐藏(实例讲解)

    下面小编就为大家带来一篇Java成员变量的隐藏(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Java多线程案例实战之定时器的实现

    Java多线程案例实战之定时器的实现

    在Java中可以使用多线程和定时器来实现定时任务,下面这篇文章主要给大家介绍了关于Java多线程案例之定时器实现的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • Java 8中如何获取参数名称的方法示例

    Java 8中如何获取参数名称的方法示例

    这篇文章主要给大家介绍了在Java 8中如何获取参数名称的方法,文中给出了详细的介绍和方法示例,相信对大家的理解和学习具有一定的参考借鉴价值,有需要的朋友可以参考学习,下面来一起看看吧。
    2017-01-01
  • Android中比较常见的Java super关键字

    Android中比较常见的Java super关键字

    这篇文章主要为大家介绍了Android中比较常见的Java super关键字,具有一定的学习参考价值,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • java中线程池最实用的创建与关闭指南

    java中线程池最实用的创建与关闭指南

    试中经常会问到,创建一个线程池需要哪些参数啊,线程池的工作原理啊,却很少会问到线程池如何安全关闭的,下面这篇文章主要给大家介绍了关于java中线程池最实用的创建与关闭的相关资料,需要的朋友可以参考下
    2021-09-09
  • 详解Java并发编程之内置锁(synchronized)

    详解Java并发编程之内置锁(synchronized)

    这篇文章主要介绍了Java并发编程之内置锁(synchronized)的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03

最新评论