压缩图片文件大小工具类

压缩图片工具类

这是从网上找了一个例子,测试了一下,可用。

package imgTest;

import java.awt.image.BufferedImage;


/**
 * 图片处理工具类
 */

public class ImgUtils{
	/**
	 * @throws IOException 
	 * @throws FileNotFoundException 
     * 压缩图片(通过降低图片质量)
     * @explain 压缩图片,通过压缩图片质量,保持原图大小
     * @param sourceImageUrl 待压缩文件路径
     * @param targetImageUrl 压缩后文件路径
     * @param quality 图片质量(0-1)
     * @throws
     */
	public static void compressImgByQuality(String sourceImageUrl, String targetImageUrl, float quality) {
		byte[] sourceData = null;
		byte[] targetData = null;
		FileImageInputStream input = null;
		try {
			input = new FileImageInputStream(new File(sourceImageUrl));

			ByteArrayOutputStream output = new ByteArrayOutputStream();
			byte[] buf = new byte[1024];
			int numBytesRead = 0;
			while ((numBytesRead = input.read(buf)) != -1) {
				output.write(buf, 0, numBytesRead);
			}
			sourceData = output.toByteArray();
			ByteArrayInputStream byteInput = new ByteArrayInputStream(
					sourceData);
			BufferedImage image = ImageIO.read(byteInput);

			// 如果图片空,返回空
			if (image == null) {
				return;
			}
			// 得到指定Format图片的writer(迭代器)
			Iterator<ImageWriter> iter = ImageIO
					.getImageWritersByFormatName("jpeg");
			// 得到writer
			ImageWriter writer = (ImageWriter) iter.next();
			// 得到指定writer的输出参数设置(ImageWriteParam )
			ImageWriteParam iwp = writer.getDefaultWriteParam();
			// 设置可否压缩
			iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
			// 设置压缩质量参数
			iwp.setCompressionQuality(quality);

			iwp.setProgressiveMode(ImageWriteParam.MODE_DISABLED);

			ColorModel colorModel = ColorModel.getRGBdefault();
			// 指定压缩时使用的色彩模式
			iwp.setDestinationType(new javax.imageio.ImageTypeSpecifier(
					colorModel, colorModel.createCompatibleSampleModel(16, 16)));

			// 开始打包图片,写入byte[]
			// 取得内存输出流
			ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
			IIOImage iIamge = new IIOImage(image, null, null);

			// 此处因为ImageWriter中用来接收write信息的output要求必须是ImageOutput
			// 通过ImageIo中的静态方法,得到byteArrayOutputStream的ImageOutput
			writer.setOutput(ImageIO
					.createImageOutputStream(byteArrayOutputStream));
			writer.write(null, iIamge, iwp);
			targetData = byteArrayOutputStream.toByteArray();
			FileImageOutputStream imageOutput = new FileImageOutputStream(
					new File(targetImageUrl));
			imageOutput.write(targetData, 0, targetData.length);
			imageOutput.close();
			byteInput.close();
			input.close();
			output.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

一时也找不到原文链接了,如有侵权请联系本人删除。

下面是主测试类

package imgTest;


/**
 * 
 * 
 * @author yulisao
 * @createDate 2020年9月15日
 */
public class MainTest {
	
	public static void main(String[] args) {
		String imageUrl = "C:\\Users\\Administrator\\Desktop\\img\\1.png";
		String imageUrlTmp = "C:\\Users\\Administrator\\Desktop\\img\\333.png";
		float aFloat = 1F;

		ImgUtils.compressImgByQuality(imageUrl,imageUrlTmp,aFloat);

	}
}

  • aFloat 的值应该在0-1之间,若不在这个范围会报错。
  • aFloat 可以带有小数,值越小被压缩后也越小。
  • 每个文件大小不一,如果要实现压缩到指定的大小200K内,可以通过while(ture)调用多次,循环里面判断压缩后文件小于200K了就break
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值