图片上传等比压缩(java)

微信小程序有涉及到 图片上传的地方,需要对上传的图片进行压缩,开始考虑在微信小程序端直接处理。通过查询资料,可以使用wx.canvasToTempFilePath实现,但是尝试了一下感觉效果不是很好,最后考虑在后台进行压缩再保存。https://blog.csdn.net/forever_ss/article/details/51568057这篇文章中提供的方法可行,但是测试后发现压缩后的图片有白色的多余背景,并且压缩时没有根据原图片的长宽进行等比压缩,稍微修改就有了一下的代码,分享给大家。

import com.sun.imageio.plugins.jpeg.JPEGImageWriter;
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;


public class ImagesTool {
    public static void img_change(String url, String name) {
        Tosmallerpic(url, new File(url + name), "", name, (float) 0.7);
    }

    /**
     * @param f    图片所在的文件夹路径
     * @param file 图片路径
     * @param ext  扩展名(拓展名为空则覆盖原图片,否则生成新的图片)
     * @param n    图片名
     * @param per  百分比
     */
    private static void Tosmallerpic(String f, File file, String ext, String n, float per) {
        Image src;
        try {
            src = javax.imageio.ImageIO.read(file);
            String img_midname = f + n.substring(0, n.indexOf(".")) + ext + n.substring(n.indexOf("."));
            int width;
            int height;
            // 为等比缩放计算输出的图片宽度及高度
            double rate1 = ((double) src.getWidth(null))
                    / (double) 940 + 0.1;
            double rate2 = ((double) src.getHeight(null))
                    / (double) 1160 + 0.1;
            // 根据缩放比率大的进行缩放控制
            double rate = rate1 > rate2 ? rate1 : rate2;
            width = (int) (((double) src.getWidth(null)) / rate);
            height = (int) (((double) src.getHeight(null)) / rate);
            BufferedImage bufferedImage = new BufferedImage(width, height,
                    BufferedImage.TYPE_INT_RGB);
            bufferedImage.getGraphics().drawImage(
                    src.getScaledInstance(width, height, Image.SCALE_SMOOTH),
                    0, 0, null);

            FileOutputStream fos = new FileOutputStream(img_midname); //输出到文件流

            saveAsJPEG(100, bufferedImage, per, fos);
            fos.close();
        } catch (IOException 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);
        IIOMetadata imageMetaData = imageWriter.getDefaultImageMetadata(new ImageTypeSpecifier(image_to_save), null);

        if (dpi != null && !dpi.equals("")) {
            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) {
            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();
    }
}

调用方法如下:
ImagesTool.img_change("F://uploadImages","/1.jpg");

猜你喜欢

转载自blog.csdn.net/Stephen0726/article/details/81741046