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

Java 中圖片壓縮處理的解決方案

 更新時間:2023年09月05日 09:53:44   作者:跟著飛哥學(xué)編程  
圖片經(jīng)過base64編碼轉(zhuǎn)換后,文件會變大的原因是因?yàn)閎ase64編碼會將每個3字節(jié)的數(shù)據(jù)轉(zhuǎn)換成4字節(jié)的數(shù)據(jù),并且在轉(zhuǎn)換的過程中還會添加一些額外的字符,這篇文章主要介紹了Java 中如何對圖片進(jìn)行壓縮處理,需要的朋友可以參考下

問題背景

圖片過大時,會造成頁面卡頓甚至于報錯,而且現(xiàn)在頁面,接口,很多地兒都有報文傳輸?shù)淖畲笙拗埔?,另外不知道各位有沒有遇到過頁面渲染比較大的 base64 圖片時,會非常的卡頓。所以,我們必須對用戶上傳的原始圖片進(jìn)行壓縮處理。

為何圖片經(jīng)過 base64 編碼轉(zhuǎn)換后文件會變大?

圖片經(jīng)過base64編碼轉(zhuǎn)換后,文件會變大的原因是因?yàn)閎ase64編碼會將每個3字節(jié)的數(shù)據(jù)轉(zhuǎn)換成4字節(jié)的數(shù)據(jù),并且在轉(zhuǎn)換的過程中還會添加一些額外的字符。這些額外的字符包括"="、"+"、"/"等,它們在原始的圖片數(shù)據(jù)中是不存在的。

因此,當(dāng)我們將圖片進(jìn)行base64編碼后,會使得數(shù)據(jù)變得更大,因?yàn)樗枰嗟淖址麃肀硎鞠嗤脑紨?shù)據(jù)。

另外,使用base64編碼也會導(dǎo)致網(wǎng)絡(luò)傳輸速度變慢,因?yàn)橄嗤臄?shù)據(jù)需要傳輸更多的字符。因此,在需要傳輸大量數(shù)據(jù)的情況下,建議使用原始的二進(jìn)制數(shù)據(jù),而不是進(jìn)行base64編碼。

解決方案

1、先讀取源圖片

        new ImgCompress(srcFilePath);

2、進(jìn)行圖片壓縮

        resize(int w, int h, String toPic)

3、源碼工具類如下:

package com.example.util;
import java.awt.image.BufferedImage;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
 * 圖片壓縮
 * @author 86183
 *
 */
@SuppressWarnings("restriction")
public class ImgCompress {
	static BufferedImage img = null;
	public static void main(String[] args) throws IOException {
		String fromPic = "C:\\Users\\86183\\Pictures\\兒童節(jié)插畫手繪人物.png";
		String toPic = "C:\\Users\\86183\\Pictures\\兒童節(jié)插畫手繪人物_min.png";
		ImgCompress imgCom = new ImgCompress(fromPic );
		imgCom.resize(400, 400, toPic);
	}
	/**
	* 構(gòu)造函數(shù)
	*/
	public ImgCompress(String fileName) throws IOException {
	     File file = new File(fileName);// 讀入文件
	     img = ImageIO.read(file);      // 構(gòu)造Image對象
	}
	/**
	 * 強(qiáng)制壓縮/放大圖片到固定的大小
	 *
	 * @param w int 新寬度
	 * @param h int 新高度
	 */
	public void resize(int w, int h, String toPic) throws IOException {
	// SCALE_SMOOTH 的縮略算法 生成縮略圖片的平滑度的 優(yōu)先級比速度高 生成的圖片質(zhì)量比較好 但速度慢
	    BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
	    image.getGraphics().drawImage(img, 0, 0, w, h, null); // 繪制縮小后的圖
	    File destFile = new File(toPic);
	    FileOutputStream out = new FileOutputStream(destFile); // 輸出到文件流
	    // 可以正常實(shí)現(xiàn)bmp、png、gif轉(zhuǎn)jpg
	    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
	    encoder.encode(image); // JPEG編碼
	    out.close();
	}
}

備注

