当前位置 : 主页 > 编程语言 > c++ >

图片压缩 格式转换工具类

来源:互联网 收集:自由互联 发布时间:2021-07-03
code import org.springframework.util.Assert;import javax.imageio.ImageIO;import java.awt.*;import java.awt.geom.AffineTransform;import java.awt.image.AffineTransformOp;import java.awt.image.BufferedImage;import java.io.*;/** * 图片格式转
code
import org.springframework.util.Assert;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.*;

/**
 * 图片格式转换 压缩 工具类
 * 
 */
public final class ImageUtil {

    private ImageUtil(){
        throw new AssertionError("403 forbidden");
    }

    /**
     * 将图片{@link BufferedImage}按指定像素压缩
     * @param image  源图片文件
     * @param maxPixel  转换的像素(如:maxPixel=720)
     * @param format:压缩后想要转换的图片类型
     * @param
     */
    public static byte[] writeBytes(BufferedImage image, int maxPixel, String format) {
        Assert.notNull(image, "image can not be null or empty.");
        Assert.isTrue(maxPixel > 0, "maxPixel  > 0 required.");
        // 生成图片转化对象
        AffineTransform transform = new AffineTransform();
        int imageWidth = image.getWidth();//原图片的高度
        int imageHeight = image.getHeight();//原图片的宽度
        int changeWidth = 0;//压缩后图片的高度
        int changeHeight = 0;//压缩后图片的宽度
        double scale = 0;// 定义小图片和原图片比例
        if (maxPixel != 0) {
            if (imageWidth > imageHeight) {
                changeWidth = maxPixel;
                scale = (double) changeWidth / (double) imageWidth;
                changeHeight = (int) (imageHeight * scale);
            } else {
                changeHeight = maxPixel;
                scale = (double) changeHeight / (double) imageHeight;
                changeWidth = (int) (imageWidth * scale);
            }
        }
        // 生成转换比例
        transform.setToScale(scale, scale);
        // 生成转换操作对象
        AffineTransformOp transOp = new AffineTransformOp(transform, null);
        //生成压缩图片缓冲对象
        BufferedImage newImage = new BufferedImage(changeWidth, changeHeight,
                BufferedImage.TYPE_3BYTE_BGR);
        //生成缩小图片
        transOp.filter(image, newImage);

        return writeBytes(newImage, format);
    }

    /**
     *
     * 将{@link BufferedImage}生成formatName指定格式的图像数据
     * @param source
     * @param formatName 图像格式名,图像格式名错误则抛出异常
     * @return
     */
    public static byte[] writeBytes(BufferedImage source,String formatName){
        Assert.notNull(source, "source can not be null or empty.");
        Assert.notNull(formatName, "formatName can not be null or empty.");
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        Graphics2D g = null;
        try {
            for(BufferedImage image = source; !ImageIO.write(image, formatName, output);){
                if(null!=g)
                    throw new IllegalArgumentException(String.format("not found writer for '%s'",formatName));
                image = new BufferedImage(source.getWidth(),
                        source.getHeight(), BufferedImage.TYPE_INT_RGB);
                g = image.createGraphics();
                g.drawImage(source, 0, 0,null);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (null != g)
                g.dispose();
        }
        return output.toByteArray();
    }

    public static void main(String[] args) {
        try {
            BufferedImage image = ImageIO.read(new File("E:\\document\\001.jpg"));
            FileOutputStream fileOutputStream = new FileOutputStream(new File("E:\\document\\002.jpg"));
            fileOutputStream.write(writeBytes(image, 400, "JPEG"));
            fileOutputStream.flush();
            fileOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
上一篇:Spring事务的属性
下一篇:核心servlet代码
网友评论