Java压缩图片

本文介绍如何使用Thumbnails库从网络下载图片,将其压缩为固定尺寸,并上传至本地服务器。通过示例代码展示了依赖引入、核心方法及具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求:下载一张网络图,压缩成固定大小并上传到本地服务器

工具:Thumbnails

步骤:

1、引入Thumbnails依赖:

<!-- 图片缩略图 -->
<dependency>
    <groupId>net.coobird</groupId>
    <artifactId>thumbnailator</artifactId>
    <version>0.4.8</version>
</dependency>    

2、核心方法:

// InputStream fis
// File img
Thumbnails.of(fis).size(width,height).toFile(img);

3、demo:

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import org.junit.Test;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Main.class)
public class UtilTest{
    @Test
	public void uploadTest() throws IOException{
        //网络图片地址
		String srcUrl = "http://";
		String savePath = "E:/";
		String urlPath = "http://localhosr:11001/";
        // 转url资源链接
		URL url = new URL(srcUrl);
		HttpURLConnection conn = (HttpURLConnection)url.openConnection();
        //设置超时间为3秒
        conn.setConnectTimeout(3*1000);
        //防止屏蔽程序抓取而返回403错误
        conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
        //得到输入流
        InputStream inputStream = conn.getInputStream();
		String codeUrl = (new UploadUtil()).uploadScaleImg(inputStream, savePath, urlPath, 80, 80);
		System.out.println(codeUrl);
	}
}
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

import net.coobird.thumbnailator.Thumbnails;
public class UploadUtil {
    /**
	 * 上传压缩图片文件
	 * @param fis 图片输入流
	 * @param savePath 存放路径
	 * @param urlPath 访问路径
	 * @param width 压缩文件宽
	 * @param height 压缩文件高
	 * @author zhangyan
	 * @date 2020年3月30日13:27:02
	 */
	public String uploadScaleImg(InputStream fis, String savePath, String urlPath, int width, int height) throws IOException {
        // 图片文件命名
		StringBuffer tempFileName = new StringBuffer("qrCode");
		tempFileName.append("-");
		tempFileName.append(FMT.format(new Date()));
		tempFileName.append(UUID.randomUUID().toString().replace("-", "").substring(16));
		tempFileName.append(".png");
        // 指定路径创建目录
		File tempPackage = new File(savePath);
		if (!tempPackage.exists()) {
			tempPackage.mkdirs();
		}
        // 创建图像文件
		File img = new File(savePath + File.separator + tempFileName);
        // 指定宽高压缩文件
		Thumbnails.of(fis).size(width,height).toFile(img);
        // 返回访问路径
		String serverSavePath = urlPath + "/" + tempFileName.toString();
		return serverSavePath;
	}	
}

Thumbnails还支持按比例压缩、旋转、加水印、输出到OutputStream等。

### Java中用于压缩图片的方法或库 在Java中,可以使用多种方法和库来实现图片压缩。以下是几种常见的方法和库: #### 方法一:使用`ImageIO`和`BufferedImage`类 通过`ImageIO`和`BufferedImage`类可以直接操作图片,并将其转换为其他格式(如从PNG转为JPEG),同时改变图片的位深以实现压缩效果[^2]。 ```java import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; public class ImageCompressor { public static void main(String[] args) throws Exception { File input = new File("input.png"); BufferedImage image = ImageIO.read(input); BufferedImage bufferedImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB); bufferedImage.createGraphics().drawImage(image, 0, 0, null); ImageIO.write(bufferedImage, "jpg", new File("output.jpg")); } } ``` #### 方法二:使用`Thumbnailator`库 `Thumbnailator`是一个功能强大的第三方库,支持图片的尺寸调整和质量压缩。它提供了简单易用的API,能够快速实现图片压缩[^3]。 ```java import net.coobird.thumbnailator.Thumbnails; import java.io.File; import java.io.IOException; public class ThumbnailatorExample { public static void compressImage(String inputPath, String outputPath, float quality) throws IOException { Thumbnails.of(new File(inputPath)) .scale(1.0) .outputQuality(quality) .toFile(new File(outputPath)); } } ``` #### 方法三:使用`Imgscalr`库 `Imgscalr`是另一个流行的第三方库,专注于图片的缩放和压缩。它可以轻松调整图片大小并保持较高的视觉质量[^1]。 ```java import org.imgscalr.Scalr; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class ImgscalrExample { public static void compressImage(String inputPath, String outputPath, int quality) throws IOException { BufferedImage originalImage = ImageIO.read(new File(inputPath)); BufferedImage compressedImage = Scalr.resize(originalImage, Scalr.Method.ULTRA_QUALITY, quality); ImageIO.write(compressedImage, "jpg", new File(outputPath)); } } ``` #### 方法四:使用`javax.imageio.IIOImage`和`IIOWriteParam` 通过`javax.imageio`中的`IIOImage`和`IIOWriteParam`类,可以更精细地控制图片压缩质量[^4]。 ```java import javax.imageio.IIOImage; import javax.imageio.ImageIO; import javax.imageio.ImageWriteParam; import javax.imageio.ImageWriter; import javax.imageio.stream.ImageOutputStream; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.util.Iterator; public class CustomCompression { public static void compressImage(String inputPath, String outputPath, float quality) throws Exception { BufferedImage image = ImageIO.read(new File(inputPath)); Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg"); if (!writers.hasNext()) throw new IllegalStateException("No writers found"); ImageWriter writer = writers.next(); ImageOutputStream ios = ImageIO.createImageOutputStream(new FileOutputStream(outputPath)); writer.setOutput(ios); ImageWriteParam param = writer.getDefaultWriteParam(); if (param.canWriteCompressed()) { param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); param.setCompressionQuality(quality); } writer.write(null, new IIOImage(image, null, null), param); ios.close(); writer.dispose(); } } ``` ### 压缩质量参数说明 压缩质量参数通常是一个介于0.0到1.0之间的浮点数,表示压缩的程度。值越接近1.0,图片质量越高,文件体积也越大;值越接近0.0,图片质量越低,但文件体积会显著减小[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值