這里我們用到了 jdk 下的依賴包

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

那 maven 打包時 為何 jdk 下的包打包不進(jìn)去?

如果你的maven項(xiàng)目中依賴了JDK下的包,但是在打包時這些包沒有被打包進(jìn)去,可能是因?yàn)閙aven默認(rèn)只會把項(xiàng)目中依賴的jar包打包進(jìn)去,而JDK下的包被認(rèn)為是系統(tǒng)級別的依賴,不會自動加入打包的jar中。

為了解決這個問題,有兩種常用的方法:

1. 引入JDK包的maven依賴你可以在pom.xml中加入類似下面的依賴,把JDK下的包引入到maven項(xiàng)目中,這樣就能夠被打包進(jìn)去了:

<dependency>
    <groupId>jdk.tools</groupId>
    <artifactId>jdk.tools</artifactId>
    <version>${java.version}</version>
    <scope>system</scope>
    <systemPath>${java.home}/lib/tools.jar</systemPath>
</dependency>

2. 手動添加JDK包如果不想引入依賴,也可以手動將JDK下的包添加到打包的jar文件中,可以在maven打包命令中加入以下參數(shù):

mvn package -Dmaven.compiler.includeJavaxPackages=true

這樣打包時就會包含JDK下的包了。

maven 打包時,會提示找不到該包,這里我們需要在 maven 的 POM 文件里添加一個打包依賴的設(shè)置項(xiàng)。

<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>${java.version}</source>
					<target>${java.version}</target>
					<encoding>UTF-8</encoding>
					<compilerArguments>
                       <verbose />
                       <bootclasspath>${java.home}/lib/rt.jar;${java.home}/lib/jce.jar</bootclasspath>
                   </compilerArguments>
				</configuration>
			</plugin>

 添加的位置如下: 

 附加內(nèi)容:前端 Jquery 和 后臺 Java 判斷文件大小的方式。 前端:

