文档章节

不改变图片尺寸压缩图片,减少页面图片加载时间。

掌上流年
 掌上流年
发布于 2017/08/23 18:10
字数 570
阅读 17
收藏 0

    当做到上传图片的功能时,用户或许会上传一些超清的,很大的图片。那样显示到首页会耗费更多的时间来加载图片。这里写一篇关于保存图片尺寸并压缩图片的博客。不啰嗦了,直接上代码。

    首先将图片转为byte[ ]数组。

    这里是将图片转为byte[ ]数组的方法:

    //参数path为图片路径

  public static byte[] image2byte(String path) {
        byte[] data = null;
        FileImageInputStream input = null;
        try {
            input = new FileImageInputStream(new File(path));
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            byte[] buf = new byte[1024];
            int numBytesRead = 0;
            while ((numBytesRead = input.read(buf)) != -1) {
                output.write(buf, 0, numBytesRead);
            }
            data = output.toByteArray();
            output.close();
            input.close();
        } catch (FileNotFoundException ex1) {
            ex1.printStackTrace();
        } catch (IOException ex1) {
            ex1.printStackTrace();
        }
        return data;
    }

    然后减少图片的分辨率来达到压缩图片的功能

    //参数imageByte为byte[ ]图片,可用上面的方法获取

    //参数quality为将图片压缩到什么程度,quality越大图片占空间越大,越清晰。quality越小图片越模糊,占空间越小。(0.001~0.999之间),具体合适的区间自己可以测试下。

public static byte[] compressPic(byte[] imageByte, float quality) {
        byte[] inByte = null;
        try {
            ByteArrayInputStream byteInput = new ByteArrayInputStream(imageByte);
            Image img = ImageIO.read(byteInput);
            float newWidth = img.getWidth(null);
            float newHeight = img.getHeight(null);

            Image image = img.getScaledInstance((int) newWidth, (int) newHeight, Image.SCALE_SMOOTH);

            // 缩放图像
            BufferedImage tag = new BufferedImage((int) newWidth, (int) newHeight, BufferedImage.TYPE_INT_RGB);
            Graphics2D g = tag.createGraphics();
            g.drawImage(image, 0, 0, null); // 绘制缩小后的图
            g.dispose();
            ByteArrayOutputStream out = new ByteArrayOutputStream(imageByte.length);
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
            JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(tag);
            /* 压缩质量 */
            jep.setQuality(quality, true);
            encoder.encode(tag, jep);
            inByte = out.toByteArray();
            out.close();

        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return inByte;
    }

上述方法返回了一个压缩后的byte[ ]数组,这里将数组转回图片文件并保存。

//data参数为要转型的byte[ ]数组。

//path参数为转型后将图片保存到的位置,这里为路径。

public static void byte2image(byte[] data, String path) {
        if (data.length < 3 || path.equals(""))
            return;
        try {
            FileImageOutputStream imageOutput = new FileImageOutputStream(new File(path));
            imageOutput.write(data, 0, data.length);
            imageOutput.close();
            System.out.println("Make Picture success,Please find image in " + path);
        } catch (Exception ex) {
            System.out.println("Exception: " + ex);
            ex.printStackTrace();
        }
    }

    这样既可实现压缩功能,可以对比一下压缩前后所占空间。

    这里的quality貌似不是百分比压缩。

    目前此功能可能会繁琐些,我正在继续跟进学习,如有更好的方法会写到博客中,请继续跟进。若有更好的方法请留言给我。

© 著作权归作者所有

共有 人打赏支持
掌上流年
粉丝 5
博文 2
码字总数 1125
作品 0
伊春
程序员
私信 提问
提高网页的加载速度浅析

加快网页的加载速度,无疑是提高用户体验的一个很好的方法。但是这里我们如何提高网页的加载速度呢?这里我总结了几点。 当然,这也是我第一天上班来的第一个任务。。。 1、使用良好的结构 ...

hello菜bird
2016/08/09
53
0
如何提高网页的加载速度

加快网页的加载速度,无疑是提高用户体验的一个很好的方法。但是这里我们如何提高网页的加载速度呢?这里我总结了几点。 当然,这也是我第一天上班来的第一个任务。。。 1、使用良好的结构 ...

邪气小生
2016/07/14
87
0
HTML和CSS高级指南之一——性能与架构

本文由99根据Shay Howe的《An Adavnced Guide to HTML & CSS》第一课《Performance & Organization》所译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点。如需...

石佛慈悲
2013/12/05
0
2
如何提升网站在移动端的打开速度(转)

原文来自:http://www.studyofnet.com/news/173.html 本文导读:“移动网络”是个非常模糊的概念, 2g 3g wifi都是移动网络,但是网络特性以及对应的优化方法还是有些区别的。 对于移动端而言...

巴顿
2014/11/28
0
6
《前端之路》之 前端图片 类型 & 优化 & 预加载 & 懒加载 & 骨架屏

目录 前端图片 类型 & 优化 & 预加载 & 懒加载 & 骨架屏 前端图片 类型 & 优化 & 预加载 & 懒加载 & 骨架屏 一、 前端图片的类型 1.1、矢量图 和 位图 一般来说矢量图表示的是几何图形,文件...

SmallW
08/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

阿里云ACM:云原生配置管理利器

摘要: 在传统架构中,如果配置信息有变更,通常是登陆服务器手动修改配置来使配置生效。在微服务架构中,应用数和节点数由于微服务化数量激增,导致发布次数增加,配置变更难度加大,通常是...

阿里云官方博客
4分钟前
0
0
js 对象合并

var o1 = { a: 1 };var o2 = { b: 2 };var o3 = { c: 3 };var obj = Object.assign(o1, o2, o3);console.log(obj); // { a: 1, b: 2, c: 3 }console.log(o1); // { a: 1, b: 2, c: 3 ......

zdglf
4分钟前
0
0
iframe引入方法

在js里定义: $(function () { $(".frameHead").load("../common/header.html"); $(".frameFoot").load("../common/footer.html"); }) 在需要导入iframe的页面添加标签<div class="frameHead......

kitty1116
4分钟前
0
0
华尔街留下的指标之王(附代码展示)

一. 写在前面的话 有人认为价格围绕价值上下波动,研究投资标的内在价值,于是就出现了基本面派; 有人为价格反映了一切,所有的信息(包括基本面)都反映到了盘面价格中,于是就有了技术面派...

酒逢知己千杯少
8分钟前
0
0
基于算法的建模--小结

中国龙-扬科
15分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部