最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java使用Tinify實現(xiàn)圖片無損壓縮(4M無損壓縮到1M)的方法

 更新時間:2024年08月16日 08:53:19   作者:小明愛吃火鍋  
在當今的數(shù)字化時代,圖片已成為網(wǎng)站、應用和社交媒體中不可或缺的元素,然而,大尺寸的圖片不僅會增加頁面或者客戶端加載時間,還會占用大量的存儲空間,本文將詳細介紹如何利用Tinify壓縮圖片,并將其上傳至OSS,重點介紹圖片壓縮實現(xiàn)方式,需要的朋友可以參考下

引言

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

一、Tinify簡介

1.1 圖片壓縮的重要性

隨著互聯(lián)網(wǎng)的普及,圖片已成為信息傳遞的重要載體。然而,大尺寸、高分辨率的圖片會占用大量帶寬和存儲空間,導致網(wǎng)站加載速度變慢。通過壓縮圖片,可以有效減小文件大小,提高網(wǎng)站性能。

1.2 Tinify概述

Tinify是一個基于云的圖片壓縮服務,它能夠顯著減小圖片的文件大小,同時保持圖片的高質(zhì)量。Tin義提供了豐富的API,可以輕松集成到各種項目中。而且還是對外免費開放使用的。

1.3 Tinify的使用方式

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

第一種:源文件直接上傳

直接獲取表單請求的MultipartFile文件,也就是可以從緩沖區(qū)(帶二進制字符串)上傳圖像,并獲取壓縮的圖像數(shù)據(jù)。

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在任何時間、任何地點、以任何互聯(lián)網(wǎng)設(shè)備訪問OSS上的數(shù)據(jù)。OSS提供了豐富的功能,如文件上傳、下載、刪除、共享等,非常適合用于存儲和管理圖片。這里就不多介紹了,只要做過圖片上傳,相信大家都知道。

三、實現(xiàn)流程

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

3.1 檢查文件大小

判斷上傳的圖片文件大小是否超過500KB。如果未超過,則不進行壓縮,這一塊可以根據(jù)自己業(yè)務進行處理。

3.2 設(shè)置Tinify API密鑰

使用Tinify.setKey(API_KEY)方法設(shè)置Tinify的API密鑰。

3.3 壓縮圖片

使用Tinify.fromBuffer(file.getBytes())方法從文件字節(jié)流創(chuàng)建Tinify的Source對象。

使用source.toFile(file.getOriginalFilename())方法將壓縮后的圖片保存到服務器。

讀取服務器中壓縮后的圖片輸入流,并將其轉(zhuǎn)換為MultipartFile對象。

3.4 清理臨時文件

刪除服務器上臨時保存的壓縮源文件。

完整實現(xiàn)流程圖如下:

四、實現(xiàn)代碼

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,這里可以到官網(wǎng)直接申請。

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

4.3 實現(xiàn)圖片壓縮和上傳功能