var fileSize = $("#"+fileId)[0].files[0].size/(1024*1024);
console.log("上傳文件大?。?+fileSize+"M");

上面變量 fileId 就是文件 file 輸入框的 id 值。

后端:

/**
     * 判斷文件大小處于限制內(nèi)
     *
     * @param fileLen 文件長度
     * @param fileSize 限制大小
     * @param fileUnit 限制的單位(B,K,M,G)
     * @return
     */
	public static boolean checkFileSizeIsLimit(Long fileLen, int fileSize, String fileUnit) {
      double fileSizeCom = 0;
      if ("B".equals(fileUnit.toUpperCase())) {
          fileSizeCom = (double) fileLen;
      } else if ("K".equals(fileUnit.toUpperCase())) {
          fileSizeCom = (double) fileLen / 1024;
      } else if ("M".equals(fileUnit.toUpperCase())) {
          fileSizeCom = (double) fileLen / (1024*1024);
      } else if ("G".equals(fileUnit.toUpperCase())) {
          fileSizeCom = (double) fileLen / (1024*1024*1024);
      }
      if (fileSizeCom > fileSize) {
          return false;
      }
      return true;
  }

直接用工具類即可,代碼簡單明了,也沒啥太多可說明和備注的。

到此這篇關(guān)于Java 中如何對圖片進(jìn)行壓縮處理的文章就介紹到這了,更多相關(guān)Java 圖片壓縮處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 計(jì)算機(jī)二級考試java軟件操作教程 教大家如何學(xué)習(xí)java

    計(jì)算機(jī)二級考試java軟件操作教程 教大家如何學(xué)習(xí)java

    如何成為一名知識豐富的Java程序員,順利通過計(jì)算機(jī)二級Java考試,這篇文章主要主要教大家如何學(xué)習(xí)java,java的學(xué)習(xí)路線是什么,從何學(xué)起,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • springboot整合JSR303校驗(yàn)功能實(shí)現(xiàn)代碼

    springboot整合JSR303校驗(yàn)功能實(shí)現(xiàn)代碼

    這篇文章主要介紹了springboot整合JSR303校驗(yàn)功能實(shí)現(xiàn),JSR303校驗(yàn)方法有統(tǒng)一校驗(yàn)的需求,統(tǒng)一校驗(yàn)實(shí)現(xiàn)以及分組校驗(yàn),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • 使用jvisualvm配合Visual GC插件監(jiān)控Java程序詳細(xì)總結(jié)

    使用jvisualvm配合Visual GC插件監(jiān)控Java程序詳細(xì)總結(jié)

    本節(jié)將會介紹一下jvisualvm的特性及作用、各個功能是如何使用的、最后會介紹jvisualvm的插件Visual GC的安裝及使用
    2021-09-09
  • Linux系統(tǒng)中檢查Java版本的三種高效方法

    Linux系統(tǒng)中檢查Java版本的三種高效方法

    本文介紹了在Linux系統(tǒng)中檢查Java版本的三種高效方法,并探討了Java版本的重要性及其檢查原因,通過了解Java版本格式和不同方法,用戶可以確保應(yīng)用的兼容性、性能和安全性,需要的朋友可以參考下
    2025-12-12
  • Java實(shí)現(xiàn)簡易HashMap功能詳解

    Java實(shí)現(xiàn)簡易HashMap功能詳解

    這篇文章主要介紹了Java實(shí)現(xiàn)簡易HashMap功能,結(jié)合實(shí)例形式詳細(xì)分析了Java實(shí)現(xiàn)HashMap功能相關(guān)原理、操作步驟與注意事項(xiàng),需要的朋友可以參考下
    2020-05-05
  • 使用Java對PDF添加水印的操作代碼

    使用Java對PDF添加水印的操作代碼

    在當(dāng)今數(shù)字化辦公環(huán)境中,PDF 文檔作為信息交流和存儲的重要載體,其安全性和版權(quán)保護(hù)變得尤為關(guān)鍵,企業(yè)常常需要對內(nèi)部敏感文檔或?qū)ν獍l(fā)布的資料添加水印,以防止未經(jīng)授權(quán)的使用,本文將為您揭示這一問題的解決方案,深入探討如何使用Java對PDF添加水印,需要的朋友可以參考下
    2025-10-10
  • Java8 新特性之日期時間對象及一些其他特性

    Java8 新特性之日期時間對象及一些其他特性

    這篇文章主要介紹了Java8 新特性之日期時間對象及一些其他特性,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • SpringBoot實(shí)現(xiàn)讀取YML,yaml,properties文件

    SpringBoot實(shí)現(xiàn)讀取YML,yaml,properties文件

    yml,yaml,properties三種文件都是用來存放配置的文件,一些靜態(tài)數(shù)據(jù),配置的數(shù)據(jù)都會存放到里邊。本文主要為大家整理了SpringBoot實(shí)現(xiàn)讀取YML,yaml,properties文件的方法,需要的可以參考一下
    2023-04-04
  • AJAX Servlet實(shí)現(xiàn)數(shù)據(jù)異步交互的方法

    AJAX Servlet實(shí)現(xiàn)數(shù)據(jù)異步交互的方法

    本篇文章主要介紹了AJAX Servlet實(shí)現(xiàn)數(shù)據(jù)異步交互的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • SpringBoot自動裝配Condition的實(shí)現(xiàn)方式

    SpringBoot自動裝配Condition的實(shí)現(xiàn)方式

    這篇文章主要介紹了SpringBoot自動裝配Condition的實(shí)現(xiàn)方式,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08

最新評論

堆龙德庆县| 陆河县| 东山县| 延寿县| 颍上县| 琼中| 壶关县| 繁峙县| 南投县| 冀州市| 西和县| 利津县| 广南县| 密山市| 白玉县| 台南县| 新平| 南充市| 高密市| 屯昌县| 阜平县| 东丽区| 沅陵县| 东莞市| 东源县| 南安市| 杨浦区| 保定市| 恭城| 高平市| 牙克石市| 仁化县| 永嘉县| 井陉县| 汕头市| 阿荣旗| 苏尼特左旗| 泰宁县| 繁峙县| 梁山县| 嵊州市|