欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于java流實現(xiàn)壓縮圖片過程解析

 更新時間:2020年10月15日 11:08:41   作者:賈小仙  
這篇文章主要介紹了基于java流實現(xiàn)壓縮圖片過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

整理文檔,搜刮出一個Java做圖片壓縮的代碼,稍微整理精簡一下做下分享。

首先,要壓縮的圖片格式不能說動態(tài)圖片,你可以使用bmp、png、gif等,至于壓縮質(zhì)量,可以通過BufferedImage來指定。

在C盤的temp下放置一張圖片pic123.jpg,盡量找一個像素高一點的圖片,這里我找了一張5616*3744的。

package test;
import java.io.*;
import java.util.Date;
import java.awt.*;
import java.awt.p_w_picpath.*;
import javax.p_w_picpathio.ImageIO;
import com.sun.p_w_picpath.codec.jpeg.*;
/** 
 * 圖片壓縮處理 
 * @author 崔素強 
 */
public class ImgCompress {
	private Image img;
	private int width;
	private int height;
	@SuppressWarnings("deprecation") 
	  public static void main(String[] args) throws Exception {
		System.out.println("開始:" + new Date().toLocaleString());
		ImgCompress imgCom = new ImgCompress("C:\temp\pic123.jpg");
		imgCom.resizeFix(400, 400);
		System.out.println("結(jié)束:" + new Date().toLocaleString());
	}
	/** 
   * 構(gòu)造函數(shù) 
   */
	public ImgCompress(String fileName) throws IOException {
		File file = new File(fileName);
		// 讀入文件 
		img = ImageIO.read(file);
		// 構(gòu)造Image對象 
		width = img.getWidth(null);
		// 得到源圖寬 
		height = img.getHeight(null);
		// 得到源圖長
	}
	/** 
   * 按照寬度還是高度進行壓縮 
   * @param w int 最大寬度 
   * @param h int 最大高度 
   */
	public void resizeFix(int w, int h) throws IOException {
		if (width / height > w / h) {
			resizeByWidth(w);
		} else {
			resizeByHeight(h);
		}
	}
	/** 
   * 以寬度為基準,等比例放縮圖片 
   * @param w int 新寬度 
   */
	public void resizeByWidth(int w) throws IOException {
		int h = (int) (height * w / width);
		resize(w, h);
	}
	/** 
   * 以高度為基準,等比例縮放圖片 
   * @param h int 新高度 
   */
	public void resizeByHeight(int h) throws IOException {
		int w = (int) (width * h / height);
		resize(w, h);
	}
	/** 
   * 強制壓縮/放大圖片到固定的大小 
   * @param w int 新寬度 
   * @param h int 新高度 
   */
	public void resize(int w, int h) throws IOException {
		// SCALE_SMOOTH 的縮略算法 生成縮略圖片的平滑度的 優(yōu)先級比速度高 生成的圖片質(zhì)量比較好 但速度慢 
		BufferedImage p_w_picpath = new BufferedImage(w, h,BufferedImage.TYPE_INT_RGB );
		p_w_picpath.getGraphics().drawImage(img, 0, 0, w, h, null);
		// 繪制縮小后的圖 
		File destFile = new File("C:\temp\456.jpg");
		FileOutputStream out = new FileOutputStream(destFile);
		// 輸出到文件流 
		// 可以正常實現(xiàn)bmp、png、gif轉(zhuǎn)jpg 
		JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
		encoder.encode(p_w_picpath);
		// JPEG編碼 
		out.close();
	}
}

運行后在C盤temp下生成一個465.jpg,像素大小為600*400,像素大小是我指定的。用時也就是一兩秒的事情,注意,我這張圖片是10M的,壓縮后是40.5KB。

一些細節(jié)事項可以參考代碼中的注釋。

