Java實現圖片水印+壓縮So easy!

前言

圖片壓縮、加水印是很多應用常見的需求,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已經上傳到對應項目了,歡迎需要的大佬取閱!點擊左下角閱讀原文即可

請關注可愛的我,我給你搞輪子好麼?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章