Java图片拼接

devtools/2024/12/22 21:54:31/

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

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

考虑到图片拼接界限等,目标实现:白色图片背景(默认是黑色),以最大图片的宽为最终拼接图片的宽,图片纵向拼接,图与图之间间隔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/devtools/144488.html

相关文章

【计算机网络2】计算机网络的性能能指标

目录 一 、计算机网络的性能指标 二、具体介绍 1、速 率 2、带 宽 3、吞 吐 量 4、时 延 5、时延带宽积 6、往 返 时 延 7、信道利用率 一 、计算机网络的性能指标 计算机网络的性能指标就是从不同方面度量计算机网络的性能&#xff0c;有如下7个指标&#xff1a; 速…

易快报-飞书-金蝶云星空集成项目技术分享

本文深入探讨了浙江某科技集团有限公司如何通过技术集成实现易快报、飞书和金蝶云星空的数据对接&#xff0c;重点分析了项目在安全性、时效性和细节处理方面的技术实现&#xff0c;并展示了项目成果。 1. 企业背景 浙江某科技集团有限公司&#xff0c;作为一家专注于新能源应…

Vue3之路由(Router)介绍

在构建单页面应用&#xff08;SPA&#xff09;时&#xff0c;我们需要一种有效的方式来处理不同的视图&#xff08;页面&#xff09;之间的导航&#xff0c;而无需重新加载整个页面。Vue.js 提供了一个官方的路由库 Vue Router&#xff0c;正是为了解决这一问题。Vue Router 使…

wpf mvvm 数据绑定数据(按钮文字表头都可以),根据长度进行换行,并把换行的文字居中

今天遇到了一个问题&#xff0c;就是数据表头按钮的文字换行后不能居中&#xff0c;如何查找资料后&#xff0c;也是挺简单的&#xff0c;就是绑定控件的文字&#xff0c;进行进行操作&#xff0c;下来我们以按钮为例。 在WPF中使用MVVM模式时&#xff0c;可以通过绑定按钮的文…

牛客网 SQL36查找后排序

SQL36查找后排序 select device_id,age from user_profile order by age asc #select [字段1,字段2] from [表名] order by [字段1] [升序(asc)/降序(desc)],[字段2] [升序(asc)/降序(desc)] #select&#xff1a;查询 #order by 排序 每日问题 如何实现对象的克隆&#xff1…

一般行业安全管理人员考试题库分享

1.在高速运转的机械飞轮外部安装防护罩&#xff0c;属于(B)安全技术措施。 A.限制能量 B.隔离 C.故障设计 D.设置薄弱环节 2.生产经营单位的(B)是本单位安全生产的第一责任人&#xff0c;对落实本单位安全生产主体责任全面负责&#xff0c;具体履行安全生产管理职责。 A.全员 B…

从想法到实践:Excel 转 PPT 应用的诞生之旅

2024 年 11 月&#xff0c;我着手开发了一款exe应用&#xff0c;其主要功能是读取 Excel 文件中的数据&#xff0c;并生成 PPT 文件。 这款应用看似简单&#xff0c;却给我的商业认知带来了深刻的启发。此前&#xff0c;我与一位老师合作&#xff0c;为其处理 Excel 转 PPT 的…

AI程序员,开源的Devin,OpenHands 如何使用HuggingFace Inference API

我用了一下&#xff0c;界面这样子&#xff1a; Github&#xff1a;https://github.com/All-Hands-AI/OpenHands OpenHands 如何使用HuggingFace Inference API huggingface/meta-llama/Llama-3.3-70B-Instruct 而不是 meta-llama/Llama-3.3-70B-Instruct 不要设置base URL&…