import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import javax.imageio.ImageIO;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/**
* 根据图片路径压缩图片至额定大小
* @param picUrl 需要压缩的图片路径
* @param scale 压缩比例 不能大于1,默认0.5
* @param quality 压缩品质介于0.1~1.0之间,默认0.75
* @param imgSize 图片大小压缩上限
* @param img 二次压缩图片对象
* @return
* @throws IOException
*/
public static byte[] imageCompress(String picUrl, float scale, float quality, long imgSize, Image img) throws IOException{
Image image = null;
if(img == null){//第一次是读取image
//根据图片路径获取图片转为字节输入流
URL url = new URL(picUrl);
URLConnection uc = url.openConnection();
InputStream in = uc.getInputStream();
//字节输入流转为要输出流
ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
byte[] buff = new byte[100];
int rc = 0;
while ((rc = in.read(buff)) > 0) {
swapStream.write(buff, 0, rc);
}
byte[] imagSize = swapStream.toByteArray();
// System.out.println("图片实际大小:"+imagSize.length);
//如果图片本身大小已在限额内则直接返回图片字节输出流
if(imagSize.length <= imgSize)
return imagSize;
else
image = javax.imageio.ImageIO.read(url);
}
else{//第二次开始不读图片,直接把第一次的图片压缩
image = img;
}
//图片本身大小已超过限额,则根据比率从尺寸上降低
int imageWidth = image.getWidth(null);
int imageHeight = image.getHeight(null);
imageWidth = (int)(scale*imageWidth);
imageHeight = (int)(scale*imageHeight);
image = image.getScaledInstance(imageWidth, imageHeight, Image.SCALE_AREA_AVERAGING);
// Make a BufferedImage from the Image.
BufferedImage mBufferedImage = new BufferedImage(imageWidth, imageHeight,BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = mBufferedImage.createGraphics();
g2.drawImage(image, 0, 0,imageWidth, imageHeight, Color.white,null);
g2.dispose();
float[] kernelData2 = {
-0.125f, -0.125f, -0.125f,
-0.125f,2, -0.125f,
-0.125f,-0.125f, -0.125f};
Kernel kernel = new Kernel(3, 3, kernelData2);
ConvolveOp cOp = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
mBufferedImage = cOp.filter(mBufferedImage, null);
ByteArrayOutputStream out = new ByteArrayOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(mBufferedImage);
// System.out.println(quality);
//降低图像品质(不是降低DPI)
param.setQuality(quality, true);//
encoder.setJPEGEncodeParam(param);
encoder.encode(mBufferedImage);
byte[] comImage = out.toByteArray();
// System.out.println(comImage.length);
if(comImage.length > imgSize){//如果图像压缩后大小还是超过限额则继续降低压缩比率降低品质
scale = scale - 0.10f;
quality = quality - 0.10f;
imageCompress(picUrl, scale, quality, imgSize, image);
}
return comImage;
}
/**
* 压缩图片到指定品质和比例
* @param picUrl 需要压缩的图片路径
* @param fileName 要压缩的图片名称
* @param toFileName 压缩后的图片名称
* @param scale 压缩比例 不能大于1,默认0.5
* @param quality 压缩品质介于0.1~1.0之间
*/
@SuppressWarnings("unused")
private static void imageCompress(String picUrl, String fileName,String toFileName,
float scale, float quality){
try {
long start = System.currentTimeMillis();
Image image = javax.imageio.ImageIO.read(new File(picUrl + fileName));
int imageWidth = image.getWidth(null);
int imageHeight = image.getHeight(null);
imageWidth = (int)(scale*imageWidth);
imageHeight = (int)(scale*imageHeight);
image = image.getScaledInstance(imageWidth, imageHeight, Image.SCALE_AREA_AVERAGING);
// Make a BufferedImage from the Image.
BufferedImage mBufferedImage = new BufferedImage(imageWidth, imageHeight,BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = mBufferedImage.createGraphics();
g2.drawImage(image, 0, 0,imageWidth, imageHeight, Color.white,null);
g2.dispose();
float[] kernelData2 = {
-0.125f, -0.125f, -0.125f,
-0.125f,2, -0.125f,
-0.125f,-0.125f, -0.125f };
Kernel kernel = new Kernel(3, 3, kernelData2);
ConvolveOp cOp = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
mBufferedImage = cOp.filter(mBufferedImage, null);
FileOutputStream out = new FileOutputStream(picUrl + toFileName);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(mBufferedImage);
param.setQuality(quality, true);//默认0.75
encoder.setJPEGEncodeParam(param);
encoder.encode(mBufferedImage);
out.close();
long end = System.currentTimeMillis();
System.out.println("图片:"+fileName+",压缩时间:"+(end - start) + "ms");
}catch (FileNotFoundException fnfe){
fnfe.printStackTrace();
}catch (IOException ioe){
ioe.printStackTrace();
}catch(Exception ex){
ex.printStackTrace();
}
}
调用实例
public static void main(String[] args){
PicUtil.imageCompress("D:\\", "background_new.png", "background_new2.png", 0.9f, 0.9f);
}
分享到:
相关推荐
额定输入功率与额定输出功率额定输入功率与额定输出功率额定输入功率与额定输出功率
本文主要讲了一下电动机额定转速与额定电压如何选择,希望对你的学习有所帮助。
断路器的额定极限和额定运行短路分断能力doc,断路器的额定极限和额定运行短路分断能力
详细介绍了电动机额定电流计算方法,主要是牢记口诀。
2、电容器为单相时: ... I=P/(U/ ) 即I= (P/U) P为电容器额定容量Kvar ,U为电网线电压KV。 b、当标称电压为U时 I=P/U P为电容器额定容量Kvar ,U为电网线电压KV。 提供大家学习和参考!
二极管反向截止时,可以承受一定的反压,那么其最高可承受的反压就是额定电压。比如5A/100V的二极管,其额定反压就是100V。虽然,所有二极管厂家都会留一定的裕量,100V的二极管通常用到110V都不会有问题,但是不...
额定电流是指电感器在正常工作时,所允许通过的最大电流。 额定电流一般以字母表示,并直接印在电感器上,字母的含义见表1-1。使用中,电感器的实际工作电流必须小于额定电流,否则电感线圈将会严重发热甚至烧毁。 ...
煤矿中变压器额定电流的估算对于了解变压器工作性能,对变压器进行调试维护有着重要影响。介绍三相变压器额定电流的一次、二次经验估算法,单相变压器额定电流估算法,并介绍其他常用估算方法。将估算结果与实际电流相...
5.在DC额定电压的电容上加电压时,包含脉冲电压,请调整至DC额定电压以内使用。根据产品的不同,有关脉冲电流容许值也会发生变化,详细数据请参照产品规格书。6.交流可用电压详细请参照最终规格书,或请另行垂询。
功率电感器的额定电流有"基于自我温度上升的额定电流"和"基于电感值的变化率的额定电流"两种决定方法,分别具有重要的意义。"基于自我温度上升的额定电流"是以元件的发热量为指标的额定电流规定,超出该范围使用时...
电力变压器的运行原则 1、变压器运行的温度 变压器在运行中要产生铜损和铁损,这两部分损耗最后全部转变为热量,使变压器的温度升高。我国电力变压器大部分采用A级绝缘...当电网的电压高于变压器的分接头的额定电压时
电线额定电流的计算,通过电流大小计算电线的大小
变压器额定电流计算.pdf
常用电机额定功率资料,便于电气相关技术人员的使用
ISO国际标准 滚动轴承 通用装载轴承用改良参考额定寿命的计算方法
AWG线规—额定电流对应关系表
电工电子技术:03 电功率与额定值.ppt
用实测统计法,计算出液压支架的额定工作阻力为4 297 k N/架,并用有限元软件FLAC3D模拟计算,得出液压支架的额定工作阻力为4 166.67 k N/架。实测统计法与模拟计算法得出的结果差距不大。因此,结合这两种方法可以对过...
本文描述了用于计算功率电路中功率器件峰值结温的通用方法,同时对功率半导体额定电流的假设条件进行了解释。
变压器的额定值 1、额定电压【U1N】【U2N】 一次侧额定电压【U1N】:是根据绝缘强度、允许发热规定的正常工作电压有效值。 二次侧额定电压【U2N】:在电力系统中是指当一次侧施加额定电压时,二次侧空载时的电压...