相关文章推荐
强悍的大蒜  ·  Prevent Cross-Site ...·  6 月前    · 
腹黑的松鼠  ·  created Hyper-V ...·  1 年前    · 
乖乖的铁链  ·  VS Code ...·  1 年前    · 

Java修改图片大小尺寸的简单实现

作者:西凉的悲伤

这篇文章主要介绍了Java修改图片大小尺寸的简单实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

方式一:使用Image.getScaledInstance

使用jdk的awt包下的Image.getScaledInstance实现图片的缩放。好处是无需引入第三方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图片流调整图片大小 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图片流转byte[]数组 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[]数组转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 获取图片并调整大小后保存:

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图像缓冲区 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()); //调整图片大小为 400X400尺寸 BufferedImage newImage = ImageUtils.resizeImage(image,400,400); //将缓冲区图片保存到 F:/test/pic1.jpg (文件不存在会自动创建文件保存,文件存在会覆盖原文件保存) ImageIO.write(newImage, "jpg", new File("F:/test/pic1.jpg")); } catch (IOException e) { e.printStackTrace();

2.通过读取图片文件调整大小再保存:

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()); //调整图片大小 BufferedImage newImage = ImageUtils.resizeImage(image,200,200); //图像缓冲区图片保存为图片文件(文件不存在会自动创建文件保存,文件存在会覆盖原文件保存) ImageIO.write(newImage, "jpg", new File("F:/test/pic2.jpg")); } catch (IOException e) { e.printStackTrace();

3.MultipartFile类型的图片文件调整大小再保存:

public JSONObject imageSizeAdjustment(MultipartFile file) { JSONObject result = new JSONObject(); try { //从MultipartFile 中获取 byte[] byte[] bytes = file.getBytes(); //byte[]转 InputStream InputStream in = new ByteArrayInputStream(bytes); //读取图片输入流为 BufferedImage BufferedImage image = ImageIO.read(in); System.out.println("Width: " + image.getWidth()); System.out.println("Height: " + image.getHeight()); //调整图片大小 BufferedImage newImage = ImageUtils.resizeImage(image, 200, 200); //图像缓冲区图片保存为图片文件(文件不存在会自动创建文件保存,文件存在会覆盖原文件保存) 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的开源图像大小调整库,它使用渐进式双线性缩放。它支持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图片流调整图片大小 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图片流转byte[]数组 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[]数组转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 转换为 MultipartFile,请参考我另一篇文章:

BufferedImage转换为MultipartFile

其他图片大小调整方法请参考:

How Can I Resize an Image Using Java

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
  • tk-mybatis 的使用方法详解
    tk-mybatis 的使用方法详解
    2021-12-12
  • spring cloud 集成 ribbon负载均衡的实例代码
    spring cloud 集成 ribbon负载均衡的实例代码
    2021-11-11
  • java多线程Synchronized实现可见性原理解析
    java多线程Synchronized实现可见性原理解析
    2021-12-12
  • Spring Security 核心过滤器链讲解
    Spring Security 核心过滤器链讲解
    2021-12-12
  • mybatisplus @Select注解中拼写动态sql异常问题的解决
    mybatisplus @Select注解中拼写动态sql异常问题的解决
    2021-12-12
  • Java如何实现读取txt文件内容并生成Word文档
    Java如何实现读取txt文件内容并生成Word文档
    2021-12-12
  • 详细解读Java Spring AOP
    详细解读Java Spring AOP
    2021-12-12
  • mybatis新增save结束后自动返回主键id详解
    mybatis新增save结束后自动返回主键id详解
    2021-12-12
  • 美国设下计谋,用娘炮文化重塑日本,已影响至中国
    美国设下计谋,用娘炮文化重塑日本,已影响至中国
    2021-11-19
  • 时空伴随者是什么意思?时空伴随者介绍
    时空伴随者是什么意思?时空伴随者介绍
    2021-11-09
  • 工信部称网盘企业免费用户最低速率应满足基本下载需求,天翼云盘回应:坚决支持,始终
    工信部称网盘企业免费用户最低速率应满足基本下载需求,天翼云盘回应:坚决支持,始终
    2021-11-05
  • 2022年放假安排出炉:五一连休5天 2022年所有节日一览表
    2022年放假安排出炉:五一连休5天 2022年所有节日一览表
    2021-10-26
  • 电脑版 - 返回首页

    2006-2023 脚本之家 JB51.Net , All Rights Reserved.
    苏ICP备14036222号