Java修改圖片大小尺寸的簡單實現(xiàn)
方式一:使用Image.getScaledInstance
使用jdk的awt包下的Image.getScaledInstance實現(xiàn)圖片的縮放。好處是無需引入第三方jar,缺點是會稍微有點模糊。
工具類ImageUtils:
package utils; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; public class ImageUtils { /** * 通過BufferedImage圖片流調(diào)整圖片大小 */ public static BufferedImage resizeImage(BufferedImage originalImage, int targetWidth, int targetHeight) throws IOException { Image resultingImage = originalImage.getScaledInstance(targetWidth, targetHeight, Image.SCALE_AREA_AVERAGING); BufferedImage outputImage = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB); outputImage.getGraphics().drawImage(resultingImage, 0, 0, null); return outputImage; } /** * BufferedImage圖片流轉(zhuǎn)byte[]數(shù)組 */ public static byte[] imageToBytes(BufferedImage bImage) { ByteArrayOutputStream out = new ByteArrayOutputStream(); try { ImageIO.write(bImage, "jpg", out); } catch (IOException e) { e.printStackTrace(); } return out.toByteArray(); } /** * byte[]數(shù)組轉(zhuǎn)BufferedImage圖片流 */ private static BufferedImage bytesToBufferedImage(byte[] ImageByte) { ByteArrayInputStream in = new ByteArrayInputStream(ImageByte); BufferedImage image = null; try { image = ImageIO.read(in); } catch (IOException e) { e.printStackTrace(); } return image; } }
測試
1.通過 url 獲取圖片并調(diào)整大小后保存:
import utils.ImageUtils; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.net.URL; public class Test { public static void main(String[] args) { try { //通過url獲取BufferedImage圖像緩沖區(qū) URL img = new URL("https://img1.360buyimg.com/image/jfs/t1/38591/20/3737/314695/5cc69c01E1838df09/dd6dce681bd23031.jpg"); BufferedImage image = ImageIO.read(img); //獲取圖片的寬、高 System.out.println("Width: " + image.getWidth()); System.out.println("Height: " + image.getHeight()); //調(diào)整圖片大小為 400X400尺寸 BufferedImage newImage = ImageUtils.resizeImage(image,400,400); //將緩沖區(qū)圖片保存到 F:/test/pic1.jpg (文件不存在會自動創(chuàng)建文件保存,文件存在會覆蓋原文件保存) ImageIO.write(newImage, "jpg", new File("F:/test/pic1.jpg")); } catch (IOException e) { e.printStackTrace(); } } }
2.通過讀取圖片文件調(diào)整大小再保存:
import utils.ImageUtils; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class Test { public static void main(String[] args) { try { //讀取原始圖片 BufferedImage image = ImageIO.read(new FileInputStream("F:/test/pic1.jpg")); System.out.println("Width: " + image.getWidth()); System.out.println("Height: " + image.getHeight()); //調(diào)整圖片大小 BufferedImage newImage = ImageUtils.resizeImage(image,200,200); //圖像緩沖區(qū)圖片保存為圖片文件(文件不存在會自動創(chuàng)建文件保存,文件存在會覆蓋原文件保存) ImageIO.write(newImage, "jpg", new File("F:/test/pic2.jpg")); } catch (IOException e) { e.printStackTrace(); } } }
3.MultipartFile類型的圖片文件調(diào)整大小再保存:
public JSONObject imageSizeAdjustment(MultipartFile file) { JSONObject result = new JSONObject(); try { //從MultipartFile 中獲取 byte[] byte[] bytes = file.getBytes(); //byte[]轉(zhuǎn) InputStream InputStream in = new ByteArrayInputStream(bytes); //讀取圖片輸入流為 BufferedImage BufferedImage image = ImageIO.read(in); System.out.println("Width: " + image.getWidth()); System.out.println("Height: " + image.getHeight()); //調(diào)整圖片大小 BufferedImage newImage = ImageUtils.resizeImage(image, 200, 200); //圖像緩沖區(qū)圖片保存為圖片文件(文件不存在會自動創(chuàng)建文件保存,文件存在會覆蓋原文件保存) ImageIO.write(newImage, "jpg", new File("F:/test/pic2.jpg")); } catch (IOException e) { e.printStackTrace(); } result.put("code", 1); result.put("note", "成功"); return result; }
方式二:使用Thumbnailator
Thumbnailator是Java的開源圖像大小調(diào)整庫,它使用漸進式雙線性縮放。它支持JPG,BMP,JPEG,WBMP,PNG和GIF。
通過將以下Maven依賴項添加到我們的pom.xml中,將其包括在我們的項目中:
<dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator</artifactId> <version>0.4.11</version> </dependency>
工具類ThumbnailsUtils:
import net.coobird.thumbnailator.Thumbnails; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; public class ThumbnailsUtils{ private static final Logger logger = LoggerFactory.getLogger(ThumbnailsUtils.class); /** * 通過BufferedImage圖片流調(diào)整圖片大小 */ public static BufferedImage resizeImageOne(BufferedImage originalImage, int targetWidth, int targetHeight) throws Exception { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); Thumbnails.of(originalImage) .size(targetWidth, targetHeight) .outputFormat("JPEG") .outputQuality(1) .toOutputStream(outputStream); byte[] data = outputStream.toByteArray(); ByteArrayInputStream inputStream = new ByteArrayInputStream(data); return ImageIO.read(inputStream); } /** * BufferedImage圖片流轉(zhuǎn)byte[]數(shù)組 */ public static byte[] imageToBytes(BufferedImage bImage) { ByteArrayOutputStream out = new ByteArrayOutputStream(); try { ImageIO.write(bImage, "jpg", out); } catch (IOException e) { logger.error("錯誤信息: ", e); } return out.toByteArray(); } /** * byte[]數(shù)組轉(zhuǎn)BufferedImage圖片流 */ private static BufferedImage bytesToBufferedImage(byte[] ImageByte) { ByteArrayInputStream in = new ByteArrayInputStream(ImageByte); BufferedImage image = null; try { image = ImageIO.read(in); } catch (IOException e) { logger.error("錯誤信息: ", e); } return image; } }
測試
和上面測試基本一樣只不過 ImageUtils.resizeImage換成 ThumbnailsUtils.resizeImageOne即可。
最終效果:
原圖:
長寬縮為原來的三分之一后的圖:
如果需要將 BufferedImage 轉(zhuǎn)換為 MultipartFile,請參考我另一篇文章:
BufferedImage轉(zhuǎn)換為MultipartFile
其他圖片大小調(diào)整方法請參考:
How Can I Resize an Image Using Java
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于SpringBoot3.x中spring.factories功能被移除的解決方案
這篇文章主要介紹了SpringBoot3.x中spring.factories功能被移除的解決方案,在配置好相關(guān)依賴、最小啟動類和配置之后,發(fā)現(xiàn)項目無法啟動,于是根據(jù)啟動上下文日志和按行DEBUG找到原因并且在等待組件升級兼容之前進行臨時性解決,需要的朋友可以參考下2022-12-12java對象與json對象之間互相轉(zhuǎn)換實現(xiàn)方法示例
這篇文章主要介紹了java對象與json對象之間互相轉(zhuǎn)換實現(xiàn)方法,結(jié)合實例形式分析了java對象與json對象相互轉(zhuǎn)換實現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-10-10SpringBoot+thymeleaf+ajax實現(xiàn)局部刷新詳情
這篇文章主要介紹了SpringBoot+thymeleaf+ajax實現(xiàn)局部刷新詳情,文章圍繞主題展開詳細的內(nèi)容介紹具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09Java中Arrays.sort自定義一維數(shù)組、二維數(shù)組的排序方式
這篇文章主要介紹了Java中Arrays.sort自定義一維數(shù)組、二維數(shù)組的排序方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08