图片叠加

  • 一. 功能目标
  • 二. 代码实现
    • 2.1 依赖
    • 2.2 图片叠加服务

一. 功能目标

现有一张背景图片,一张水印图片,希望将水印图片叠加到背景图片上方的指定位置。

本代码基于Spring boot框架搭建而成,外部发起请求,可以下载到合成后的图片。

注意:

  1. 合成图片的难点不在代码,而在寻找素材。底图和水印图片的尺寸一定要固定。
  2. 只有不断地调试水印图片在底图上的坐标,才能使得合成后的图片更加自然。
  3. 如有必要,可以适当的缩放图片。
  • 背景图片:
  • 水印图片:
  • 希望实现的效果:

二. 代码实现

2.1 依赖

maven:

 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.9.RELEASE</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional><scope>provided</scope></dependency></dependencies>

2.2 图片叠加服务

  • 合成图片 入口方法
public File generate() throws IOException{// 底图File sourceFile = new File(this.getClass().getResource("/background.png").getFile());// 水印图片File waterFile = new File(this.getClass().getResource("/studentHead.png").getFile());// 最终合成String finalFilePath = waterFile.getParentFile().getAbsolutePath() + File.separator + "idPhoto.png";// 本次合成之前,删除上一次请求合成后留下的图片deleteFile(new File(finalFilePath));BufferedImage buffImg = watermark(sourceFile, waterFile, 1.0f);generateWaterFile(buffImg, finalFilePath);return new File(finalFilePath);
}
  • 合成并构造新图片
/**
*
* 构造图片
* 生成水印并返回java.awt.image.BufferedImage
* @param file 源文件(图片)
* @param waterFile 水印文件(图片)
* @param alpha 透明度, 选择值从0.0~1.0: 完全透明~完全不透明
* @return BufferedImage
* @throws IOException
*/
private BufferedImage watermark(File file, File waterFile, float alpha) throws IOException {// 获取底图BufferedImage buffImg = ImageIO.read(file);//获取底图的宽度int buffImgWidth = buffImg.getWidth();//获取底图的高度int buffImgHight = buffImg.getHeight();// 获取层图1BufferedImage waterImg1 = ImageIO.read(waterFile);// 创建Graphics2D对象,用在底图对象上绘图Graphics2D g2d = buffImg.createGraphics();// 获取层图的宽度int waterImgWidth1 = waterImg1.getWidth();// 获取层图的高度int waterImgHeight1 = waterImg1.getHeight();// 在图形和图像中实现混合和透明效果// 当底图和水印图片都是png时,不要开启混合透明效果,否则可能导致水印图片被底图部分遮盖//g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));// 绘制//g2d.drawImage(waterImg1, 775,  450, waterImgWidth1, waterImgHeight1, null);g2d.drawImage(waterImg1, 755,  340, 350, 430, null);g2d.dispose();// 释放图形上下文使用的系统资源return buffImg;
}
  • 输出水印图片
/*** 输出水印图片** @param buffImg 图像加水印之后的BufferedImage对象* @param savePath 图像加水印之后的保存路径*/
private void generateWaterFile(BufferedImage buffImg, String savePath) {int temp = savePath.lastIndexOf(".") + 1;try {ImageIO.write(buffImg, savePath.substring(temp), new File(savePath));} catch (IOException e1) {e1.printStackTrace();}
}
  • 删除文件
private void deleteFile(File file) {if(!file.exists()) {return;}if(file.isFile() || file.list()==null) {file.delete();}
}
  • Controller
