问题背景。

典型的情景: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 图片压缩100k_Java 实现图片压缩的两种方法相关推荐

  1. 用html将竖的图片打横,【收藏】让竖版图片变横版不变形的两种方法

    朋友们大家好,我在学员群里常常会讲到两个字:大忌. 每当说到这两个字的时候,所指的情况大多是某个朋友做的PPT里的某张图片,因为被强行拉伸而导致变形. 确实,在ppt或其他的什么设计图中,图片变形乃是 ...

  2. MATLAB 保存imshow绘制图片到指定文件夹中的两种方法

    MATLAB 保存imshow绘制图片到指定文件夹中的两种方法 imwrite函数 imwrite(image,filename) imwrite(image,filename)是将图像数据image ...

  3. java web ip_详解Java Web如何限制访问的IP的两种方法

    前一阵子因为在做项目时碰到了这个功能,现在好好总结一下,至于为什么要限制IP访问,我就不多说了.然后百度了一下,现在主要有两种方式去限制IP访问,第一种是最简单的方便的,第二种是通过过滤器来限制访问. ...

  4. java中char类型转换成int类型的两种方法

    java中char类型转换成int类型的两种方法 方法一: 第一种利用Integer包装类的方法Integer.parseInt Copychar ch = '9'; if (Character.is ...

  5. 如何把图片转换成PDF格式?这两种方法不要错过

    怎么把图片转换成PDF文件格式呢?PDF文件一直以来都是我们传输文件的好帮手,它的显著效果不仅可以体现在文件上,也可以在图片中拥有良好的体验感.我们将图片转换成PDF格式来发送或者是打印,就不会出现排 ...

  6. Java去除掉HTML里面所有标签的两种方法——开源jar包和自己写正则表达式

    Java去除掉HTML里面所有标签,主要就两种,要么用开源的jar处理,要么就自己写正则表达式.自己写的话,可能处理不全一些自定义的标签.企业应用基本都是能找开源就找开源,实在不行才自己写-- 1,开 ...

  7. Java调用打印机打印PDF文档的两种方法

    最近,由于项目需求,需要增加系统调用打印机打印PDF文档功能.以前在Asp.Net项目中做过套打,但是现在的需求直接文档打印,下面是实现代码调用打印机的两种方法. 1.Java Print Servi ...

  8. python(opencv2、PIL)将图片透明背景转换成白色背景的两种方法

    对于急需要用的朋友可以直接用下面的代码 opencv2实现 import cv2def alpha2white_opencv2(img):sp=img.shapewidth=sp[0]height=s ...

  9. JAVA:线程总结及多线程实现的两种方法

    JAVA:线程总结 目录 目录 JAVA:线程总结 JAVA:线程总结 01_多线程(多线程的引入)(了解) 02_多线程(多线程并行和并发的区别)(了解) 03_多线程(Java程序运行原理和JVM ...

  10. 深入学习理解(1):java:ExecutorService invokeAll 任务的批量提交invokeAll两种方法的区别

    ExecutorService的invokeAll方法有两种用法: 1.exec.invokeAll(tasks) 2.exec.invokeAll(tasks, timeout, unit) 其中t ...

最新文章

  1. Kubenetes — YAML 基本语法
  2. 茶觉 | “治愈”的白牡丹
  3. acer switch 10 linux,【AcerSwitch10评测】高颜值的2in1电脑 Acer Switch 10评测_Acer Switch 10_笔记本评测-中关村在线...
  4. docker registry 镜像同步
  5. SpringHibernate4
  6. ubuntupython连接数据库_Ubuntu中python的mysql操作
  7. 【kafka】Kafka 幂等 Producer
  8. linux6.5关闭21端口,linux CentOS6.5 防火墙(关闭除提供系统服务以外的端口)
  9. 使用 VBScript 判断是否安装了雅虎助手的方法
  10. linux 内核 addr2line,内核调试 arm-none-linux-gnueabi-addr2line 工具使用
  11. 贪吃蛇c加加代码_C语言编写简单贪吃蛇游戏源代码
  12. 阿里云硬盘挂载与扩容
  13. 华科智标_停车场定位导航反向寻车系统
  14. 小程序之任务发布与接单平台
  15. 《社交红利》读书总结--如何从微信微博QQ空间等社交网络带走海量用户、流量与收入...
  16. C# WinForm 界面控件
  17. 支付宝公众服务是什么?
  18. 模拟浏览器整理电影榜单
  19. java计算机毕业设计养老院管理系统源码+系统+数据库+lw文档
  20. 利用MATLAB绘制各种表白心形-固定心形

热门文章

  1. 学习笔记之word2vec
  2. 百度图腾:你忽略的流量蓝海!
  3. R语言最佳学习路线和常用数据挖掘包
  4. [vue3] 使用ElementPlus页面布局搭建架子
  5. *.hbm.xml总结
  6. (每日一题)面试官:深拷贝浅拷贝的区别?如何实现一个深拷贝?
  7. 11. 查询表student——查询名字中第2个字为阳字的学生的姓名和学号。
  8. OTN模拟器拓扑配置
  9. java 正则替换 或_Java正则替换
  10. mysql游标遍历数据