切換語言為:簡體
Java基於Tinify實現圖片大幅度無失真壓縮

Java基於Tinify實現圖片大幅度無失真壓縮

  • 爱糖宝
  • 2024-08-15
  • 2094
  • 0
  • 0

引言

在當今的數字化時代,圖片已成為網站、應用和社交媒體中不可或缺的元素。然而,大尺寸的圖片不僅會增加頁面或者客戶端載入時間,還會佔用大量的儲存空間。爲了解決這個問題,可以使用圖片壓縮工具來減小圖片的尺寸,然後再將壓縮後的圖片上傳至物件儲存服務(如阿里雲OSS)。本文將詳細介紹如何利用Tinify壓縮圖片,並將其上傳至OSS,重點介紹圖片壓縮實現方式。

一、Tinify簡介

1.1 圖片壓縮的重要性

隨著網際網路的普及,圖片已成為資訊傳遞的重要載體。然而,大尺寸、高解析度的圖片會佔用大量頻寬和儲存空間,導致網站載入速度變慢。透過壓縮圖片,可以有效減小檔案大小,提高網站效能。

1.2 Tinify概述

Tinify是一個基於雲的圖片壓縮服務,它能夠顯著減小圖片的檔案大小,同時保持圖片的高質量。Tin義提供了豐富的API,可以輕鬆整合到各種專案中。而且還是對外免費開放使用的。

1.3 Tinify的使用方式

Tinify提供了兩種主要的圖片壓縮方式:

第一種:原始檔直接上傳

直接獲取表單請求的MultipartFile檔案,也就是可以從緩衝區(帶二進制字串)上傳影象,並獲取壓縮的影象資料。

byte[] sourceData = Files.readAllBytes(Paths.get("unoptimized.jpg"));
byte[] resultData = Tinify.fromBuffer(sourceData).toBuffer();

這種適合OSS上傳,推薦,缺點是會先把壓縮之後的圖片儲存到伺服器,在上傳到oss,可以在上傳之後,刪除圖片。

第二種:圖片URL上傳

只需可以提供一個URL到您的影象,而不必上傳它,這種更適合圖片查詢展示的時候進行壓縮,壓縮之後可以在Source物件中獲取新的圖片URL。

Source source = Tinify.fromUrl("https://cdn.tinypng.com/images/panda-happy.png");
source.toFile("optimized.jpg");

二、OSS簡介

阿里雲OSS(Object Storage Service)是一種海量、安全、低成本、高可靠的雲端儲存服務。使用者可以透過RESTful API在任何時間、任何地點、以任何網際網路裝置訪問OSS上的資料。OSS提供了豐富的功能,如檔案上傳、下載、刪除、共享等,非常適合用於儲存和管理圖片。這裏就不多介紹了,只要做過圖片上傳,相信大家都知道。

三、實現流程

透過上面Tinify壓縮API的介紹,可以看到使用Tinify進行圖片壓縮也是比較容易整合的,只要在上傳OSS前對圖片進行壓縮,在獲取壓縮後最新圖片進行上傳,對原有程式碼改造也不多。具體流程如下:

3.1 檢查檔案大小

判斷上傳的圖片檔案大小是否超過500KB。如果未超過,則不進行壓縮,這一塊可以根據自己業務進行處理。

3.2 設定Tinify API金鑰

使用Tinify.setKey(API_KEY)方法設定Tinify的API金鑰。

3.3 壓縮圖片

使用Tinify.fromBuffer(file.getBytes())方法從檔案位元組流建立Tinify的Source物件。

使用source.toFile(file.getOriginalFilename())方法將壓縮後的圖片儲存到伺服器。

讀取伺服器中壓縮後的圖片輸入流,並將其轉換為MultipartFile物件。

3.4 清理臨時檔案

刪除伺服器上臨時儲存的壓縮原始檔。

完整實現流程圖如下:

Java基於Tinify實現圖片大幅度無失真壓縮

四、實現程式碼

4.1 引入依賴

首先,需要在專案中引入Tinify和阿里雲OSS的依賴。

<!-- Tinify -->
<dependency>
    <groupId>com.tinify</groupId>
    <artifactId>tinify</artifactId>
    <version>RELEASE</version>
