首页 > 其他分享 >基于hutool的图片合成工具类

基于hutool的图片合成工具类

时间:2023-07-28 18:25:13浏览次数:39  
标签:基于 java int 合成 hutool param import return image

import lombok.Data;

import java.io.Serializable;
import java.util.List;

/**
 * @description 缩略图信息DTO
 */
@Data
public class ThumbnailInfoDTO implements Serializable {

    /** 背景图片 */
    private String baseImageUrl;

    /** 背景图款 */
    private Integer baseWidth;

    /** 背景图高 */
    private Integer baseHeight;

    /** 水印图片 */
    private List<WatermarkImage> wmImageList;

    @Data
    public static class WatermarkImage implements Serializable {

        /** 上偏移 */
        private Integer top;

        /** 左偏移 */
        private Integer left;

        /** 图宽 */
        private Integer width;

        /** 图高 */
        private Integer height;

        /** 图片地址 */
        private String imageUrl;

    }

}
import cn.hutool.core.img.ImgUtil;
import cn.hutool.core.util.URLUtil;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

/**
 * @description 图片工具类
 */
public class ImageUtils {

    /**
     * 获取图片
     * @param imageUrl 图片地址
     * @return java.awt.image.BufferedImage
     */
    public static BufferedImage getImage(String imageUrl, int width, int height) {
        try {
            URL imgUrl = URLUtil.url(imageUrl);
            BufferedImage image = ImgUtil.read(imgUrl);
            int w = image.getHeight();
            int h = image.getWidth();
            if (w == width && h == height) {
                return image;
            }
            Image scaleImg = ImgUtil.scale(image, width, height);
            return ImgUtil.toBufferedImage(scaleImg);
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 获取纯色图片
     * @param width  宽
     * @param height 高
     * @param color  颜色
     * @return java.awt.image.BufferedImage
     */
    public static BufferedImage getSolidImage(int width, int height, Color color) {
        BufferedImage image = new BufferedImage(width, height, 1);
        Graphics g = image.getGraphics();
        g.setColor(color);
        g.fillRect(0, 0, width, height);
        g.dispose();
        return image;
    }

    /**
     * 获取图片流
     * @param image 图片
     * @return java.io.InputStream
     */
    public static InputStream getInputStream(Image image) {
        return ImgUtil.toStream(image, ImgUtil.IMAGE_TYPE_PNG);
    }

    /**
     * 生成图片
     * @param image 图片
     * @param file  文件
     */
    public static void getFile(Image image, File file) {
        ImgUtil.write(image, file);
    }

    /**
     * 图片合成
     * @param baseImg 基础图片
     * @param wmImg   水印图片
     * @param top     上偏移
     * @param left    左偏移
     * @return java.awt.Image
     */
    public static Image composite(BufferedImage baseImg, BufferedImage wmImg, int top, int left) {
        int x1 = baseImg.getWidth() / 2;
        int y1 = baseImg.getHeight() / 2;
        int x2 = wmImg.getWidth() / 2;
        int y2 = wmImg.getHeight() / 2;
        int x = (x2 + left) - x1;
        int y = (y2 + top) - y1;
        return ImgUtil.pressImage(baseImg, wmImg, x, y, 1f);
    }

    /**
     * 图片合成
     * @param thumbnailInfoDTO	缩略图信息
     * @return java.awt.Image
     */
    public static Image composite(ThumbnailInfoDTO thumbnailInfoDTO) {
        String baseImageUrl = thumbnailInfoDTO.getBaseImageUrl();
        int baseWidth = thumbnailInfoDTO.getBaseWidth() - 5;
        int baseHeight = thumbnailInfoDTO.getBaseHeight() - 5;
        BufferedImage baseImg = getImage(baseImageUrl, baseWidth, baseHeight);
        if (baseImg == null) {
            baseImg = getSolidImage(baseWidth, baseHeight, Color.white);
        }

        int x1 = baseImg.getWidth() / 2;
        int y1 = baseImg.getHeight() / 2;

        // 目标图片
        Image destImg = baseImg;
        List<WatermarkImage> wmImageList = thumbnailInfoDTO.getWmImageList();
        for (WatermarkImage watermarkImage : wmImageList) {
            String imageUrl = watermarkImage.getImageUrl();
            Integer width = watermarkImage.getWidth();
            Integer height = watermarkImage.getHeight();
            int left = watermarkImage.getLeft();
            int top = watermarkImage.getTop();
            BufferedImage wmImg = getImage(imageUrl, width, height);
            if (wmImg == null) {
                wmImg = getSolidImage(width - 5, height - 5, Color.gray);
            }
            int x2 = wmImg.getWidth() / 2;
            int y2 = wmImg.getHeight() / 2;

            int x = (x2 + left) - x1;
            int y = (y2 + top) - y1;
            destImg = ImgUtil.pressImage(destImg, wmImg, x, y, 1f);
        }
        return destImg;
    }

    public static void main(String[] args) {
        File destFile = new File("C:\\Users\\Administrator\\Desktop\\dest.png");
        ThumbnailInfoDTO thumbnailInfoDTO = new ThumbnailInfoDTO();
        thumbnailInfoDTO.setBaseImageUrl(null);
        thumbnailInfoDTO.setBaseWidth(1000);
        thumbnailInfoDTO.setBaseHeight(500);
        List<WatermarkImage> list = new ArrayList<>();
        thumbnailInfoDTO.setWmImageList(list);
        WatermarkImage img1 = new WatermarkImage();
        img1.setImageUrl(null);
        img1.setTop(0);
        img1.setLeft(0);
        img1.setWidth(500);
        img1.setHeight(250);
        list.add(img1);
        WatermarkImage img4 = new WatermarkImage();
        img4.setImageUrl(null);
        img4.setTop(250);
        img4.setLeft(0);
        img4.setWidth(500);
        img4.setHeight(250);
        list.add(img4);
        WatermarkImage img2 = new WatermarkImage();
        img2.setImageUrl(null);
        img2.setTop(0);
        img2.setLeft(500);
        img2.setWidth(500);
        img2.setHeight(250);
        list.add(img2);
        WatermarkImage img3 = new WatermarkImage();
        img3.setImageUrl(null);
        img3.setTop(250);
        img3.setLeft(500);
        img3.setWidth(500);
        img3.setHeight(250);
        list.add(img3);
        Image image2 = composite(thumbnailInfoDTO);
        getFile(image2, destFile);
    }

}

标签:基于,java,int,合成,hutool,param,import,return,image
From: https://www.cnblogs.com/huanruke/p/17588598.html

相关文章

  • 基于 Kubernetes 部署 MySQL 数据库
    本文将介绍如何基于Kubernetes部署MySQL数据库。创建服务Service创建一个Service为即将部署的MySQL数据库固定连接的IP,同时提供负载均衡,下面是mysql-service.yaml文件的内容: yaml复制代码apiVersion:v1kind:Servicemetadata:name:mysqlspec:s......
  • 某制造企业基于 KubeSphere 的云原生实践
    背景介绍随着业务升级改造与软件产品专案的增多,常规的物理机和虚拟机方式逐渐暴露出一些问题:大量服务部署在虚拟机上,资源预估和硬件浪费较大;大量服务部署在虚拟机上,部署时间和难度较大,自动化程度较低;开发人员和运维人员,由于开发和部署服务环境不同,服务不稳定经常报错,产生的隔阂问题......
  • 5-Ngnix配置基于用户访问控制和IP的虚拟主机
    Nginx配置文件在/usr/local/nginx/conf下,文件名为nginx.conf5.1.Ngnix配置基于用户访问控制的多虚拟主机5.1.1.前提条件Ngnix配置基于用户访问控制的多虚拟主机时,需要使用htpasswd命令,需要安装httpd-toolsrpm命令:yuminstall-yhttpd-tools[root@cent79-2~]#yuminstall-yhtt......
  • 最后的组合:K8s 1.24 基于 Hekiti 实现 GlusterFS 动态存储管理实践
    前言知识点定级:入门级GlusterFS和Heketi简介GlusterFS安装部署Heketi安装部署Kubernetes命令行对接GlusterFS实战服务器配置(架构1:1复刻小规模生产环境,配置略有不同)主机名IPCPU内存系统盘数据盘用途ks-master-0192.168.9.912450100KubeS......
  • 基于PyQt5实现聊天窗口
    本文仅为示例,用于参考,功能并不完整主要实现以下功能:1.重写PlainTextEdit组件实现类似微信ctrl+enter换行,enter发送信息操作2.带头像的消息气泡创建3.消息气泡的自适应大小窗口布局(详细可以通过示例代码中的.ui进行查看)代码获取地址GitHub:PyQt5-Chat-Demo百度网盘:http......
  • 基于物联网、视频监控与AI视觉技术的智慧电厂项目智能化改造方案
    一、项目背景现阶段,电力行业很多企业都在部署摄像头对电力巡检现场状况进行远程监控,但是存在人工查看费时、疲劳、出现问题无法第一时间发现等管理弊端,而且安全事件主要依靠人工经验判断分析、管控,效率十分低下。为解决上述问题,行业需要建立全新的安全管理模式,通过AI、5G传输、......
  • 基于双目人脸图像ORB特征提取匹配的人脸三维点云提取和建模的matlab仿真
    1.算法理论概述      三维人脸建模是计算机视觉领域的一个重要研究方向。传统的人脸建模方法通常基于单张图像,难以准确地获取人脸的三维信息。而基于双目图像的人脸建模方法则可通过多视角的信息获取,实现更加精确的三维人脸建模。本文提出了一种基于双目人脸图像ORB特征提......
  • m基于OFDM+QPSK和turbo编译码以及MMSE信道估计的无线图像传输matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:    2.算法涉及理论知识概要       基于OFDM+QPSK和Turbo编码以及MMSE信道估计的无线图像传输是一种高效可靠的无线通信系统,广泛应用于图像传输领域。该系统利用正交频分复用(OFDM)技术,将图像数据分成多个子载波进行传输,......
  • m基于OFDM+QPSK和turbo编译码以及LS信道估计的无线图像传输matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:   2.算法涉及理论知识概要       正交频分复用(OFDM)技术将图像数据分成多个子载波进行传输,使用QPSK调制对信号进行调制,通过Turbo编码增强信号的纠错能力,并采用LS信道估计技术来估计信道状态。 系统原理:    ......
  • 基于社交网络爬虫的人物兴趣属性分析(四)
    首先我们前三篇完成了这样的工作:选取目标网络——2个,分别是微博和推特,选取的理由:平台类型相似,用户交集大,选取多个社交网络则是因为单一社交网络的数据偶然性和误差性大,所以必须要做多个数据的结合;整个项目的步骤为:多个社交网路的数据爬取——>单个社交网络的数据分析——>多个社交......