【Java】【OpenCV】【awt】两种方式实现很「高大上」图片双重曝光

自双重曝光产生以来,它就一直是摄影爱好者热衷于尝试的摄影手法。通过双重曝光,可以为普通的照片带来神秘的意境和让人难以言喻的感觉,使得每一个场景的纹理和颜色都有了一种如梦如幻的效果,让人沉醉于其中。

在以前,摄影师需要将两张甚至更多的底片叠加在一起,才可以实现双重曝光效果。但进入数码摄影时代之后,双重曝光的创作门槛大大降低了
————————————————
版权声明:本文为CSDN博主「鹤田裕志」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42382703/article/details/114958728

原图以及效果图

左侧两张为原图 右侧为 效果图

awt实现双重曝光

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;/*** @author 小帅丶* @Description Java模拟双重曝光对图片进行处理*              图片双重曝光Java实现*              两张图片一定要宽高一致* @date 2024/1/10*/
public class DoubleExposureUtil {//默认透明度private static float alpha = 0.5f;/*** @Description  模拟双重曝光* @param firstPath - 第一张图片* @param secondPath  - 第二张图片* @Date  2024/1/10* @Author 小帅丶* @return java.awt.image.BufferedImage**/public static BufferedImage doubleExposure(String firstPath, String secondPath) throws Exception {return doubleExposure(firstPath,secondPath,alpha);}/*** @Description  模拟双重曝光* @param firstPath - 第一张图片* @param secondPath  - 第二张图片* @param alpha - 透明度* @Date  2024/1/10* @Author 小帅丶* @return java.awt.image.BufferedImage**/public static BufferedImage doubleExposure(String firstPath, String secondPath, float alpha) throws Exception {return doubleExposure(firstPath,secondPath,alpha,alpha);}/*** @Description  模拟双重曝光* @param firstPath - 第一张图片* @param secondPath  - 第二张图片* @param firstAlpha - 第一张图透明度* @param secondAlpha - 第二张图透明度* @Date  2024/1/10* @Author 小帅丶* @return java.awt.image.BufferedImage**/public static BufferedImage doubleExposure(String firstPath, String secondPath,float firstAlpha, float secondAlpha) throws Exception {// 读取第一张图片BufferedImage image1 = ImageIO.read(new File(firstPath));// 读取第二张图片BufferedImage image2 = ImageIO.read(new File(secondPath));if (image1.getWidth() == image2.getWidth() && image1.getHeight() == image2.getHeight()) {// 将两张图片合并成一张BufferedImage combinedImage = new BufferedImage(image1.getWidth(), image1.getHeight(),BufferedImage.TYPE_INT_ARGB);Graphics2D g2d = combinedImage.createGraphics();g2d.drawImage(image1, 0, 0, null);g2d.setComposite(AlphaComposite.SrcOver.derive(firstAlpha));g2d.drawImage(image2, 0, 0, null);g2d.setComposite(AlphaComposite.SrcOver.derive(secondAlpha));g2d.dispose();// 实现双重曝光效果BufferedImage doubleExposureImage = new BufferedImage(image1.getWidth(), image1.getHeight(),BufferedImage.TYPE_INT_ARGB);Graphics2D g2dExposure = doubleExposureImage.createGraphics();g2dExposure.drawImage(combinedImage, 0, 0, null);g2dExposure.dispose();return doubleExposureImage;}return null;}
}

