网站首页 > 精选教程 正文
前言
图片压缩、加水印是很多应用常见的需求,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.水印字体问题
如果你的系统不支持对应的字体,运行可能会报空指针哦。指定对应存在的字体或者安装对应的字体即可。
总结
其实在写这个框架之前,网上的资料真挺少的,用maven做出来的都没发现过,不过毕竟是老项目了,零零散散躺过一些坑,如果你认真再研读一下框架对应的代码,调整对应的位置和参数,想必生成出来的图片水印或者压缩能满足你的要求,另外这两个小功能demo已经上传到对应项目了,欢迎需要的大佬取阅(地址:https://github.com/pengziliu/GitHub-code-practice)!
原文链接:https://mp.weixin.qq.com/s/wGIFi7kbfnPji86gNbHuzA
猜你喜欢
- 2024-11-10 每日分享- jvm 如何压缩 java 项目的可执行文件
- 2024-11-10 15个最好用的JavaScript代码压缩工具
- 2024-11-10 Redis 6.2配置文件全解析:轻松优化缓存性能!
- 2024-11-10 Linux中常用的打包,压缩,解压 tar指令 zip指令
- 2024-11-10 Go发起HTTP2.0请求流程分析(后篇)——标头压缩
- 2024-11-10 hash碰撞的概率和可能性比你直觉中大得多
- 2024-11-10 2020上半年Java面试题总结,20多类1100道面试题...
- 2024-11-10 Facebook 发布最新数据压缩技术:可将 Android App 大小减少 20%
- 2024-11-10 一个简单的字符串,为什么 Redis 要设计的如此特别
- 2024-11-10 Android如何进行资源压缩 android资源文件路径
你 发表评论:
欢迎- 04-11Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- 04-11Java中你知道几种从字符串中找指定的字符的数量
- 04-11探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 04-11Python字符串详解与示例(python字符串的常见操作)
- 04-11java正则-取出指定字符串之间的内容
- 04-11String s1 = new String("abc");这句话创建了几个字符串对象?
- 04-11java判断字符串中是否包含某个字符
- 04-11关于java开发中正确的发牌逻辑编写规范
- 最近发表
-
- Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- Java中你知道几种从字符串中找指定的字符的数量
- 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- Python字符串详解与示例(python字符串的常见操作)
- java正则-取出指定字符串之间的内容
- String s1 = new String("abc");这句话创建了几个字符串对象?
- java判断字符串中是否包含某个字符
- 关于java开发中正确的发牌逻辑编写规范
- windows、linux如何后台运行jar(并且显示进程名)
- 腾讯大佬私人收藏,GitHub上最受欢迎的100个JAVA库,值得学习
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)