Java中上傳圖片壓縮處理的方法示例
整理文檔,搜刮出一個(gè)Java做圖片壓縮的代碼,稍微整理精簡一下做下分享。
首先,要壓縮的圖片格式不能說動(dòng)態(tài)圖片,你可以使用bmp、png、gif等,至于壓縮質(zhì)量,可以通過BufferedImage來指定。
在C盤的temp下放置一張圖片pic123.jpg,盡量找一個(gè)像素高一點(diǎn)的圖片,這里我找了一張5616*3744的。
package test; import java.io.*; import java.util.Date; import java.awt.*; import java.awt.image.*; import javax.imageio.ImageIO; import com.sun.image.codec.jpeg.*; /** * 圖片壓縮處理 * @author 崔素強(qiáng) */ 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); // 得到源圖長 } /** * 按照寬度還是高度進(jìn)行壓縮 * @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); } } /** * 以寬度為基準(zhǔn),等比例放縮圖片 * @param w int 新寬度 */ public void resizeByWidth(int w) throws IOException { int h = (int) (height * w / width); resize(w, h); } /** * 以高度為基準(zhǔn),等比例縮放圖片 * @param h int 新高度 */ public void resizeByHeight(int h) throws IOException { int w = (int) (width * h / height); resize(w, h); } /** * 強(qiáng)制壓縮/放大圖片到固定的大小 * @param w int 新寬度 * @param h int 新高度 */ public void resize(int w, int h) 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("C:\\temp\\456.jpg"); 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(); } }
運(yùn)行后在C盤temp下生成一個(gè)465.jpg,像素大小為600*400,像素大小是我指定的。用時(shí)也就是一兩秒的事情,注意,我這張圖片是10M的,壓縮后是40.5KB。
一些細(xì)節(jié)事項(xiàng)可以參考代碼中的注釋。
要注意的是,你可能想試一試較大圖片的處理能力,如果你的JDK沒有指定默認(rèn)內(nèi)存,那可能會(huì)有如下異常,因?yàn)閮?nèi)存不夠大:
開始:2014-4-14 16:25:11 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.awt.image.DataBufferByte.<init>(DataBufferByte.java:58) at java.awt.image.ComponentSampleModel.createDataBuffer(ComponentSampleModel.java:397) at java.awt.image.Raster.createWritableRaster(Raster.java:938) at javax.imageio.ImageTypeSpecifier.createBufferedImage(ImageTypeSpecifier.java:1169) at javax.imageio.ImageReader.getDestination(ImageReader.java:2879) at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:943) at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:915) at javax.imageio.ImageIO.read(ImageIO.java:1422) at javax.imageio.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,然后運(yùn)行就可以了
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot?2.7.18?集成?Mybatis?Plus?+?Druid的實(shí)例詳解
Mybatis和MybatisPlus都是流行的持久層框架,MybatisPlus在Mybatis基礎(chǔ)上增加了更多便捷的功能,如自動(dòng)CRUD、分頁插件等,文章還提到了Entity、Mapper、Service、Controller等組件的基本使用方法,為開發(fā)者提供了一套完整的集成方案2024-10-10AJAX+JAVA用戶登陸注冊驗(yàn)證的實(shí)現(xiàn)代碼
這篇文章主要介紹了AJAX+JAVA用戶登陸注冊驗(yàn)證的實(shí)現(xiàn)代碼,通過ajax異步刷新頁面驗(yàn)證用戶輸入的賬號密碼是否在數(shù)據(jù)庫中存在。非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-06-06maven項(xiàng)目install時(shí)忽略執(zhí)行test方法的總結(jié)
這篇文章主要介紹了maven項(xiàng)目install時(shí)忽略執(zhí)行test方法的總結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03SpringBoot整合ELK實(shí)現(xiàn)日志監(jiān)控
這篇文章主要為大家詳細(xì)介紹了SpringBoot整合ELK實(shí)現(xiàn)日志監(jiān)控的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-11-11SpringBoot中DTO/VO/Entity相互轉(zhuǎn)換詳解
在我們平時(shí)開發(fā)中,dto、vo、entity之間的相互轉(zhuǎn)換是很頻繁的操作,這篇文章就簡單記錄一下在平時(shí)開發(fā)中SpringBoot的轉(zhuǎn)換方法,希望對大家有所幫助2025-01-01Java Socket實(shí)現(xiàn)UDP編程淺析
類 DatagramSocket 何 DatagramPacket(數(shù)據(jù)包/數(shù)據(jù)報(bào)) 實(shí)現(xiàn)了基于 UDP協(xié)議網(wǎng)絡(luò)程序;UDP數(shù)據(jù)報(bào)通過數(shù)據(jù)報(bào)套接字 DatagramSocket 發(fā)送和接收,系統(tǒng)不保證 UDP數(shù)據(jù)報(bào)一定能夠安全送達(dá)目的地,也不確定什么時(shí)候可以抵達(dá)2022-11-11