Java圖片批量壓縮像素的實現方法
圖片壓縮大法
為瞭防止用戶流量的丟失,即使在5g 即將來臨的情況下,壓縮算法依舊是很有必要的,額跑題瞭,不好意思,今天介紹的不是壓縮算法,講啥呢?主要講講如何通過 java 將圖片進行壓縮,盡可能的控制壓縮損比,不僅僅是為瞭減少存儲,其目的是快速呈現給用戶,隻有良好的體驗,才會在當今這個急躁的年代減少流量的損失。
最近因為公司要需要xxx認證上傳測試用例功能的具體截圖、發現有大小限制、所以就進行瞭圖片壓縮,簡單記錄一下。
壓縮前大小:
壓縮後大小:
具體代碼實現:
main方法測試:
public static void main(String[] args) throws IOException { String modpath = "C:\\Users\\Administrator\\Desktop\\鯤鵬認證\\test\\"; getFiles("C:\\Users\\Administrator\\Desktop\\鯤鵬認證\\測試用例清單", modpath, 160);//將圖片壓縮至100寬 }
文件大小處理
/** * @param srcPath 原圖片路徑 * @param desPath 轉換大小後圖片路徑 * @param width 轉換後圖片寬度 * @param height 轉換後圖片高度 */ public static void resizeImage(String srcPath, String desPath, int width, int height) throws IOException { File srcFile = new File(srcPath); Image srcImg = ImageIO.read(srcFile); BufferedImage buffImg = null; buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); //使用TYPE_INT_RGB修改的圖片會變色 buffImg.getGraphics().drawImage(srcImg.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null); String filePath=""; if (srcFile.getName().contains("#")) { filePath = srcFile.getName().replace("#", ""); }else{ filePath=srcFile.getName(); } ImageIO.write(buffImg, "PNG", new File(desPath + filePath)); }
獲取目錄文件信息
/** * @param scaleSize 圖片的修改比例,目標寬度 */ public static void getFiles(String path, String modPath, int scaleSize) throws IOException { ArrayList<String> files = new ArrayList<String>(); File file = new File(path); File[] tempList = file.listFiles(); //循環讀取目錄下圖片 for (int i = 0; i < tempList.length; i++) { String filePath = tempList[i].getName(); if (tempList[i].isFile()) { System.out.println("文件:" + filePath + "-" + tempList[i].getAbsolutePath().replaceAll("\\\\", "/")); String[] imagePath = tempList[i].getAbsolutePath().replaceAll("\\\\", "/").split("/"); String imageNumber = null; FileUtil.resizeImage(tempList[i].getAbsolutePath().replaceAll("\\\\", "/"), modPath, 160, 160); files.add(tempList[i].toString()); } if (tempList[i].isDirectory()) { System.out.println("文件夾:" + tempList[i]); } } System.out.println(path + "下文件數量:" + files.size()); }
控制臺目錄壓縮成功保存到盤符:
附:利用Graphics類如何進行壓縮圖像
Graphics類提供基本繪圖方法,Graphics類提供基本的幾何圖形繪制方法,主要有:畫線段、畫矩形、畫圓、畫帶顏色的圖形、畫橢圓、畫圓弧、畫多邊形、畫字符串等。 這裡不做一一贅述, 進重點介紹一下,利用Graphics類如何進行壓縮圖像。不多說直接上代碼。
/** * compressImage * * @param imageByte * Image source array * @param ppi * @return */ public static byte[] compressImage(byte[] imageByte, int ppi) { byte[] smallImage = null; int width = 0, height = 0; if (imageByte == null) return null; ByteArrayInputStream byteInput = new ByteArrayInputStream(imageByte); try { Image image = ImageIO.read(byteInput); int w = image.getWidth(null); int h = image.getHeight(null); // adjust weight and height to avoid image distortion double scale = 0; scale = Math.min((float) ppi / w, (float) ppi / h); width = (int) (w * scale); width -= width % 4; height = (int) (h * scale); if (scale >= (double) 1) return imageByte; BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); buffImg.getGraphics().drawImage(image.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null); ByteArrayOutputStream out = new ByteArrayOutputStream(); ImageIO.write(buffImg, "png", out); smallImage = out.toByteArray(); return smallImage; } catch (IOException e) { log.error(e.getMessage()); throw new RSServerInternalException(""); } }
其實,關鍵點就兩處
BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); buffImg.getGraphics().drawImage(image.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
總結
到此這篇關於Java圖片批量壓縮像素實現的文章就介紹到這瞭,更多相關Java圖片批量壓縮像素內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!