前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java实现图片水印+压缩So easy!

Java实现图片水印+压缩So easy!

作者头像
java思维导图
发布2020-06-05 10:51:01
1.7K0
发布2020-06-05 10:51:01
举报

前言

图片压缩、加水印是很多应用常见的需求,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做出来的都没发现过,不过毕竟是老项目了,零零散散躺过一些坑,如果你认真再研读一下框架对应的代码,调整对应的位置和参数,想必生成出来的图片水印或者压缩能满足你的要求

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java思维导图 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 项目介绍
      • 项目使用准备
        • 创建一个简单的项目并引入依赖
      • 压缩功能
        • 压缩后效果
      • 水印功能
        • 可能的坑
          • 总结
          相关产品与服务
          文件存储
          文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档