zoukankan      html  css  js  c++  java
  • 图片上传压缩处理

    今天遇到一个问题,就是图片压缩需要进行处理。

    我呢,在网上直接找了一个组件:

    thumbnailator

    ok

    直接上工具类:

    import com.google.common.collect.Lists;
    import lombok.extern.slf4j.Slf4j;
    import net.coobird.thumbnailator.Thumbnails;
    import net.coobird.thumbnailator.geometry.Position;
    
    import javax.imageio.ImageIO;
    import java.awt.image.BufferedImage;
    import java.io.*;
    import java.nio.channels.FileChannel;
    import java.util.List;
    
    /**
     * @author hmb
     * @des 图片工具处理类
     */
    @Slf4j
    public class ImageUtil {
    
        /**
         * 定义允许上传的图片格式
         */
        private static List<String> imgTypes = Lists.newArrayList("gif", "jpeg", "jpg", "png", "bmp");
    
        /**
         * 检查格式是否合法
         *
         * @param imageType
         * @return
         */
        public static boolean checkType(String imageType) {
            boolean flag = false;
            if (imgTypes.contains(imageType.toLowerCase())) {
                flag = true;
            }
            return flag;
        }
    
        /**
         * 根据图片对象获取对应InputStream
         *
         * @param image
         * @param readImageFormat
         * @return
         * @throws IOException
         */
        public static InputStream getInputStream(BufferedImage image, String readImageFormat) throws IOException {
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            ImageIO.write(image, readImageFormat, os);
            InputStream is = new ByteArrayInputStream(os.toByteArray());
            os.close();
            return is;
        }
    
        /**
         * 指定大小 压缩图片
         * 默认输出50%质量图片
         *
         * @param in      输出流
         * @param width   图片长度
         * @param height  图片宽度
         * @param quality 图片压缩质量 范围:0.0~1.0,1为最高质量
         * @param scale  按照比例进行缩放 0.0~1.0
         * @return
         * @throws IOException
         */
        public static InputStream compress(InputStream in, Integer width, Integer height, Float quality,Double scale) throws IOException {
            if (in == null) {
                return null;
            }
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            Thumbnails.Builder builder=Thumbnails.of(in);
            if(width!=null && height!=null){
                builder.size(width.intValue(),height.intValue());
            }
    
            if(scale!=null){
                builder.scale(scale.doubleValue());
            }
            if(quality!=null){
                builder.outputQuality(quality.floatValue());
            }
            builder.toOutputStream(os);
         builder.keepAspectRatio(false);//严格按宽高输出  InputStream is
    = new ByteArrayInputStream(os.toByteArray()); in.close(); os.close(); return is; } public static void inputstreamToFile(InputStream ins,File file) throws IOException{ OutputStream os = new FileOutputStream(file); int bytesRead = 0; byte[] buffer = new byte[8192]; while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) { os.write(buffer, 0, bytesRead); } os.close(); ins.close(); } /** * 指定大小进行缩放 若图片横比width小,高比height小,不变 若图片横比width小,高比height大,高缩小到height,图片比例不变 * 若图片横比width大,高比height小,横缩小到width,图片比例不变 * 若图片横比width大,高比height大,图片按比例缩小,横为width或高为height * * @param source 输入源 * @param output 输出源 * @param width 宽 * @param height 高 * @throws IOException */ public static void imgThumb(String source, String output, int width, int height, float quality) throws IOException { Thumbnails.of(source).size(width, height).outputQuality(quality).outputFormat("jpg").toFile(output); } /** * 指定大小进行缩放 * * @param source 输入源 * @param output 输出源 * @param width 宽 * @param height 高 * @throws IOException */ public static void imgThumb(File source, String output, int width, int height, float quality) throws IOException { Thumbnails.of(source).size(width, height).outputQuality(quality).outputFormat("jpg").toFile(output); } /** * 按照比例进行缩放 * * @param source 输入源 * @param output 输出源 * @throws IOException */ public static void imgScale(String source, String output, double scale) throws IOException { Thumbnails.of(source).scale(scale).outputFormat("jpg").toFile(output); } public static void imgScale(File source, String output, double scale) throws IOException { Thumbnails.of(source).scale(scale).outputFormat("jpg").toFile(output); } /** * 不按照比例,指定大小进行缩放 * * @param source 输入源 * @param output 输出源 * @param width 宽 * @param height 高 * @param keepAspectRatio 默认是按照比例缩放的,值为false 时不按比例缩放 */ public static void imgNoScale(String source, String output, int width, int height, boolean keepAspectRatio) throws IOException { Thumbnails.of(source).size(width, height).keepAspectRatio(keepAspectRatio).outputFormat("jpg").toFile(output); } public static void imgNoScale(File source, String output, int width, int height, boolean keepAspectRatio) throws IOException { Thumbnails.of(source).size(width, height).keepAspectRatio(keepAspectRatio).outputFormat("jpg").toFile(output); } /** * 水印 * * @param source 输入源 * @param output 输入源 * @param width 宽 * @param height 高 * @param position 水印位置 Positions.BOTTOM_RIGHT o.5f * @param watermark 水印图片地址 * @param transparency 透明度 0.5f * @param quality 图片质量 0.8f */ public static void imgWatermark(String source, String output, int width, int height, Position position, String watermark, float transparency, float quality) throws IOException { Thumbnails.of(source).size(width, height).watermark(position, ImageIO.read(new File(watermark)), transparency) .outputQuality(0.8f).outputFormat("jpg").toFile(output); } public static void imgWatermark(File source, String output, int width, int height, Position position, String watermark, float transparency, float quality) throws IOException { Thumbnails.of(source).size(width, height).watermark(position, ImageIO.read(new File(watermark)), transparency) .outputQuality(0.8f).outputFormat("jpg").toFile(output); } /** * 裁剪图片 * * @param source 输入源 * @param output 输出源 * @param position 裁剪位置 * @param x 裁剪区域x * @param y 裁剪区域y * @param width 宽 * @param height 高 * @param keepAspectRatio 默认是按照比例缩放的,值为false 时不按比例缩放 */ public static void imgSourceRegion(String source, String output, Position position, int x, int y, int width, int height, boolean keepAspectRatio) throws IOException { Thumbnails.of(source).sourceRegion(position, x, y).size(width, height).keepAspectRatio(keepAspectRatio) .outputFormat("jpg").toFile(output); } public static void imgSourceRegion(File source, String output, Position position, int x, int y, int width, int height, boolean keepAspectRatio) throws IOException { Thumbnails.of(source).sourceRegion(position, x, y).size(width, height).keepAspectRatio(keepAspectRatio) .outputFormat("jpg").toFile(output); } /** * 按坐标裁剪 * * @param source 输入源 * @param output 输出源 * @param x 起始x坐标 * @param y 起始y坐标 * @param x1 结束x坐标 * @param y1 结束y坐标 * @param width 宽 * @param height 高 * @param keepAspectRatio 默认是按照比例缩放的,值为false 时不按比例缩放 */ public static void imgSourceRegion(String source, String output, int x, int y, int x1, int y1, int width, int height, boolean keepAspectRatio) throws IOException { Thumbnails.of(source).sourceRegion(x, y, x1, y1).size(width, height).keepAspectRatio(keepAspectRatio) .toFile(output); } public static void imgSourceRegion(File source, String output, int x, int y, int x1, int y1, int width, int height, boolean keepAspectRatio) throws IOException { Thumbnails.of(source).sourceRegion(x, y, x1, y1).size(width, height).keepAspectRatio(keepAspectRatio) .outputFormat("jpg").toFile(output); } /** * 转化图像格式 * * @param source 输入源 * @param output 输出源 * @param width 宽 * @param height 高 * @param format 图片类型,gif、png、jpg */ public static void imgFormat(String source, String output, int width, int height, String format) throws IOException { Thumbnails.of(source).size(width, height).outputFormat(format).toFile(output); } public static void imgFormat(File source, String output, int width, int height, String format) throws IOException { Thumbnails.of(source).size(width, height).outputFormat(format).outputFormat("jpg").toFile(output); } /** * 输出到OutputStream * * @param source 输入源 * @param output 输出源 * @param width 宽 * @param height 高 * @return toOutputStream(流对象) */ public static OutputStream imgOutputStream(String source, String output, int width, int height) throws IOException { OutputStream os = new FileOutputStream(output); Thumbnails.of(source).size(width, height).outputFormat("jpg").toOutputStream(os); return os; } public static OutputStream imgOutputStream(File source, String output, int width, int height) throws IOException { OutputStream os = new FileOutputStream(output); Thumbnails.of(source).size(width, height).outputFormat("jpg").toOutputStream(os); return os; } /** * 输出到BufferedImage * * @param source 输入源 * @param output 输出源 * @param width 宽 * @param height 高 * @param format 图片类型,gif、png、jpg * @return BufferedImage */ public static BufferedImage imgBufferedImage(String source, String output, int width, int height, String format) throws IOException { BufferedImage buf = Thumbnails.of(source).size(width, height).outputFormat("jpg").asBufferedImage(); ImageIO.write(buf, format, new File(output)); return buf; } public static BufferedImage imgBufferedImage(File source, String output, int width, int height, String format) throws IOException { BufferedImage buf = Thumbnails.of(source).size(width, height).outputFormat("jpg").asBufferedImage(); ImageIO.write(buf, format, new File(output)); return buf; } }

    这工具类,可将图片裁剪,压缩,等比缩放。。。还可以哦

  • 相关阅读:
    windows下搭建基于eclipse插件的GoLang开发环境
    vtk类之vtkImageReslice:基本算法,对体数据沿着轴进行切片
    vtk类之vtkTextureMapToSphere:纹理映射算法, 映射球体纹理
    wxpython 之 GDI 画刷Brush(三)
    c# 获取Rss数据
    C# 基础知识系列之面向对象基础
    SilverLight 得到文件绝对路径
    SilverLight C# 读取并修改App.config文件
    Silverlight 脱离浏览器
    C# 中New关键字的用法
  • 原文地址:https://www.cnblogs.com/huzi007/p/8780889.html
Copyright © 2011-2022 走看看