java按比例压缩图片到指定的大小(kb、mb)

12 篇文章 0 订阅

       网上有很多压缩图片的方法,但是要么就是不能压缩到指定的大小以内,要么就是要引用第三方的插件,都不太符合我的要求,所以就想着自己写一个方法来实现。这种方法有点不好就是如果图片特别大则要进行多次判断和读取,可能时间会有点长,这要看实际情况,用的时候要自己注意。

      实现的思路:读取图片大小→判断是否符合要求大小→不符合就宽和高同时缩减10%→再进行判断以此循环。

package com.goldgrid.compresspic;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import javax.imageio.ImageIO;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class CompressPic3 {
	
	public static String CompressPic(String srcPath,String targetPath) throws Exception {
		double cutPercent=0.1;
		File file=new File(srcPath);
		BufferedImage bufferedImage=ImageIO.read(new FileInputStream(file));
		int width=bufferedImage.getWidth(null);
		int height=bufferedImage.getHeight(null);
		long fileLength=file.length();
		while((fileLength/1024)>=300) {
			width=(int)(width*(1-cutPercent));
			height=(int)(height*(1-cutPercent));
			BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
			tag.getGraphics().drawImage(bufferedImage, 0, 0, width, height, null); // 绘制缩小后的图
			FileOutputStream deskImage = new FileOutputStream(targetPath); // 输出到文件流
			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(deskImage);
			encoder.encode(tag); // 近JPEG编码
			deskImage.close();
			
			File file1=new File(targetPath);
			BufferedImage bufferedImage1=ImageIO.read(new FileInputStream(file1));
			width=bufferedImage1.getWidth(null);
			height=bufferedImage1.getHeight(null);
			fileLength=file1.length();
		}
			
		return targetPath;
	}
	
	public static void main(String[] args) throws Exception {
		File file3=new File("d:/ZTestForWork/g.jpg");
    	BufferedImage bufferedImage3=ImageIO.read(new FileInputStream(file3));
    	System.out.println(file3.length());
    	int width3=bufferedImage3.getWidth(null);
    	int height3=bufferedImage3.getHeight(null);
    	System.out.println("压缩前图片的宽为:"+width3);
    	System.out.println("压缩前图片的高为:"+height3);
    	CompressPic3.CompressPic("d:/ZTestForWork/g.jpg", "d:/ZTestForWork/zipg.jpg");
       /* String imgdist=reduceImg("d:/ZTestForWork/d.jpg", "d:/ZTestForWork/zipd.jpg", 1600, 1920, null);*/
    	File file4=new File("d:/ZTestForWork/zipg.jpg");
    	BufferedImage bufferedImage4=ImageIO.read(new FileInputStream(file4));
    	System.out.println(file4.length());
    	int width4=bufferedImage4.getWidth(null);
    	int height4=bufferedImage4.getHeight(null);
    	System.out.println("压缩后图片的宽为:"+width4);
    	System.out.println("压缩后图片的高为:"+height4);
	}
}

 

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,可以使用ImageIO类和Java Advanced Imaging (JAI)库来实现图片压缩。以下是一个简单的代码示例,可以将图片压缩指定大小不失帧: ```java import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.media.jai.JAI; import javax.media.jai.RenderedOp; import com.sun.media.jai.codec.ImageCodec; import com.sun.media.jai.codec.ImageEncoder; import com.sun.media.jai.codec.JPEGEncodeParam; public class ImageCompressor { public static void compressImage(File inputFile, File outputFile, long maxSize) throws IOException { BufferedImage image = ImageIO.read(inputFile); //读取图片文件 int width = image.getWidth(); int height = image.getHeight(); long imageSize = inputFile.length(); while (imageSize > maxSize) { width *= 0.9; //缩小图片度 height *= 0.9; //缩小图片度 RenderedOp resizedImage = JAI.create("SubsampleAverage", image, width, height); //缩小图片 ImageEncoder encoder = ImageCodec.createImageEncoder("JPEG", outputFile, null); JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(resizedImage); param.setQuality(0.8f, false); //设置压缩质量 encoder.setParam(param); encoder.encode(resizedImage); //保存压缩后的图片 imageSize = outputFile.length(); } } } ``` 上述代码中,我们首先读取输入文件的图片,并获取图片度、度及大小。然后循环运行,每次缩小图片度和度,直到图片大小小于等于指定的最大值。在每次缩小图片后,我们使用JAI库创建一个渲染操作对象,对其进行平均子采样,并使用ImageCodec库中的JPEG编码器将图片保存到输出文件中。渲染操作时,我们可以通过指定度和度来控制图片大小,从而达到压缩图片的目的。在保存图片时,我们可以通过设置JPEG编码参数的质量参数来控制压缩质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值