java 等比例压缩图片(背景不会成黑的)
来源:互联网 发布:sql 查询一个字段包含 编辑:程序博客网 时间:2024/04/29 08:31
-下载所需jar包:http://pan.baidu.com/s/1o8y86MI
-1.新建一个工具类
import java.awt.Color;import java.awt.Graphics2D;import java.awt.Image;import java.awt.image.BufferedImage;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import javax.imageio.IIOImage;import javax.imageio.ImageIO;import javax.imageio.ImageTypeSpecifier;import javax.imageio.metadata.IIOMetadata;import javax.imageio.plugins.jpeg.JPEGImageWriteParam;import javax.imageio.stream.ImageOutputStream;import org.w3c.dom.Element;import com.sun.imageio.plugins.jpeg.JPEGImageWriter;public class ImagesTool { public static void img_change(String url,String name) { Tosmallerpic(url,new File(url+name),"_small",name,30,40,(float)0.7); } /** * * @param f 图片所在的文件夹路径 * @param file 图片路径 * @param ext 扩展名 * @param n 图片名 * @param w 目标宽 * @param h 目标高 * @param per 百分比 */ private static void Tosmallerpic(String f,File file,String ext,String n,int w,int h,float per){ Image src; try { src = javax.imageio.ImageIO.read(file); //构造Image对象 String img_midname = f+n.substring(0,n.indexOf("."))+ext+n.substring(n.indexOf(".")); int old_w = src.getWidth(null); //得到源图宽 int old_h = src.getHeight(null); int new_w = 0; int new_h = 0; //得到源图长 double w2 = (old_w*1.00)/(w*1.00); double h2 = (old_h*1.00)/(h*1.00); //图片跟据长宽留白,成一个正方形图。 BufferedImage oldpic; if(old_w>old_h) { oldpic = new BufferedImage(old_w,old_w,BufferedImage.TYPE_INT_RGB); }else{if(old_w<old_h){ oldpic = new BufferedImage(old_h,old_h,BufferedImage.TYPE_INT_RGB); }else{ oldpic = new BufferedImage(old_w,old_h,BufferedImage.TYPE_INT_RGB); } } Graphics2D g = oldpic.createGraphics(); g.setColor(Color.white); if(old_w>old_h) { g.fillRect(0, 0, old_w, old_w); g.drawImage(src, 0, (old_w - old_h) / 2, old_w, old_h, Color.white, null); }else{ if(old_w<old_h){ g.fillRect(0,0,old_h,old_h); g.drawImage(src, (old_h - old_w) / 2, 0, old_w, old_h, Color.white, null); }else{ //g.fillRect(0,0,old_h,old_h); g.drawImage(src.getScaledInstance(old_w, old_h, Image.SCALE_SMOOTH), 0,0,null); } } g.dispose(); src = oldpic; //图片调整为方形结束 if(old_w>w) new_w = (int)Math.round(old_w/w2); else new_w = old_w; if(old_h>h) new_h = (int)Math.round(old_h/h2);//计算新图长宽 else new_h = old_h; BufferedImage image_to_save = new BufferedImage(new_w,new_h,BufferedImage.TYPE_INT_RGB); image_to_save.getGraphics().drawImage(src.getScaledInstance(new_w, new_h, Image.SCALE_SMOOTH), 0,0,null); FileOutputStream fos = new FileOutputStream(img_midname); //输出到文件流 //旧的使用 jpeg classes进行处理的方法// JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos); // JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(image_to_save); /* 压缩质量 */ // jep.setQuality(per, true); // encoder.encode(image_to_save, jep); //新的方法 saveAsJPEG(100, image_to_save, per, fos); fos.close(); } catch (IOException ex) { //Logger.getLogger(Img_Middle.class.getName()).log(Level.SEVERE, null, ex); } } /** * 以JPEG编码保存图片 * @param dpi 分辨率 * @param image_to_save 要处理的图像图片 * @param JPEGcompression 压缩比 * @param fos 文件输出流 * @throws IOException */ public static void saveAsJPEG(Integer dpi ,BufferedImage image_to_save, float JPEGcompression, FileOutputStream fos) throws IOException { JPEGImageWriter imageWriter = (JPEGImageWriter) ImageIO.getImageWritersBySuffix("jpg").next(); ImageOutputStream ios = ImageIO.createImageOutputStream(fos); imageWriter.setOutput(ios); //and metadata IIOMetadata imageMetaData = imageWriter.getDefaultImageMetadata(new ImageTypeSpecifier(image_to_save), null); if(dpi != null && !dpi.equals("")){ //old metadata //jpegEncodeParam.setDensityUnit(com.sun.image.codec.jpeg.JPEGEncodeParam.DENSITY_UNIT_DOTS_INCH); //jpegEncodeParam.setXDensity(dpi); //jpegEncodeParam.setYDensity(dpi); //new metadata Element tree = (Element) imageMetaData.getAsTree("javax_imageio_jpeg_image_1.0"); Element jfif = (Element)tree.getElementsByTagName("app0JFIF").item(0); jfif.setAttribute("Xdensity", Integer.toString(dpi) ); jfif.setAttribute("Ydensity", Integer.toString(dpi)); } if(JPEGcompression >= 0 && JPEGcompression <= 1f){ //old compression //jpegEncodeParam.setQuality(JPEGcompression,false); // new Compression JPEGImageWriteParam jpegParams = (JPEGImageWriteParam) imageWriter.getDefaultWriteParam(); jpegParams.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT); jpegParams.setCompressionQuality(JPEGcompression); } //old write and clean //jpegEncoder.encode(image_to_save, jpegEncodeParam); //new Write and clean up imageWriter.write(imageMetaData, new IIOImage(image_to_save, null, null), null); ios.close(); imageWriter.dispose(); }}
-调用ImagesTool类中的方法
//保存路径,图片名称ImagesTool.img_change(url1,name);
1 0
- java 等比例压缩图片(背景不会成黑的)
- java等比例压缩图片
- java指定宽度等比例压缩图片
- 等比例压缩图片
- 图片等比例压缩
- 图片等比例压缩
- java上传并压缩图片(等比例压缩或者原尺寸压缩)
- java 等比例 改变图片的质量(等大小压缩图片)
- 图片的等比例压缩和质量压缩,图片转化成FILE
- js图片等比例压缩
- 图片等比例压缩方法
- iOS等比例压缩图片
- php图片等比例压缩
- 上传 图片 等比例压缩
- php等比例压缩图片
- 上传等比例压缩图片
- python图片等比例压缩
- 处理页面加载图片js(等比例压缩图片)
- Fast and Accurate CNN Object Detector with Scale Dependent Pooling and Cascad Rejection Classifiers
- 再次写给我们这些浮躁的程序员
- hibernate拦截器onFlushDirty无效
- 比赛完了,终于回来了
- Erasure Coding(纠删码)深入分析
- java 等比例压缩图片(背景不会成黑的)
- zabbix 获取jvm session信息
- Android 图片模糊、高斯模糊、毛玻璃的三种实现方法
- 柴俊理金:6月2号现货黄金,宁贵沥青操作建议
- POJ 1837 Balance
- 多线程同步——互斥锁
- ios 对象私有属性的访问和修改
- js转换数字和人民币
- android开发笔记之多线程下载及断点续传