java 压缩图片

本文介绍了一个Java图片压缩工具类的实现方法,该工具类能够读取图片并按指定尺寸进行压缩,同时支持处理图片文件夹内的所有图片。
import java.awt.Graphics2D;  
import java.awt.Image;  
import java.awt.image.BufferedImage;  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileNotFoundException;  
import java.io.IOException;  
import javax.imageio.ImageIO;  
  
/** 
* * @author WQ * @date 2011-01-14 * @versions 1.0 图片压缩工具类 提供的方法中可以设定生成的 
* 缩略图片的大小尺寸等 
*/  
public class ImageUtil {  
    /** * 图片文件读取 * * @param srcImgPath * @return */  
    private static BufferedImage InputImage(String srcImgPath) {  
        BufferedImage srcImage = null;  
        try {  
            FileInputStream in = new FileInputStream(srcImgPath);  
            srcImage = javax.imageio.ImageIO.read(in);  
        } catch (IOException e) {  
            System.out.println("读取图片文件出错!" + e.getMessage());  
            e.printStackTrace();  
        }  
        return srcImage;  
    }  
  public static void main(String args[]){ 
try { 
Map<Integer, String> map = readfile("E:/yuan", null); 
for (int i = 0; i < map.size(); i++) { 
System.out.println(map.get(i) + " ==" + i); 
System.out.println(); 
String oldpath = map.get(i); 
compressImage(map.get(i), "E:/ww/_" + i + ".png", 100, 75); 

} catch (Exception ex) { 

System.out.println("ok"); 
  } 
    /** 
     * * 将图片按照指定的图片尺寸压缩 * * @param srcImgPath :源图片路径 * @param outImgPath * 
     * :输出的压缩图片的路径 * @param new_w * :压缩后的图片宽 * @param new_h * :压缩后的图片高 
     */  
    public static void compressImage(String srcImgPath, String outImgPath,  
            int new_w, int new_h) {  
        BufferedImage src = InputImage(srcImgPath);  
        disposeImage(src, outImgPath, new_w, new_h);  
    }  
  
    /** 
     * * 指定长或者宽的最大值来压缩图片 * * @param srcImgPath * :源图片路径 * @param outImgPath * 
     * :输出的压缩图片的路径 * @param maxLength * :长或者宽的最大值 
     */  
    public static void compressImage(String srcImgPath, String outImgPath,  
            int maxLength) {  
        // 得到图片  
        BufferedImage src = InputImage(srcImgPath);  
        if (null != src) {  
            int old_w = src.getWidth();  
            // 得到源图宽  
            int old_h = src.getHeight();  
            // 得到源图长  
            int new_w = 0;  
            // 新图的宽  
            int new_h = 0;  
            // 新图的长  
            // 根据图片尺寸压缩比得到新图的尺寸  
            if (old_w > old_h) {  
                // 图片要缩放的比例  
                new_w = maxLength;  
                new_h = (int) Math.round(old_h * ((float) maxLength / old_w));  
            } else {  
                new_w = (int) Math.round(old_w * ((float) maxLength / old_h));  
                new_h = maxLength;  
            }  
            disposeImage(src, outImgPath, new_w, new_h);  
        }  
    }  
  
    /** * 处理图片 * * @param src * @param outImgPath * @param new_w * @param new_h */  
    private synchronized static void disposeImage(BufferedImage src,  
            String outImgPath, int new_w, int new_h) {  
        // 得到图片  
        int old_w = src.getWidth();  
        // 得到源图宽  
        int old_h = src.getHeight();  
        // 得到源图长  
        BufferedImage newImg = null;  
        // 判断输入图片的类型  
        switch (src.getType()) {  
        case 13:  
            // png,gifnewImg = new BufferedImage(new_w, new_h,  
            // BufferedImage.TYPE_4BYTE_ABGR);  
            break;  
        default:  
            newImg = new BufferedImage(new_w, new_h, BufferedImage.TYPE_INT_RGB);  
            break;  
        }  
        Graphics2D g = newImg.createGraphics();  
        // 从原图上取颜色绘制新图  
        g.drawImage(src, 0, 0, old_w, old_h, null);  
        g.dispose();  
        // 根据图片尺寸压缩比得到新图的尺寸  
        newImg.getGraphics().drawImage(  
                src.getScaledInstance(new_w, new_h, Image.SCALE_SMOOTH), 0, 0,  
                null);  
        // 调用方法输出图片文件  
        OutImage(outImgPath, newImg);  
    }  
  
    /** 
     * * 将图片文件输出到指定的路径,并可设定压缩质量 * * @param outImgPath * @param newImg * @param 
     * per 
     */  
    private static void OutImage(String outImgPath, BufferedImage newImg) {  
        // 判断输出的文件夹路径是否存在,不存在则创建  
        File file = new File(outImgPath);  
        if (!file.getParentFile().exists()) {  
            file.getParentFile().mkdirs();  
        }// 输出到文件流  
        try {  
            ImageIO.write(newImg, outImgPath.substring(outImgPath  
                    .lastIndexOf(".") + 1), new File(outImgPath));  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
public static Map<Integer, String> readfile(String filepath, 
Map<Integer, String> pathMap) throws Exception { 
if (pathMap == null) { 
pathMap = new HashMap<Integer, String>(); 


File file = new File(filepath); 
// 文件 
if (!file.isDirectory()) { 
pathMap.put(pathMap.size(), file.getPath()); 

} else if (file.isDirectory()) { // 如果是目录, 遍历所有子目录取出所有文件名 
String[] filelist = file.list(); 
for (int i = 0; i < filelist.length; i++) { 
File readfile = new File(filepath + "/" + filelist[i]); 
if (!readfile.isDirectory()) { 
pathMap.put(pathMap.size(), readfile.getPath()); 

} else if (readfile.isDirectory()) { // 子目录的目录 
readfile(filepath + "/" + filelist[i], pathMap); 



return pathMap; 

}  
转http://lijinzhe.blog.163.com/blog/static/62147668201222024822711/
### Java中用于压缩图片的方法或库 在Java中,可以使用多种方法和库来实现图片压缩。以下是几种常见的方法和库: #### 方法一:使用`ImageIO`和`BufferedImage`类 通过`ImageIO`和`BufferedImage`类可以直接操作图片,并将其转换为其他格式(如从PNG转为JPEG),同时改变图片的位深以实现压缩效果[^2]。 ```java import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; public class ImageCompressor { public static void main(String[] args) throws Exception { File input = new File("input.png"); BufferedImage image = ImageIO.read(input); BufferedImage bufferedImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB); bufferedImage.createGraphics().drawImage(image, 0, 0, null); ImageIO.write(bufferedImage, "jpg", new File("output.jpg")); } } ``` #### 方法二:使用`Thumbnailator`库 `Thumbnailator`是一个功能强大的第三方库,支持图片的尺寸调整和质量压缩。它提供了简单易用的API,能够快速实现图片压缩[^3]。 ```java import net.coobird.thumbnailator.Thumbnails; import java.io.File; import java.io.IOException; public class ThumbnailatorExample { public static void compressImage(String inputPath, String outputPath, float quality) throws IOException { Thumbnails.of(new File(inputPath)) .scale(1.0) .outputQuality(quality) .toFile(new File(outputPath)); } } ``` #### 方法三:使用`Imgscalr`库 `Imgscalr`是另一个流行的第三方库,专注于图片的缩放和压缩。它可以轻松调整图片大小并保持较高的视觉质量[^1]。 ```java import org.imgscalr.Scalr; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class ImgscalrExample { public static void compressImage(String inputPath, String outputPath, int quality) throws IOException { BufferedImage originalImage = ImageIO.read(new File(inputPath)); BufferedImage compressedImage = Scalr.resize(originalImage, Scalr.Method.ULTRA_QUALITY, quality); ImageIO.write(compressedImage, "jpg", new File(outputPath)); } } ``` #### 方法四:使用`javax.imageio.IIOImage`和`IIOWriteParam` 通过`javax.imageio`包中的`IIOImage`和`IIOWriteParam`类,可以更精细地控制图片压缩质量[^4]。 ```java import javax.imageio.IIOImage; import javax.imageio.ImageIO; import javax.imageio.ImageWriteParam; import javax.imageio.ImageWriter; import javax.imageio.stream.ImageOutputStream; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.util.Iterator; public class CustomCompression { public static void compressImage(String inputPath, String outputPath, float quality) throws Exception { BufferedImage image = ImageIO.read(new File(inputPath)); Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg"); if (!writers.hasNext()) throw new IllegalStateException("No writers found"); ImageWriter writer = writers.next(); ImageOutputStream ios = ImageIO.createImageOutputStream(new FileOutputStream(outputPath)); writer.setOutput(ios); ImageWriteParam param = writer.getDefaultWriteParam(); if (param.canWriteCompressed()) { param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); param.setCompressionQuality(quality); } writer.write(null, new IIOImage(image, null, null), param); ios.close(); writer.dispose(); } } ``` ### 压缩质量参数说明 压缩质量参数通常是一个介于0.0到1.0之间的浮点数,表示压缩的程度。值越接近1.0,图片质量越高,文件体积也越大;值越接近0.0,图片质量越低,但文件体积会显著减小[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值