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);
}
分享到:
相关推荐
电动机是工业生产和日常生活中的常见设备,其额定转速和额定电压的选择对于确保设备的正常运行、提高效率、减少能耗和保障投资具有重要意义。以下是电动机额定转速和额定电压选择的关键知识点: 一、额定转速的选择...
### 额定输入功率与额定输出功率详解 #### 一、定义及计算方法 在探讨电机的额定输入功率与额定输出功率之前,我们先了解几个基础概念。 **1. 输入功率(Pi)** 输入功率通常指的是电源给予电机的有功功率,它反映...
在实际应用中,正确计算电容器的额定电流至关重要,以确保电容器的安全运行和系统的稳定性。这不仅涉及电容器的选型,也关系到整个电力系统的规划和设计。通过以上方法,我们可以准确地计算出电容器在不同接线方式和...
电机是工业生产和日常生活中不可或缺的动力源,而电机的额定功率则是衡量其性能的重要参数之一。这个资料包“常用电机额定功率资料”显然是为了帮助电气相关技术人员更好地理解和应用电机功率知识而准备的。让我们...
### 电动机额定电流计算方法详解 #### 口诀法快速掌握电动机额定电流计算 在电气工程领域,准确计算电动机的额定电流是确保设备安全运行的关键步骤之一。传统上,这一计算过程可能涉及复杂的公式和参数,但通过...
在选择断路器时,理解其额定极限短路分断能力(Icu)和额定运行短路分断能力(Ics)至关重要。这两个参数是衡量断路器性能的关键指标。 首先,断路器的额定极限短路分断能力(Icu)是指断路器在特定条件下,不考虑...
【变压器额定电流经验估算法】是电力系统中一项实用的技术,主要用于在不直接测量的情况下,快速估算出变压器的工作电流。在煤矿等场合,变压器的正常运行至关重要,因为电流过高可能导致过热,影响设备安全。以下将...
功率半导体在电子电路中起着至关重要的作用,尤其是在处理大电流和高功率转换时。本文主要探讨了功率半导体的额定电流以及与之相关的散热设计。额定电流是指设备能够安全承受而不致性能下降或损坏的电流水平。对于...
二极管反向截止时,可以承受一定的反压,那么其最高可承受的反压就是额定电压。比如5A/100V的二极管,其额定反压就是100V。虽然,所有二极管厂家都会留一定的裕量,100V的二极管通常用到110V都不会有问题,但是不...
额定电流是指电感器在正常工作时,所允许通过的最大电流。 额定电流一般以字母表示,并直接印在电感器上,字母的含义见表1-1。使用中,电感器的实际工作电流必须小于额定电流,否则电感线圈将会严重发热甚至烧毁。 ...
其中,额定电流与连接导线的截面积匹配是一个基本但至关重要的概念。这个匹配关系确保了电线在传输电流时不会过热,从而避免火灾和其他安全隐患。 首先,我们来看一下标题和描述中提到的“额定电流”。额定电流是指...
综上所述,软启动器通过逐步调节电压实现电机的平滑启动,控制启动电流不超过额定电流的2至3倍,一般可按2.5倍进行预估。它不仅减少了对电网的冲击,还提高了电机的启动效率,减少了热损耗,延长了使用寿命,并通过...
5.在DC额定电压的电容上加电压时,包含脉冲电压,请调整至DC额定电压以内使用。根据产品的不同,有关脉冲电流容许值也会发生变化,详细数据请参照产品规格书。6.交流可用电压详细请参照最终规格书,或请另行垂询。
根据给定文件信息,本文将详细介绍ISO国际标准中关于滚动轴承通用装载轴承改良参考额定寿命计算方法的知识点。重点将放在滚动轴承额定寿命的计算上,以及ISO/TS16281:2008(E)标准所涉及的内容。 首先,ISO国际标准...
功率电感器的额定电流有"基于自我温度上升的额定电流"和"基于电感值的变化率的额定电流"两种决定方法,分别具有重要的意义。"基于自我温度上升的额定电流"是以元件的发热量为指标的额定电流规定,超出该范围使用时...
电力变压器的运行原则 1、变压器运行的温度 变压器在运行中要产生铜损和铁损,这两部分损耗最后全部转变为热量,使变压器的温度升高。我国电力变压器大部分采用A级绝缘...当电网的电压高于变压器的分接头的额定电压时
### 电动机额定电流的速算及保护装置的选用 #### 一、电动机额定电流的速算 在工业应用中,快速估算电动机的额定电流是非常实用的技能,有助于电气工程师和维修人员迅速配置合适的保护设备。常用的速算方法包括...
变压器额定电流计算.pdf
电源的额定功率对于确保电子设备的安全运行至关重要。在实际应用中,制造商通常会在特定的环境下测试电源的性能,以确保其符合额定功率的标准。 ### 总结 额定功率是电气设备设计和使用中的一个重要参数,它不仅...