修改版imageio图片压缩工具
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 com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGEncodeParam; import com.sun.image.codec.jpeg.JPEGImageEncoder; import com.sun.imageio.plugins.jpeg.JPEGImageWriter; public class ImgCompress { /** * @param im * 原始图像 * @param resizeTimes * 倍数,比如0.5就是缩小一半,0.98等等double类型 * @return 返回处理后的图像 */ public BufferedImage zoomImage(String src) { BufferedImage result = null; try { File srcfile = new File(src); if (!srcfile.exists()) { System.out.println("文件不存在"); } BufferedImage im = ImageIO.read(srcfile); /* 原始图像的宽度和高度 */ int width = im.getWidth(); int height = im.getHeight(); //压缩计算 //最后压缩大小比例由resizeTimes控制,可以根据需要修改为0到1 float resizeTimes = 0.5f; /*这个参数是要转化成的倍数,如果是1就是转化成1倍*/ /* 调整后的图片的宽度和高度 */ int toWidth = (int) (width * resizeTimes); int toHeight = (int) (height * resizeTimes); /* 新生成结果图片 */ result = new BufferedImage(toWidth, toHeight, BufferedImage.TYPE_INT_RGB); result.getGraphics().drawImage( im.getScaledInstance(toWidth, toHeight, java.awt.Image.SCALE_SMOOTH), 0, 0, null); } catch (Exception e) { System.out.println("创建缩略图发生异常" + e.getMessage()); } return result; } public boolean writeHighQuality(BufferedImage im, String fileFullPath) { float JPEGcompression = 0.5f; try { /*输出到文件流*/ FileOutputStream newimage = new FileOutputStream(fileFullPath); //下面注释掉为老方法,用下面的新的ImageIO来处理,适应更好 /*JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newimage); JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(im); 压缩质量 jep.setQuality(0.9f, true); encoder.encode(im, jep); 近JPEG编码 newimage.close();*/ // 新的方法 int dpi = 200;//分辨率 saveAsJPEG(dpi, im, JPEGcompression, newimage); //关闭输出流 newimage.close(); //返回压缩后的图片地址 return true; } catch (Exception e) { return false; } } public static void saveAsJPEG(Integer dpi, BufferedImage image_to_save, float JPEGcompression, FileOutputStream fos) throws IOException { // Image writer 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 (JPEGcompression >= 0 && JPEGcompression <= 1f) { JPEGImageWriteParam jpegParams = (JPEGImageWriteParam) imageWriter .getDefaultWriteParam(); jpegParams.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT); jpegParams.setCompressionQuality(JPEGcompression); } imageWriter.write(imageMetaData, new IIOImage(image_to_save, null, null), null); ios.close(); imageWriter.dispose(); } public static void main(String[] args) { /*模拟原图片的文件夹地址*/ String inputFoler = "E:\\ceshitu\\one\\20160803_130742.jpg" ; /*转换后的图片存放地址*/ String outputFolder = "E:\\ceshitu\\one\\11.jpg"; ImgCompress narrowImage = new ImgCompress(); narrowImage.writeHighQuality(narrowImage.zoomImage(inputFoler), outputFolder); } }
JAVA修炼塔,技术世界的探知与交流,欢迎你的加入-----群号:535296702

浙公网安备 33010602011771号