要注意的是,你可能想試一試較大圖片的處理能力,如果你的JDK沒有指定默認內(nèi)存,那可能會有如下異常,因為內(nèi)存不夠大:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
  at java.awt.p_w_picpath.DataBufferByte.<init>(DataBufferByte.java:58) 
  at java.awt.p_w_picpath.ComponentSampleModel.createDataBuffer(ComponentSampleModel.java:397) 
  at java.awt.p_w_picpath.Raster.createWritableRaster(Raster.java:938) 
  at javax.p_w_picpathio.ImageTypeSpecifier.createBufferedImage(ImageTypeSpecifier.java:1169) 
  at javax.p_w_picpathio.ImageReader.getDestination(ImageReader.java:2879) 
  at com.sun.p_w_picpathio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:943) 
  at com.sun.p_w_picpathio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:915) 
  at javax.p_w_picpathio.ImageIO.read(ImageIO.java:1422) 
  at javax.p_w_picpathio.ImageIO.read(ImageIO.java:1282) 
  at test.ImgCompress.<init>(ImgCompress.java:31) 
  at test.ImgCompress.main(ImgCompress.java:21) 

解決方法:

在Eclipse里選:Window->Preference->Installed JREs->Edit(選中jre),

在Default VM Arguments里輸入-Xms256m -Xmx1024m,表示最小內(nèi)存256M,最大1G,然后運行就可以了

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java?@Accessors注解圖文詳解

    Java?@Accessors注解圖文詳解

    @Accessors用于改變@Data生成的getter和setter方法的生成結(jié)果,下面這篇文章主要給大家介紹了關(guān)于Java?@Accessors注解的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • Java如何避免死鎖和競態(tài)條件的實現(xiàn)

    Java如何避免死鎖和競態(tài)條件的實現(xiàn)

    本文主要介紹了Java如何避免死鎖和競態(tài)條件的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • java中Hibernate的狀態(tài)總結(jié)

    java中Hibernate的狀態(tài)總結(jié)

    在本篇內(nèi)容里小編給大家整理的是一篇關(guān)于java中Hibernate的狀態(tài)總結(jié)內(nèi)容,有興趣的朋友們可以學習下。
    2021-01-01
  • Spring Data JPA踩坑記錄(@id @GeneratedValue)

    Spring Data JPA踩坑記錄(@id @GeneratedValue)

    這篇文章主要介紹了Spring Data JPA踩坑記錄(@id @GeneratedValue),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Java遍歷json字符串取值的實例

    Java遍歷json字符串取值的實例

    下面小編就為大家分享一篇Java遍歷json字符串取值的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • Nacos配置中心搭建及動態(tài)刷新配置及踩坑記錄

    Nacos配置中心搭建及動態(tài)刷新配置及踩坑記錄

    這篇文章主要介紹了Nacos配置中心搭建及動態(tài)刷新配置及踩坑記錄,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • springmvc+spring+mybatis實現(xiàn)用戶登錄功能(上)

    springmvc+spring+mybatis實現(xiàn)用戶登錄功能(上)

    這篇文章主要為大家詳細介紹了springmvc+spring+mybatis實現(xiàn)用戶登錄功能,比較基礎(chǔ)的學習教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Java中如何獲取文件的上級目錄

    Java中如何獲取文件的上級目錄

    這篇文章主要介紹了Java中如何獲取文件的上級目錄問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 解決springboot整合druid遇到的坑

    解決springboot整合druid遇到的坑

    這篇文章主要介紹了解決springboot整合druid遇到的坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 使用Spring的ApplicationEvent實現(xiàn)本地事件驅(qū)動的實現(xiàn)方法

    使用Spring的ApplicationEvent實現(xiàn)本地事件驅(qū)動的實現(xiàn)方法

    本文介紹了如何使用Spring的ApplicationEvent實現(xiàn)本地事件驅(qū)動,通過自定義事件和監(jiān)聽器,實現(xiàn)模塊之間的松耦合,提升代碼的可維護性和擴展性。同時還介紹了異步事件和事件傳遞的相關(guān)知識
    2023-04-04

最新評論