压缩图片工具类
这是从网上找了一个例子,测试了一下,可用。
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