Java实现图片水印+压缩So easy!_JAVA葵花宝典的博客-程序员宝宝

前言

图片压缩、加水印是很多应用常见的需求,java虽然有很多文件/io相关处理的api,但是使用不当很容易造成各种数据崩溃,今天介绍一个好用的轮子:simpleimage

项目介绍

从首页进去,你看到的是一片空白,没错,跟项目名一样,就是这个simple,这个项目是阿里巴巴旗下的,至今。。。嗯四年前就不维护了,时间倒退到4年前,映象中maven也还不是那么的流行,所以网上看到很多使用这个项目的都是手动拷贝jar并指定版本号,比如这样:

image-20200602153647751

但是我还是通过maven+simpleimage 关键字找到 了对应的maven依赖,在项目收尾还能找到这个东东,真的是泪流满面啊,只能说:良心了

Github地址:https://github.com/alibaba/simpleimage

如果大家后面使用感觉还可以的话,请给它来个star,每一份开源我们都应保持敬畏之心。

接下来一起去探秘使用它吧。。。

项目使用准备

创建一个简单的项目并引入依赖

我们创建了一个简易的maven项目 simpleimage-demo,并加入以下maven依赖

<!-- https://mvnrepository.com/artifact/com.alibaba/simpleimage -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>simpleimage</artifactId>
    <version>1.2.3</version>
</dependency>

依赖下载完成后发现都是些常见依赖

image-20200602160235681

准备工作到位,接下来我们就来撸功能了。

压缩功能

先来试试压缩功能吧,我们随便百度找张图,图片信息如下:

image-20200602163456278

图片大小:30K

图片尺寸:256 × 256

目标:压缩成 178 * 178 尺寸的小图片

「上代码」

image-20200602163943737

好了,代码写完,启动!见证奇迹的时候到了

image-20200602164102808

果然不出所料啊,代码编译完美,运行就报错,这能难道我这个bug小王子吗?

发现内部有依赖jar这个类库,关键字搜 jar+maven得到以下maven依赖

<!-- https://mvnrepository.com/artifact/javax.media/jai-core -->
<dependency>
  <groupId>javax.media</groupId>
  <artifactId>jai-core</artifactId>
  <version>1.1.3</version>
</dependency>

再次运行,完美通过!

压缩后效果

image-20200602163631246

水印功能

不仅在生活中要防火防盗防师兄,很多场景图片资源也要做个标记以防别人私自使用,所以我们也要实现下水印功能了。

我们这次还是用原来的图片,加个什么水印好呢?保住头发别秃,上代码

package com.lzp;

import com.alibaba.simpleimage.ImageRender;
import com.alibaba.simpleimage.render.*;
import org.apache.commons.io.IOUtils;
import java.awt.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

public class ImageUtils {
    final static File        path              = new File("/Users/mac/Downloads/压缩前.jpeg");
    final static File        rpath             = new File("/Users/mac/Downloads/加水印.jpeg");
    final static Font  FONT              = new Font("黑体", Font.PLAIN, 20);

    public static void main(String[] args) throws Exception {

        FixDrawTextItem item = new FixDrawTextItem("保住头发别秃!", Color.BLACK, Color.BLACK,
                FONT, 10, FixDrawTextItem.Position.TOP_LEFT, 1f);
        doDrawImageText(item);

    }


    public static void doDrawImageText(DrawTextItem... items) throws Exception {
        InputStream in = null;
        ImageRender fr = null;
        try {
            in = new FileInputStream(path);
            ImageRender rr = new ReadRender(in);

            DrawTextParameter dp = new DrawTextParameter();

            if (items != null) {
                for (DrawTextItem itm : items) {
                    dp.addTextInfo(itm);
                }
            }
            DrawTextRender dtr = new DrawTextRender(rr, dp);
            fr = new WriteRender(dtr,rpath);
            fr.render();
        } finally {
            IOUtils.closeQuietly(in);
            if (fr != null) {
                fr.dispose();
            }
        }
    }
}

运行后效果

image-20200602181458699

好了,给头发下个诅咒,希望还能保持5年!

可能的坑

运行一时爽,上线一堆坑,作为程序员的我们写完代码本机能运行上其他环境可能就不行了,如果你在windows环境可以而在Linux环境报错,不妨参考以下爬坑指南:

1.Linux系统下异常。

如果在linux环境报这个错

java.lang.NoClassDefFoundError:

Could not initializeclass sun.awt.image.code.JPEGImageEncoderImpl

在启动参数加上 -Djava.awt.headless=true

或者在tomcat的catalina.sh中添加参数

JAVA_OPTS="-Djava.awt.headless=true" #启动参数
  
# OS specific support. $var _must_ be set to either true or false.
cygwin=false
darwin=false

2.水印字体问题

如果你的系统不支持对应的字体,运行可能会报空指针哦。指定对应存在的字体或者安装对应的字体即可。

示例代码获取:

1、关注本号回复`图片处理`

2、点击左下角阅读原文

总结

其实在写这个框架之前,网上的资料真挺少的,用maven做出来的都没发现过,不过毕竟是老项目了,零零散散躺过一些坑,如果你认真再研读一下框架对应的代码,调整对应的位置和参数,想必生成出来的图片水印或者压缩能满足你的要求,另外这两个小功能demo已经上传到对应项目了,欢迎需要的大佬取阅!点击左下角阅读原文即可

请关注可爱的我,我给你搞轮子好么?

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/b644ROfP20z37485O35M/article/details/106536093

智能推荐

jmeter性能测试真实案例分析(最后章节-分析与测试报告demo)_我很开心啊的博客-程序员宝宝