以下是實現(xiàn)圖片壓縮和上傳至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("上傳發(fā)生錯誤", e);
            return null;
        } finally {
            ossClient.shutdown();
        }
    }

    /**
     * Tinify壓縮圖片
     *
     * @param file 源文件
     * @return 壓縮圖片流
     * @throws IOException
     */
    public InputStream compressPic(MultipartFile file) throws IOException {
        InputStream is = file.getInputStream();
        // 小于 500kb不壓縮,這塊業(yè)務可以自己決定
        if (file.getSize() > 500 * 1024) {
            //  設(shè)置Tinify的API密鑰
            Tinify.setKey(TinifyConfig.API_KEY);
            // 從MultipartFile創(chuàng)建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。

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

原圖片:

壓縮之后圖片:

4.5 注意事項

  • API密鑰安全:請確保Tinify的API密鑰和OSS的訪問密鑰安全,不要泄露給他人,可以統(tǒng)一保存到安全的配置文件或數(shù)據(jù)庫中。
  • 異常處理:在實際應用中,需要對可能出現(xiàn)的異常進行詳細處理,以確保程序的健壯性。
  • 文件命名:為了避免文件名沖突,可以使用UUID生成唯一的文件名。
  • 壓縮圖片刪除:為了避免占用服務器內(nèi)存,可以在壓縮之后刪除臨時保存的壓縮源文件。

五、總結(jié)

通過本文的介紹,了解了如何利用Tinify壓縮圖片,并將其上傳至阿里云OSS。這種方法不僅可以減小圖片的文件大小,提高頁面加載速度,還可以節(jié)省存儲空間。希望本文的內(nèi)容對有所幫助,能夠優(yōu)化Web應用中的圖片管理。

以上就是Java使用Tinify實現(xiàn)圖片無損壓縮的方法的詳細內(nèi)容,更多關(guān)于Java Tinify圖片壓縮的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Springboot集成shiro之登錄攔截/權(quán)限控制方式

    Springboot集成shiro之登錄攔截/權(quán)限控制方式

    文章介紹了Shiro框架的的配置和使用,包括添加依賴、配置ShiroConfig、創(chuàng)建realm、配置安全管理器、配置過濾器和權(quán)限控制,還介紹了配置ehcache緩存、自定義加密和處理404重定向等問題,總結(jié)了Shiro框架中的常用配置和解決常見問題的方法
    2026-05-05
  • java保留小數(shù)的四種實現(xiàn)方法

    java保留小數(shù)的四種實現(xiàn)方法

    這篇文章主要為大家詳細介紹了java保留小數(shù)的四種實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Spring Boot整合elasticsearch的詳細步驟

    Spring Boot整合elasticsearch的詳細步驟

    這篇文章主要介紹了Spring Boot整合elasticsearch的詳細步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • SpringBoot整合SpringAI配置多平臺API密鑰的解決方案

    SpringBoot整合SpringAI配置多平臺API密鑰的解決方案

    本文介紹了如何在SpringBoot項目中整合SpringAI配置平臺API密鑰,包括添加依賴、配置文件、配置屬性類及核心配置類等,通過動態(tài)切換不同AI平臺,實現(xiàn)統(tǒng)一接口調(diào)用,此外,支持YAML配置和環(huán)境變量,便于靈活配置和擴展新平臺,需要的朋友可以參考下
    2026-05-05
  • 一文盤點SpringBoot中常用跨域處理方案

    一文盤點SpringBoot中常用跨域處理方案

    跨域是瀏覽器為了保障安全而遵循的一種規(guī)則,是同源策略的一部分,本文將為大家整理了SpringBoot中常用跨域處理的方法,需要的小伙伴可以了解下
    2025-08-08
  • Spring @Transaction 注解執(zhí)行事務的流程

    Spring @Transaction 注解執(zhí)行事務的流程

    這篇文章主要介紹了Spring @Transaction 注解執(zhí)行事務的流程,Spring 是如何開啟事務的?又是如何進行提交事務和關(guān)閉事務的,本文給大家詳細介紹,需要的朋友可以參考下
    2021-06-06
  • SpringBoot+MyBatis實現(xiàn)動態(tài)字段更新的三種方法

    SpringBoot+MyBatis實現(xiàn)動態(tài)字段更新的三種方法

    字段更新是指在數(shù)據(jù)庫表中修改特定列的值的操作,這種操作可以通過多種方式進行,具體取決于業(yè)務需求和技術(shù)環(huán)境,本文給大家介紹了在Spring Boot和MyBatis中,實現(xiàn)動態(tài)更新不固定字段的三種方法,需要的朋友可以參考下
    2025-04-04
  • SpringMVC訪問靜態(tài)資源的方法

    SpringMVC訪問靜態(tài)資源的方法

    本篇文章主要介紹了SpringMVC訪問靜態(tài)資源的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • 在Spring 中使用@Aspect 控制自定義注解的操作

    在Spring 中使用@Aspect 控制自定義注解的操作

    這篇文章主要介紹了在Spring 中使用@Aspect 控制自定義注解的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Netty分布式客戶端處理接入事件handle源碼解析

    Netty分布式客戶端處理接入事件handle源碼解析

    這篇文章主要為大家介紹了Netty源碼分析客戶端流程處理接入事件handle創(chuàng)建,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-03-03

最新評論

康平县| 于田县| 黎城县| 临潭县| 楚雄市| 宜良县| 孝义市| 易门县| 莫力| 静海县| 诏安县| 怀集县| 康马县| 和政县| 普定县| 旬邑县| 陕西省| 江孜县| 遂溪县| 上蔡县| 宜昌市| 临泉县| 吴川市| 泉州市| 宿迁市| 柯坪县| 团风县| 绥中县| 南和县| 陆川县| 汪清县| 思南县| 镇江市| 华宁县| 武冈市| 甘洛县| 岑巩县| 星子县| 江永县| 克什克腾旗| 长乐市|