OpenCV实现双重曝光

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;import java.awt.*;
import java.awt.image.BufferedImage;/*** @author 小帅丶* @Description OpenCV 双重曝光* @date 2024/1/12 14:15:54*/
public class TianDiTuSample {/*** @Description 模拟双重曝光-需要引入javacv-platform* @param openCVdllPath - opencvdll文件路径* @param firstPath     - 第一张图片* @param secondPath    - 第二张图片* @param firstAlpha    - 第一张图透明度* @param secondAlpha   - 第二张图透明度* @return java.awt.image.BufferedImage* <dependency>* <groupId>org.bytedeco</groupId>* <artifactId>javacv-platform</artifactId>* <version>1.5.7</version>* </dependency>* @Date 2024/1/10* @Author 小帅丶**/public static BufferedImage doubleExposureByOpenCV(String openCVdllPath,String firstPath, String secondPath,float firstAlpha, float secondAlpha) throws Exception {//加载dll文件System.load(openCVdllPath);// 加载本地图像文件Mat image1 = Imgcodecs.imread(firstPath);Mat image2 = Imgcodecs.imread(secondPath);if (image1.empty() || image2.empty()) {System.out.println("无法读取图像文件!");return null;}// 创建输出结果图像对象Mat resultImage = new Mat();// 将两张图像进行相加操作Core.addWeighted(image1, firstAlpha, image2, secondAlpha, 0, resultImage);// 保存结果图像到本地Imgcodecs.imwrite("result_image.jpg", resultImage);//Mat转BufferedImage bufferedImage保存最好是png格式 未深究 如果保存jpg会变红BufferedImage bufferedImage = matToBufferedImage(resultImage);// 释放内存image1.release();image2.release();resultImage.release();return bufferedImage;}/*** @param mat - Mat对象* @return java.awt.image.BufferedImage* @Description Mat转BufferedImage* @Author 小帅丶* @Date 2024/1/12**/public static BufferedImage matToBufferedImage(Mat mat) {// 获取图像的宽度和高度int width = mat.cols();int height = mat.rows();// 创建一个空的BufferedImage,具有与Mat相同的宽度和高度,以及与Mat相同的深度和类型BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);// 将Mat的像素数据复制到BufferedImage中for (int y = 0; y < height; y++) {for (int x = 0; x < width; x++) {// 假设图像是灰度图,获取像素值(如果是彩色图,需要相应地修改)// int pixel = (int)mat.get(y, x)[0];int b = (int) mat.get(y, x)[0];int g = (int) mat.get(y, x)[1];int r = (int) mat.get(y, x)[2];// 将像素值设置为颜色值bufferedImage.setRGB(x, y, new Color(r, g, b).getRGB());}}return bufferedImage;}
}

小程序功能演示

可以搜索 小帅一点资讯 在微信小程序直接体验哦

 

【Java】图片双重曝光微信小程序演示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/615798.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

血泪教训!Java项目的路径中一定不要包含中文~

今天通过应用类加载器获取某个目录下的文件时&#xff0c;控制台一直没有输出&#xff0c;但是没有任何的报错&#xff0c;代码如下所示 ClassLoader classLoaderwjrApplicationContext.class.getClassLoader();//appURL url classLoader.getResource("com/wjr/service&qu…

达梦数据实时同步软件DMHS介绍和原理

1、产品介绍 达梦数据实时同步软件&#xff08;以下简称 DMHS&#xff09;是支持异构环境的高性能、高可靠、高可扩展数据库实时同步复制系统。该产品采用基于日志的结构化数据复制技术&#xff0c;不依赖主机上源数据库的触发器或者规则&#xff0c;对主机源数据库系统几乎无影…

Redis相关报错信息:Could not connect to Redis at 127.0.0.1:6379: 由于目标计算机积极拒绝,无法连接。

报错信息&#xff1a; Could not connect to Redis at 127.0.0.1:6379: 由于目标计算机积极拒绝&#xff0c;无法连接。 报错原因&#xff1a; 访问不到Redis服务 解决方案&#xff1a; 将Redis服务打开&#xff01; 使用cmd命令行打开本机服务管理&#xff1a; services…

数组深入详解

1、背景 上传图片&#xff0c;需要对图片格式进行校验&#xff0c;这是就可以使用数组 2.1、什么是数组&#xff1f; Java 语言中提供的数组是用来存储固定大小的同类型元素。 如&#xff1a;可以声明一个数组变量&#xff0c;如 numbers[100] 来代替直接声明 100 个独立变量…

【前端转安卓】-Java基础知识笔记

常量定义&#xff1a;final public class HelloWorld {// 静态常量public static final double PI 3.14;// 声明成员常量final int y 10;public static void main(String[] args) {// 声明局部常量final double x 3.3;} }变量声明、赋值 String username,address,phone,te…

关于《电能质量管理办法(暂行)》实施的意义及解决方案——安科瑞赵嘉敏

中华人民共和国国家发展和改革委员会令 第8号 《电能质量管理办法(暂行)》已经2023年12月26日第7次委务会议审议通过,现予公布,自2024 年4月1日起施行。 主任 郑栅洁 2023年12月27日 1 办法解读 新型电力系统中新能源所占比例越来越高&#xff0c;光伏、风力等分布式电源、…

高德打车引入“红绿灯倒计时”能力,算力技术升级打车体验

打到的车还有多久能到&#xff1f;接驾车辆原地不动是什么原因&#xff1f;乘客在打车时&#xff0c;常常因为无法了解实时接驾路况&#xff0c;容易出现“等车焦虑”。 如今&#xff0c;高德打车已全面应用“红绿灯倒计时”能力&#xff0c;让乘客在等车时就能掌握接驾路况&am…

2024 年1月12日最热NLP大模型论文:Transformers are Multi-State RNNs

揭秘Transformer的无限可能&#xff0c;Meta研究发现Transformer其实是多状态RNN 引言&#xff1a;重新定义Transformer的视角 在自然语言处理&#xff08;NLP&#xff09;的领域&#xff0c;Transformer架构自2017年提出以来&#xff0c;已经成为了一种主流的模型&#xff0…

第十四章JSON

第十四章JSON 1.什么是JSON2.JSON的定义和访问3.JSON在JavaScript中两种常用的转换方式4.JavaBean和JSON的相互转换5.List集合和JSON的相互转换6.map集合和JSON的相互转换 1.什么是JSON 2.JSON的定义和访问 JSON的定义 JSON的类型是一个Object类型 JSON的访问 我们要…

芋道框架----(业务表单工作流)短信通知流程分析

芋道中给的请假流程示例&#xff0c;在发起流程的时候&#xff0c;可以看到它是由短信通知的&#xff0c;找了好久&#xff0c;想看看是什么时候触发的&#xff0c;之前一直以为是监听器&#xff0c;结果导致思维先入为主&#xff0c;陷入了怪圈&#xff0c;现做如下总结。 首先…

轻松批量重命名,一键随机并控制长度:让你的文件夹名充满无限可能

在数字时代&#xff0c;我们拥有海量的数据和文件&#xff0c;其中很多都存储在各种文件夹中。然而&#xff0c;随着时间的推移&#xff0c;文件夹名称可能变得不再相关或难以记忆。如何给这些文件夹一个全新的、充满创意的名字&#xff1f;今天&#xff0c;我们为你带来了这款…

20/100 删除链表的倒数第 N 个结点 21/100 有效的括号 22/100 合并两个有序列表

20/100 删除链表的倒数第 N 个结点 题目&#xff1a; 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 题解&#xff1a; 方法1&#xff1a;第一次完整遍历一遍得到长度&#xff0c;第二次遍历到倒数第n个数据前一个&#xff0c;进…

vue3中组合式api的常用方法

vue3中组合式api的常用方法 记录一下vue3中常用的组合式api&#xff0c;包括计算属性computed、监听器watch及watchEffective 一、computed 作用&#xff1a;根据已有数据计算出新数据&#xff08;和Vue2中的computed作用一致&#xff09;。 <template><div class&…

Bom 和 Dom 区别 ----- 真是DOM 和 虚拟Dom区别

DOM和BOM的区别 我们都指代&#xff0c;javascript由三个部分组成&#xff1a; ECMAScript&#xff1a;描述了JS的语法和基本对象 BOM(浏览器对象)&#xff1a;与浏览器交互的方法和对象 DOM(文档对象模型)&#xff1a;处理网页内容的方法和接 ps&#xff1a;根据宿主&#x…

Nerf相关研究

1.Nerf相关研究 随着Luma AI的到来&#xff0c;再次将Nerf推向浪尖&#xff0c;实用性进一步得到强化。Nerf仍以极速的发展速度前行&#xff0c;越来越多的研究方向不断涌现。 4K-Nerf 4K-NeRF: High Fidelity Neural Radiance Fields at Ultra High Resolutions 论文&#…

JVM内存模型深度剖析与优化

欢迎大家关注我的微信公众号&#xff1a; 目录 JVM整体结构及内存模型 JVM内存参数设置 JVM整体结构及内存模型 首先附一段简单代码&#xff0c;我们从代码层面来讲解内存模型 public class Math {public static final int initData 666;public static User user new …

性能测试分析案例-定位DNS解析很慢

环境准备 预先安装 docker 等工具&#xff0c;如 apt install docker.io。 操作和解析 执行下面的命令&#xff0c;拉取案例中使用的 Docker 镜像&#xff1a; docker pull feisky/dnsutils运行下面的命令&#xff0c;查看主机当前配置的 DNS 服务器&#xff1a; cat /etc…

你知道谁才是 “最懂程序员” 的搜索引擎?

大家好&#xff0c;我是奇兵&#xff0c;作为一名程序员&#xff0c;我们开发的过程中几乎每天都和搜索引擎打交道&#xff0c;利用它来搜文档、解决 Bug 等等。 而随着 AI 的发展&#xff0c;搜索引擎也变得越来越智能&#xff0c;市面上也涌现除了越来越多的 AI 搜索引擎。 …

【qt】sdk写pro写法,cv,onnx,cudnn

我的sdk在OpenCV003项目里&#xff1a; pro中添加 CONFIG(release, debug|release) {LIBS -L$$PWD/sdk/onnxruntime-x64-gpu/lib/ -lonnxruntimeLIBS -L$$PWD/sdk/onnxruntime-x64-gpu/lib/ -lonnxruntime_providers_cudaLIBS -L$$PWD/sdk/onnxruntime-x64-gpu/lib/ -lon…

深入探索JavaScript中实用而高级的Rest参数和Spread语法

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 函数是JavaScript这个语言的核心,而如何处理函数的参数是函数编程中非…