Java图片拼接

ops/2024/12/23 6:33:43/

最近遇到一个挺离谱的功能,某个表单只让上传一张图,多图上传会使导出失败。跟开发沟通后表示,这个问题处理不了。我...

遂自己思考,能否以曲线救国的方式拯救一下,即不伤及代码之根本,又能解决燃眉之急。灵光一闪,想到了美图救救的图片拼接功能。于是就想着尝试一下是否可行。

考虑到图片拼接界限等,目标实现:白色图片背景(默认是黑色),以最大图片的宽为最终拼接图片的宽,图片纵向拼接,图与图之间间隔35px。代码如下(异常捕获、空值判断、权限判断等需自行完善):

java">import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;@RestController
public class ImagePinJie {@PostMapping("/imgPinJie")public String imageUpload(@RequestParam("files") MultipartFile[] files) throws IOException {if (files.length == 0) {return "没有文件被上传";}List<BufferedImage> bufferedImages = new ArrayList<>();List<Integer> widths = new ArrayList<>();List<Integer> heights = new ArrayList<>();for (MultipartFile file : files) {if (!file.isEmpty()) {try {BufferedImage bi = ImageIO.read(file.getInputStream());bufferedImages.add(bi);widths.add(bi.getWidth());heights.add(bi.getHeight());} catch (Exception e) {return "上传失败: " + e.getMessage();}}}BufferedImage bufferedImage = imgPinJie(bufferedImages, widths, heights);createImage(bufferedImage);return "上传成功";}public BufferedImage imgPinJie(List<BufferedImage> bufferedImages, List<Integer> widths, List<Integer> heights) {int maxWidth = widths.stream().mapToInt(Integer::intValue).max().getAsInt();int totalHeight = heights.stream().mapToInt(Integer::intValue).sum() + (heights.size() - 1) * 35;BufferedImage bufferedImage = new BufferedImage(maxWidth, totalHeight, BufferedImage.TYPE_INT_RGB);int offset = 0;Graphics2D graphics = bufferedImage.createGraphics();graphics.setColor(Color.WHITE);graphics.fillRect(0, 0, maxWidth, totalHeight);for(BufferedImage bi : bufferedImages) {graphics.drawImage(bi, 0, offset, bi.getWidth(), bi.getHeight(), null);offset += bi.getHeight() + 35;}graphics.dispose();return bufferedImage;}public void createImage(BufferedImage bufferedImage) throws IOException {File file = new File("C:/Users/iTcys/Pictures/pinjie.png");ImageIO.write(bufferedImage, "png", file);}
}

接口测试

最终效果

至此,图片拼接完成了,接下来准备研究一下前端拼接的方式。


http://www.ppmy.cn/ops/144241.html

相关文章

使用Python实现量子计算算法开发:探索计算的未来

量子计算作为一种全新的计算范式&#xff0c;正在逐步改变我们的计算方式。与经典计算机依赖比特&#xff08;bits&#xff09;进行信息处理不同&#xff0c;量子计算机使用量子比特&#xff08;qubits&#xff09;进行计算&#xff0c;这使得量子计算在处理某些复杂问题上具有…

5G 模组 RG500Q常用AT命令

5G 模组 RG500Q常用AT命令 5G 模组 RG500Q常用AT命令 at ATQNWPREFCFG\"mode_pref\",nr5g && sleep 1 at ATQNWPREFCFG\"nr5g_band\",79 && sleep 1 at atqnwlock\"commo…

数字化制造新生态:共话无代码+AI落地实践

在数字化浪潮席卷各行各业的今天&#xff0c;制造业正迎来前所未有的变革机遇。 如何借助数字化工具实现降本增效&#xff1f; 如何通过技术革新打破传统经营管理的瓶颈&#xff1f; 来自轻流、明洋灵动、酷家乐等企业的多位专家于12月13日&#xff0c;在由轻流与明洋数据联…

mongodb应用心得

基于springboot做mysql业务基础数据分析到mongodb文档库 索引分析 查看当前集合索引&#xff1a;db.collection.getIndexes() explain 方法查看是如何执行的&#xff1a;db.users.find({ name: “John” }).sort({ age: -1 }).explain(“executionStats”) 参数指标&#xff1…

从零开始学TiDB(6)深入学习Placement Driver(PD)

一.PD整体架构 PD的功能&#xff1a; 元数据的存储&#xff08;解决执行计划如何得知去哪个region中获取数据&#xff09;全局时钟&#xff1a;查询开始时间&#xff0c;事务开始&#xff0c;结束的时间。分配全局ID和事务ID对region进行调度&#xff08;热点region的调度处理&…

【力扣算法】203.移除链表元素

在对链表进行操作的时候&#xff0c;可以考虑添加虚拟头结点 1. 虚拟头结点 设置虚拟头结点&#xff0c;让头结点的next指向head class Solution{public ListNode removeElements(ListNode head,int val){ListNode pre new ListNode();pre.next head;ListNode index pre;w…

使用Python实现量子密钥分发:构建安全通信的未来

量子密钥分发&#xff08;Quantum Key Distribution, QKD&#xff09;是一种利用量子力学原理进行密钥分发的方法&#xff0c;能够实现无条件安全的密钥传输。QKD是量子通信中的重要应用&#xff0c;通过量子比特&#xff08;qubits&#xff09;的传输和测量&#xff0c;实现安…

【LeetCode】9、回文数

【LeetCode】9、回文数 文章目录 一、数学: 除法和取模1.1 数学: 除法和取模 二、多语言解法 一、数学: 除法和取模 1.1 数学: 除法和取模 例如 15251, offset 也是五位数的 10000 先判断首1和尾1, 再变为 525, offset 变为 100 再判断首5和尾5, 再变为 2, offset 变为 1 整个…