以下表格是手动整理出来的:百度execl生成图表:(折线图、柱状图等)报告:硬件监控用:PerfMon

数据处理python与vba_Python结合VBA进行数据处理与报表制作_weixin_39612499的博客-程序员宝宝

用Python的好处是,可以把一系列的操作全部通过程序完成,步骤分解下来有这些:1、通过爬虫获取数据(用selenium操作,当然这个是最愚蠢且效率最低的办法,最好还是直接后台数据库调取);2、用VBA和PQ配合完成数据的刷新和报表的制作;3、用SMTP完成邮件发送(但是现在有bug,可能是某些二流服务器的问题,附件总是收不到或者是变成.dat文件,比如189邮箱。。。比如outlook。。。);...

Kinect__Leveon的博客-程序员宝宝

一、Kinect结构:【三只眼睛】红外投影机、彩色摄像头、红外深度摄像头(自左往右) 各部分说明:(红外投影机:主动投射近红外光谱,照射到粗糙物体,或是穿透毛玻璃后,光谱发生扭曲,形成随机的反射斑点(散斑),进而被红外摄像头读取 彩色摄像头:用于拍摄视角范围内的彩色视频图像 红外摄像头:分析红外光谱,创建可视范围内的人体、物体的深度图像 以从激...

unity 导出exe文件后按钮不会随界面变化 可通过调节分辨率解决 ## unity导出exe文件改变图标_千玖若曦的博客-程序员宝宝_unity打包出来图标不变怎么办

unity 导出exe文件后按钮不会随界面变化 可通过调节分辨率解决unity导出exe文件改变图标File -&gt;Buid Settings调节分辨率:调图标:选择图片即可:

CSS实现三级下拉菜单分析_zpfnevergiveup的博客-程序员宝宝

最近在帮同学写一个博客,由于他需要的栏目比较多,所以首页需要三级下拉菜单,从网上找一个,但是不可以直接用!由于前台没有写的太好,所以一些css代码没有看懂,所以我就分析了一下别人的代码,然后用到了自己的网站上,下面是我最后实现的效果。下面分析一下我找的代码:实现效果如下:代码以及注释如下,一些标签的意思已在注释上标明:主要思想:就是改变ul的display属性一开始

词根词缀学单词/优秀词典推荐_xuchaoxin1375的博客-程序员宝宝_词根词缀字典

文章目录词根词缀概览微信小程序形近音近词根英语词典丨背单词英语词根词缀详解独立的第三方app词根词缀字典词根单词词根词缀概览(摘自B站截图)微信小程序形近音近词根英语词典丨背单词优点是没有广告,词根解释较为详细,提供相关词的拓展英语词根词缀详解专门查词根时不错(有词根树)独立的第三方app词根词缀字典app下载链接词根单词看看总体的词根体系树有特色词源树..._1671465600

随便推点

RSA加密算法是怎么回事?难懂吗?_叶锦鲤的博客-程序员宝宝

RSA加密算法RSA加密算法非常有名,在计算机领域的应用非常广泛,几乎是一般用户在信息加密时的首选。它是一种非对称加密演算法,名字来源于它的三个发明人——罗纳德·李维斯特(RonRive...

slackware12.0 安装AdobeReader_chs-7.0.9-1.i386.tar.gz后程序启动报错解决?_weixin_34410662的博客-程序员宝宝

在Slackware12.0上安装AdobeReader_chs-7.0.9-1.i386.tar.gz,安装成功后,在终端窗口中运行acroread,会不停的出现expr: 语法错误expr: 语法错误expr: 语法错误...故障的原因是gtk+被升级到了2.10,一个文件名变成了libgtk-x11-2.0.so.0.1000.4旧文件中的语...

unity3d 取锚点位置_如何不靠看格子,确定一个字的首笔和后面每一笔画的位置?..._weixin_39612540的博客-程序员宝宝

经常有教小孩子写字的老师,问我类似的教学问题:怎样知道字的第一笔位置写在哪里?如何教学生找到字的每一笔的位置?怎样帮学生纠正一个字的结构问题? ……现在很多老师教写字,是按传统的教学方法,教小学生通过找田字格或其他各种各样格子的辅助点线来定笔画的位置,从字的第一笔到第后一笔,都是要靠看格子里的辅助点线来确定笔画起笔点和收笔点位置。对于刚学写字的小孩子,这样教是可以的,但对于已经过了写字启蒙期的学生...

<context:component-scan>使用详解_骆孝宇的博客-程序员宝宝

在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的java文件,如果扫描到有@Component @[email protected]等这些注解的类,则把这些类注册为bean注意:如果配置了那么标签就可以不用再xml中配置了,因为前者包含了后者。另外还提供了两个子标签1.        gai2.       在说明这两个子标

python满足闭包的条件_python闭包出现的条件-女性时尚流行美容健康娱乐mv-ida网..._weixin_39839726的博客-程序员宝宝

女性时尚流行美容健康娱乐mv-ida网 mvida时尚娱乐网 首页 美容 护肤 化妆技巧 发型 服饰 健康 情感 美体 美食 娱乐 明星八卦 首页 &gt;高级搜索 javascript 匿名函数(anonymous f...

使用用友软件时,SQL Server连接中的三个最常见错误_congaishang0622的博客-程序员宝宝

一."SQL Server 不存在或访问被拒绝"这个是最复杂的,错误发生的原因比较多,需要检查的方面也比较多.一般说来,有以下几种可能性:1,SQL Server名称或IP地址...

推荐文章

热门文章

相关标签