opencv实现图片去水印案例
Java调用opencv实现图片去水印
最近项目中遇到个需求,图片去水印下载,由于上传时并未保存原图url,查找了相关资料,基本上都是通过设置RGB色值去水印,测试过后效果并不理想,会将图片中颜色跟RGB色值相同的也给去掉,在朋友的推荐下,使用了opecv这款开源软件,而Java调用opencv的例子很少,opencv官网上也没有java相关的api操作文档,期间踩了不少坑,最终在windows上测试通过,并在linux上也运行成功了(linux上效果更好),仅在这里记录下相关步骤,希望后续遇到同问题的人少走弯路。
环境安装配置
opencv官网链接:https://opencv.org/releases/
这里以opencv-4.5.1为例。
- windows环境,官网上选择windows版本下载安装即可,如下所示;
- linux环境,官网上选择sources下载zip压缩包,如下所示;
- 1)将下载好的压缩包放置到linux服务器下(以unbuntu为例),存放位置可自行指定,如 /usr/local/enviroment/opencv,执行解压命令unzip opencv-4.5.1.zip
- 2)进入解压好的目录,新建一个build目录,进入build目录下;
cd opencv-4.5.1
mkdir build
cd build
- 3)下载cmake,并安装相关联的包;
apt install cmake
sudo apt-get install cmake
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff4.dev libswscale-dev libjasper-dev
- 4)用cmake生成java的jar;
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -DBUILD_TESTS=OFF ..
- 5)结束后输入如下口令;
make -j8
sudo make install
- 6)安装结果;
build/bin下有opencv-451.jar、build/lib下有libopencv_java451.so文件,表示安装成功
IDEA下开发配置
- 通过maven命令将opencv-451.jar打包至本地maven仓库;
安装指定文件到本地仓库命令:mvn install:install-file
-Dfile=<myfile.jar> : 设置该jar包文件所在的路径与文件名
-DgroupId=<groupId> : 设置上传到仓库的包名
-DartifactId=<artifactId> : 设置该包所属的模块名
-Dversion=1.0.0 : 设置该包的版本号
-Dpackaging=jar : 设置该包的类型(很显然jar包)
如:mvn install:install-file -Dfile=D:/opencv/opencv-451.jar -DgroupId=org.opencv -DartifactId=opencv -Dversion=4.5.1 -Dpackaging=jar
- pom文件中添加maven依赖;
<!-- opencv -->
<dependency>
<groupId>org.opencv</groupId>
<artifactId>opencv</artifactId>
<version>4.5.1</version>
</dependency>
- opencv动态库配置;
通过在application.yml文件中配置动态库路径,并增加配置类,完成配置。
1)application.yml配置如下;
opencv:
lib:
# linux
#path: /usr/local/environment/opencv/opencv-4.5.1/build/lib/libopencv_java451.so
#windows
path: D:/opencv/opencv/build/java/x64/opencv_java451.dll
2)配置类如下:
/**
* opencv动态库配置
* @author wangjiajin
* @date 2021/3/2
* @desc
*/
@Configuration
@ConfigurationProperties(prefix = "opencv.lib")
public class OpenCvLibConfig {
@Value("${opencv.lib.path}")
private String path;
@PostConstruct
public void init() {
System.load(path);
}
}
测试案例
- 图片工具类
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* 图片工具类
* @author wangjiajin
* @date 2021/2/23
* @desc
*/
public class ImageUtils {
public static void addWaterMark(String srcImgPath, String waterMarkContent, String waterImgPath) {
try {
// 读取原图片信息
File srcImgFile = new File(srcImgPath);//得到文件
Image srcImg = ImageIO.