@Slf4j
@RestController
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class MgmController {final private PictureService pictureService;@GetMapping("/file")public DeferredResult<ResponseEntity<FileSystemResource>> generatorFile() {DeferredResult<ResponseEntity<FileSystemResource>> deferredResult = new DeferredResult<>(20 * 1000L);try {File file = pictureService.generate();if (file != null) {HttpHeaders headers = new HttpHeaders();headers.add("Cache-Control", "no-cache, no-store, must-revalidate");headers.add("Content-Disposition", "attachment; filename=" + file.getName());headers.add("Pragma", "no-cache");headers.add("Expires", "0");headers.add("Last-Modified", new Date().toString());headers.add("ETag", String.valueOf(System.currentTimeMillis()));ResponseEntity<FileSystemResource> body = ResponseEntity.ok().headers(headers).contentLength(file.length()).contentType(MediaType.parseMediaType("application/octet-stream")).body(new FileSystemResource(file));deferredResult.setResult(body);}} catch (IOException e) {e.printStackTrace();}deferredResult.onTimeout(() -> {log.error("图片生成超时");deferredResult.setErrorResult("图片生成超时");});deferredResult.onError((throwable) -> {log.error("图片生成出错: " + throwable.getMessage());deferredResult.setErrorResult("图片生成出错");});return deferredResult;}

Java应用:图片叠加相关推荐

  1. java 操作图片 叠加图片 覆盖

    需求说明, 需要处理一个pdf文件, 将ocr识别出来的文字, 添加到word中, 将图片作为word背景图片, 也就实现了pdf转word功能. import java.awt.AlphaCompo ...

  2. Shader学习12——简易图片叠加

    看到蛮牛有人想要两个带透明通道的图片叠加,就是最简单的纹理混合,想想其实实现起来应该很简单,但是搜了一下还真没搜到,这里简单实现一下,要求底图需要是不透明的: image.png image.png ...

  3. 用java实现图片合并与折叠

    package org.jeecg.modules.lampblack.RaLampblack.util;import java.awt.*;import java.awt.image.Buffere ...

  4. java图片叠加_[原创]JAVA中图片上叠加文字的方法

    --sunfruit JDK:1.3.x以上 功能:下面是一个简单在图片上面叠加文字的方法,有朋友如果有这方面的问题,就起个了解的作用 代码如下: import java.io.IOException ...

  5. [摘抄-Java-学习中]Java 图片叠加水印文字自动换行

    从网上找到了前辈们写的代码,然后优化整理下,实现了图片叠加水印,也就是文字叠加,然后再实现根据总文字的长度进行自动换行叠加文字 importjavax.imageio.ImageIO; importj ...

  6. Android图片特效处理之图片叠加

    这篇将讲到图片特效处理的图片叠加效果.跟前面一样是对像素点进行处理,可参照前面的android图像处理系列之七--图片涂鸦,水印-图片叠加和android图像处理系列之六--给图片添加边框(下)-图片 ...

  7. background图片叠加_java实现图片的叠加效果

    实现效果图 这个效果的实现思路是: 1.先准备一张背景图,像素自己去定.像素越高最后生成的图片会更清晰,当然图片也会越大,注意这个背景图一定要是png格式的,要放用户头像的位置要镂空,透明的. 至于为 ...

  8. java 处理图片图片合成

    最近写了一个java的图片合成相关的项目,真的是一踩一个坑,下面博主说说遇见的一些坑和怎么解决的这些问题. 本文主要讲图片合成,加文字还是比较简单的. 先讲下我的需求,把一张图片盖到另外一张图片上面, ...

  9. Android OpenCV实现图片叠加,水印

    关于如何用纯OpenCV实现图片叠加的例子实在是太少,太多的是使用 C++,JNI实现的,如果要用C++的话,我们为啥不转行做C++ 下面的例子基于 Android JavaCV 实现了在im_bea ...

最新文章

  1. 很好的Markdown开源库
  2. 回溯法解决四皇后问题
  3. python常用指令速查
  4. android世界时钟代码大全,世界时钟精美时钟代码
  5. Windows远程桌面(mstsc)不能复制粘贴的解决办法
  6. css 的小细节,小总结
  7. 云计算应用迁移_应用迁移策略到云
  8. fpga arm 通讯_科学网-[转载]【电子技术】【2014】FPGA增强的数据处理系统
  9. 手写邮箱获取验证码注册登录功能
  10. 部门角色权限rbac_直白的解说一下RBAC权限设计
  11. 计算机视觉论文-2021-12-01
  12. 智头条」十四五数字经济发展规划发布,工信部推动充电标准统一
  13. Unity3D 从 ipa 中提取游戏资源
  14. matlab有限差分一维导热,一维导热方程-有限差分法-matlab实现(汇编)
  15. teradata中no more spool space
  16. 前端面试题总结(js、html、小程序、React、ES6、Vue、全栈)
  17. 介绍两种提取视频语音变成文字的方式
  18. Android 友盟推送收不到
  19. Android 抖音爱心动画,Android自定义View实现抖音飘动红心效果
  20. 概率论和数理统计期末复习(仅供个人复习使用)

热门文章

  1. 470余万条疑似12306用户数据遭贩卖 嫌疑人被刑拘
  2. Html给网页加icon图标
  3. [译] QUIC Wire Layout Specification - Introduction Overview | QUIC协议标准中文翻译(1) 简介和概述...
  4. python爬取小说并下载_python3爬取小说存为文本实现小说下载
  5. 学习型通用红外遥控设备(一)
  6. Java微信开发(通过java程序获取用户个人信息)
  7. 表的创建(create),修改(alter)和删除(drop)
  8. idea 回退merge_详解IDEA git分支回退指定的历史版本
  9. pyenv、ipython、jupyter的安装使用
  10. 新蓝海之门,或将由数据信托来打开!