精华内容
下载资源
问答
  • 问题背景。典型情景:Nemo社区中,用户上传的图片免不了要在某处给用户做展示。...这时候通常我们会在服务器对图片进行压缩,然后把压缩的图片内容回显给用户。压缩方案:这里主要找了两个java中...

    问题背景。

    典型的情景:Nemo社区中,用户上传的图片免不了要在某处给用户做展示。

    如用户上传的头像,那么其他用户在浏览该用户信息的时候,就会需要回显头像信息了。

    用户上传的原图可能由于清晰度较高而体积也相对较大,考虑用户流量带宽,一般而言我们都不会直接体积巨大的原图直接丢给用户让用户慢慢下载。

    这时候通常我们会在服务器对图片进行压缩,然后把压缩后的图片内容回显给用户。

    压缩方案:

    这里主要找了两个java中常用的图片压缩工具库:Graphics和Thumbnailator。

    1、Graphics:

    /**

    * compressImage

    *

    * @param imageByte

    * Image source array

    * @param ppi

    * @return

    */

    public static byte[] compressImage(byte[] imageByte, int ppi) {

    byte[] smallImage = null;

    int width = 0, height = 0;

    if (imageByte == null)

    return null;

    ByteArrayInputStream byteInput = new ByteArrayInputStream(imageByte);

    try {

    Image image = ImageIO.read(byteInput);

    int w = image.getWidth(null);

    int h = image.getHeight(null);

    // adjust weight and height to avoid image distortion

    double scale = 0;

    scale = Math.min((float) ppi / w, (float) ppi / h);

    width = (int) (w * scale);

    width -= width % 4;

    height = (int) (h * scale);

    if (scale >= (double) 1)

    return imageByte;

    BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

    buffImg.getGraphics().drawImage(image.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);

    ByteArrayOutputStream out = new ByteArrayOutputStream();

    ImageIO.write(buffImg, "png", out);

    smallImage = out.toByteArray();

    return smallImage;

    } catch (IOException e) {

    log.error(e.getMessage());

    throw new RSServerInternalException("");

    }

    }

    重点在于:

    BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

    buffImg.getGraphics().drawImage(image.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);

    2、Thumbnailator:

    /**

    * compressImage

    *

    * @param path

    * @param ppi

    * @return

    */

    public static byte[] compressImage(String path, int ppi) {

    byte[] smallImage = null;

    try {

    ByteArrayOutputStream out = new ByteArrayOutputStream();

    Thumbnails.of(path).size(ppi, ppi).outputFormat("png").toOutputStream(out);

    smallImage = out.toByteArray();

    return smallImage;

    } catch (IOException e) {

    log.error(e.getMessage());

    throw new RSServerInternalException("");

    }

    }

    实际测试中,批量的情境下,后者较前者更快一些。

    以上就是Java 实现图片压缩的两种方法的详细内容,更多关于Java 图片压缩的资料请关注脚本之家其它相关文章!

    展开全文
  • java图片压缩方法

    2019-10-15 18:19:57
    最近项目需要用到对图片的压缩处理,Graphics是Java绘图核心类,它可以支持两种绘图:一种是基本绘图,如画线、矩形、圆等;另一种是画图像,主要用于动画制作。 直接上代码: package Splash; import javax....

    最近项目需要用到对图片的压缩处理,Graphics是Java绘图的核心类,它可以支持两种绘图:一种是基本的绘图,如画线、矩形、圆等;另一种是画图像,主要用于动画制作。

    直接上代码:

    package Splash;
    
    import javax.imageio.ImageIO;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * @author wxb
     * @date 2011-01-14
     * @versions 1.0 图片压缩工具类 提供的方法中可以设定生成的
     * 缩略图片的大小尺寸等
     */
    public class PictureChangeSize {
    
    
        public static void main(String args[]) {
            try {
                Map<Integer, String> map = readfile("C:/Users/zhqPc/Desktop/zhqaz.jpg", 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), "C:/Users/zhqPc/Desktop/zhqazya.jpg", 1500);
                }
            } catch (Exception ex) {
            }
            System.out.println("ok");
        }
    
    
        /**
         * 图片文件读取
         * @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;
        }
    
        /**
         * * 将图片按照指定的图片尺寸压缩
         * @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
         */
        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;
        }
    }
    

     

    展开全文
  • java压缩图片方法

    2017-09-30 15:07:40
    java中根据设置宽高等比例压缩图片文件 先保存原文件,再压缩、上传
  • // 这里指定压缩的程度,参数qality是取值0~1范围内, imgWriteParams.setCompressionQuality((float) 1); imgWriteParams.setProgressiveMode(imgWriteParams.MODE_DISABLED); ColorModel colorModel =ImageIO...

    展开全部

    可以使用Draw这个类,通过改变像素来改变存储大小,实例如62616964757a686964616fe78988e69d8331333337613134下:public static boolean compressPic(String srcFilePath, String descFilePath) throws IOException {

    File file = null;

    BufferedImage src = null;

    FileOutputStream out = null;

    ImageWriter imgWrier;

    ImageWriteParam imgWriteParams;

    // 指定写图片的方式为 jpg

    imgWrier = ImageIO.getImageWritersByFormatName("jpg").next();

    imgWriteParams = new javax.imageio.plugins.jpeg.JPEGImageWriteParam(

    null);

    // 要使用压缩,必须指定压缩方式为MODE_EXPLICIT

    imgWriteParams.setCompressionMode(imgWriteParams.MODE_EXPLICIT);

    // 这里指定压缩的程度,参数qality是取值0~1范围内,

    imgWriteParams.setCompressionQuality((float) 1);

    imgWriteParams.setProgressiveMode(imgWriteParams.MODE_DISABLED);

    ColorModel colorModel =ImageIO.read(new File(srcFilePath)).getColorModel();// ColorModel.getRGBdefault();

    // 指定压缩时使用的色彩模式

    //        imgWriteParams.setDestinationType(new javax.imageio.ImageTypeSpecifier(

    //                colorModel, colorModel.createCompatibleSampleModel(16, 16)));

    imgWriteParams.setDestinationType(new javax.imageio.ImageTypeSpecifier(

    colorModel, colorModel.createCompatibleSampleModel(16, 16)));

    try {

    if (isBlank(srcFilePath)) {

    return false;

    } else {

    file = new File(srcFilePath);System.out.println(file.length());

    src = ImageIO.read(file);

    out = new FileOutputStream(descFilePath);

    imgWrier.reset();

    // 必须先指定 out值,才能调用write方法, ImageOutputStream可以通过任何

    // OutputStream构造

    imgWrier.setOutput(ImageIO.createImageOutputStream(out));

    // 调用write方法,就可以向输入流写图片

    imgWrier.write(null, new IIOImage(src, null, null),

    imgWriteParams);

    out.flush();

    out.close();

    }

    } catch (Exception e) {

    e.printStackTrace();

    return false;

    }

    return true;

    }

    public static boolean isBlank(String string) {

    if (string == null || string.length() == 0 || string.trim().equals("")) {

    return true;

    }

    return false;

    }

    展开全文
  • 前段时间在使用对图片加水印后,由于需加水印的图片的宽度和高度都非常的大,加了水印...下面对压缩的代码的分享一、采用指定宽度、高度或压缩比例 的方式对图片进行压缩 方法:[java] view plain copy/** package c

    前段时间在使用对图片加水印后,由于需加水印的图片的宽度和高度都非常的大,加了水印后图片从几百KB,变成了几MB,严重影响了图片在页面的加载速度!

    经过仔细的琢磨,决定先对图片进行压缩,再加水印。采用这种方式户,图片占用的空间没多大变化。
    下面对压缩的代码的分享

    一、采用指定宽度、高度或压缩比例 的方式对图片进行压缩 方法:

    [java] view plain copy

    package com.zx.util;
    import java.awt.Image;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import com.sun.image.codec.jpeg.JPEGCodec;
    import com.sun.image.codec.jpeg.JPEGImageEncoder;
    /** 
         * 采用指定宽度、高度或压缩比例 的方式对图片进行压缩 
         * @param imgsrc 源图片地址 
         * @param imgdist 目标图片地址 
         * @param widthdist 压缩后图片宽度(当rate==null时,必传) 
         * @param heightdist 压缩后图片高度(当rate==null时,必传) 
         * @param rate 压缩比例  
         */  
        public static void reduceImg(String imgsrc, String imgdist, int widthdist,  
                int heightdist, Float rate) {  
            try {  
                File srcfile = new File(imgsrc);  
                // 检查文件是否存在  
                if (!srcfile.exists()) {  
                    return;  
                }  
                // 如果rate不为空说明是按比例压缩  
                if (rate != null && rate > 0) {  
                    // 获取文件高度和宽度  
                    int[] results = getImgWidth(srcfile);  
                    if (results == null || results[0] == 0 || results[1] == 0) {  
                        return;  
                    } else {  
                        widthdist = (int) (results[0] * rate);  
                        heightdist = (int) (results[1] * rate);  
                    }  
                }  
                // 开始读取文件并进行压缩  
                Image src = javax.imageio.ImageIO.read(srcfile);  
                BufferedImage tag = new BufferedImage((int) widthdist,  
                        (int) heightdist, BufferedImage.TYPE_INT_RGB);  
    
                tag.getGraphics().drawImage(  
                        src.getScaledInstance(widthdist, heightdist,  
                                Image.SCALE_SMOOTH), 0, 0, null);  
    
                FileOutputStream out = new FileOutputStream(imgdist);  
                JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);  
                encoder.encode(tag);  
                out.close();  
    
            } catch (IOException ex) {  
                ex.printStackTrace();  
            }  
        }  

    二、获取图片宽度和高度的方法:
    [java] view plain copy

    /** 
         * 获取图片宽度 
         *  
         * @param file 
         *            图片文件 
         * @return 宽度 
         */  
        public static int[] getImgWidth(File file) {  
            InputStream is = null;  
            BufferedImage src = null;  
            int result[] = { 0, 0 };  
            try {  
                is = new FileInputStream(file);  
                src = javax.imageio.ImageIO.read(is);  
                result[0] = src.getWidth(null); // 得到源图宽  
                result[1] = src.getHeight(null); // 得到源图高  
                is.close();  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
            return result;  
        }  

    三、运行代码的main方法:
    [java] view plain copy

    public static void main(String[] args) {  
        /** 
         * d://3.jpg 源图片 
         * d://31.jpg 目标图片 
         * 压缩宽度和高度都是1000 
         *  
         */  
        System.out.println("压缩图片开始...");  
        File srcfile = new File("d://3.jpg");  
        System.out.println("压缩前srcfile size:" + srcfile.length());  
        reduceImg("d://3.jpg", "d://31.jpg", 1000, 1000,null);  
        File distfile = new File("d://31.jpg");  
        System.out.println("压缩后distfile size:" + distfile.length());  
    
    }  
    展开全文
  • java高清图片压缩的2种方法
  • 本篇文章主要介绍了Java图片压缩处理的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • java图片进行压缩和resize缩放的方法发布于 2020-8-10|复制链接本篇文章主要介绍了java图片进行压缩和resize调整的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下序这里展示一下如何对图片进行压缩和...
  • java上传图片的压缩方法,只是一个初入java的小白一些简单积累。还望各个大神指点!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!...
  • 主要介绍了Java中使用ImageIO类对图片进行压缩的方法,能够按指定的比例调整图片的宽高,需要的朋友可以参考下
  • 本篇文章主要介绍了java图片进行压缩和resize调整的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • java图片压缩

    2019-05-08 15:31:44
    手机端App图片上传后最好进行压缩,...图片压缩方法: pom中加上如下配置: <!-- image util --> <dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator<...
  • 序这里展示一下如何对图片进行压缩和resize。分享给大家,具体如下:压缩public static boolean compress(String src,String to, float quality) {boolean rs = true;// Build paramJPEGEncodeParam param = null;//...
  • Java 后台做图片压缩的两种方法

    万次阅读 2017-11-23 11:26:56
    最近搞项目发现前端访问网页时,如果网页中图片过大,加载速度就变得很慢,于是就在后台做了个图片压缩。有两种方法,但是图片是压缩了。但是访问速度依然很慢,甚至比以前更慢(不是因为图片过大原因)。 在...
  • java图片进行压缩和resize缩放的方法发布于 2020-8-10|复制链接本篇文章主要介绍了java图片进行压缩和resize调整的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下序这里展示一下如何对图片进行压缩和...
  • 一般我们在提交电子证件照时都要求100K以内的图片,超过则无法正常上传,那么有没有免费将图片压缩变小的方法呢?教你3个简单又免费的方法,收藏起来备用吧。方法1:最简单粗暴的方式就是直接打开图片后用聊天工具,...
  • Java 后台实现图片压缩的2种方法

    千次阅读 2019-04-18 08:36:17
    1.使用Graphics重新绘制图片+JPEGImageEncoder文件格式转换实现图片压缩 直接帖java源码,也可以下载整个Java源文件 public class CompressPic { public static void main(String[] args) { CompressPic ...
  • 今天找到的这个方法比以前项目用到的方法更好,这里记录下,方便日后使用!/*** 缩放图片(压缩图片质量,改变图片尺寸)* 若原图宽度小于新宽度,则宽度不变!* @param newWidth 新的宽度* @param quality 图片质量...
  • Base64的Java服务端解压缩图片方法

    千次阅读 2018-06-20 10:42:50
    /* * Copyright (c) ... * All Rights Reserved. */ import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.util.UUID;import java...
  • 一、 图片质量压缩方法、 二、 查找对应 Native 方法源码、 三、 分析 Bitmap.cpp 中动态注册 Native 方法
  • java图片压缩,有时由于图片自身原因,如透明PNG图、改alpha通道或四色图等。 压缩完了,会出现图片变色情况。 如: 原图 压缩完: 尝试了很多方法,如JDK原生方式及第三方组件java-image-...
  • java图片压缩打包

    2013-12-03 16:58:43
    java代码,只需要调用其中creatFile方法即可。 基本上很多代码都带注释。希望对各位有帮助。
  • BiCubicInterpolationScale.java  package com.util;  import java.awt.Image; import java.awt.Toolkit; import java.awt.image.BufferedImage; import java.awt.image.MemoryImageSource; import java...
  • 今天小编就为大家分享一篇java input 实现调用手机相机和本地照片上传图片到服务器然后压缩的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 序这里展示一下如何对图片进行压缩和resize。分享给大家,具体如下:压缩public static boolean compress(String src,String to, float quality) {boolean rs = true;// Build paramJPEGEncodeParam param = null;//...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 524
精华内容 209
关键字:

java图片压缩的方法

java 订阅