</dependency>

<!-- 阿里雲OSS -->
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
<!-- 阿里雲OSS -->
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.14.1</version>
</dependency>

4.2 配置Tinify API金鑰

在使用Tinify之前,需要先註冊一個賬號並獲取API金鑰,主要是獲取對應的apiKey,這裏可以到官網直接申請。

public class TinifyConfig {
    public static final String API_KEY = "your_tinify_api_key";
}

4.3 實現圖片壓縮和上傳功能

以下是實現圖片壓縮和上傳至OSS的核心程式碼:

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.tinify.Tinify;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.UUID;

public class ImageUploader {

    private static final String dir = "your_upload_directory/";

    /**
     * 圖片上傳
     *
     * @param file 原始檔
     * @return 壓縮後圖片的URL
     * @throws IOException
     */
    public String upload(MultipartFile file) {
        String endpoint = OSSClientConstants.endpointMap.get("lden");
        OSS ossClient = new OSSClientBuilder().build(endpoint, OSSClientConstants.ACCESS_KEY_ID, OSSClientConstants.ACCESS_KEY_SECRET);
        try {
            String name = file.getOriginalFilename();
            String prefix = name.substring(name.lastIndexOf("."));  // 獲取檔案字尾
            String filename = dir + UUID.randomUUID() + prefix;  // 上傳的檔案路徑和檔名

            // 壓縮圖片
            InputStream is = compressPic(file);
            
            // 上傳阿里OSS
            ossClient.putObject(bucket, filename, is);
            
             // 返回圖片上傳URL
            return ("https://your_cdn/" + filename);
        } catch (Exception e) {
            logger.error("上傳發生錯誤", e);
            return null;
        } finally {
            ossClient.shutdown();
        }
    }

    /**
     * Tinify壓縮圖片
     *
     * @param file 原始檔
     * @return 壓縮圖片流
     * @throws IOException
     */
    public InputStream compressPic(MultipartFile file) throws IOException {
        InputStream is = file.getInputStream();
        // 小於 500kb不壓縮,這塊業務可以自己決定
        if (file.getSize() > 500 * 1024) {
            //  設定Tinify的API金鑰
            Tinify.setKey(TinifyConfig.API_KEY);
            // 從MultipartFile建立Tinify的Source物件,壓縮圖片
            Source source = Tinify.fromBuffer(file.getBytes());
            // 壓縮之後儲存到伺服器
            source.toFile(file.getOriginalFilename());
            // 讀取伺服器中壓縮圖片輸入流
            byte[] bytes = Files.readAllBytes(Paths.get(file.getOriginalFilename()));
            is = convertToMultipartFile(bytes, file.getOriginalFilename()).getInputStream();
            // 刪除壓縮原始檔
            Files.deleteIfExists(Paths.get(file.getOriginalFilename()));
        }
        return is;
    }
}

4.4 壓縮效果驗證

程式執行之後,檢視日誌,可以對比壓縮前後圖片大小,可以看到4M圖片壓縮之後變成了1M。

Java基於Tinify實現圖片大幅度無失真壓縮

或者直接對比壓縮前後兩張圖片的大小,更加直觀說明。

原圖片:

Java基於Tinify實現圖片大幅度無失真壓縮

壓縮之後圖片:

Java基於Tinify實現圖片大幅度無失真壓縮

4.5 注意事項

  • API金鑰安全:請確保Tinify的API金鑰和OSS的訪問金鑰安全,不要洩露給他人,可以統一儲存到安全的配置檔案或資料庫中。

  • 異常處理:在實際應用中,需要對可能出現的異常進行詳細處理,以確保程式的健壯性。

  • 檔案命名:爲了避免檔名衝突,可以使用UUID生成唯一的檔名。

  • 壓縮圖片刪除:爲了避免佔用伺服器記憶體,可以在壓縮之後刪除臨時儲存的壓縮原始檔。

五、總結

透過本文的介紹,瞭解瞭如何利用Tinify壓縮圖片,並將其上傳至阿里雲OSS。這種方法不僅可以減小圖片的檔案大小,提高頁面載入速度,還可以節省儲存空間。希望本文的內容對有所幫助,能夠最佳化Web應用中的圖片管理。

0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.