前言
作为java程序员的你是否对业务中操作图片苦恼过?!
现在开发中,有很多应用都有上传图片这个功能,对于移动端调用手机摄像头拍照再上传图片到服务器这种操作很多。
现在的手机拍摄的图片都是高清图片,分辨率也是相当的高,当然占用内存也是不小的。
比如作者随手拍的一张:
可以看下占用多少内存:
可以看到图片分辨率3456*4608和占用4.39MB内存大小。问题也就来了,如果每用户都上传2-5M的图片怎么办?显然我想说的不是占用的服务器内存空间的问题,只要你有足够的钱,升级空间解决呀!但是网速太重要了,你的用户如果天天加载你的网页加载半天,就是因为你的图片太大导致的就不是钱能够解决的事了。因为网络环境是你不可控的,所以你只能考虑压缩图片的质量从而保证网站打开的速度。
压缩的要求
1、压缩程度可控制,想压缩成多小就多小。
2、压缩之后图片尽可能的不失真。
3、压缩速度要快。
4、代码简单,依赖较少。
5、工具形式,开箱即用。
废话少说,上工具。
Google的开源工具类------Thumbnailator 帮助文档
为什么选择Thumbnailator?
作者认为任何的技术都是解决实际业务中遇到的问题!
Thumbnailator能解决:
1.生成缩率图;
2.添加水印;
3.图片旋转;
4.图片大小缩放;
5.图片压缩;
如何使用
Thumbnailator 只需要引入一个jar,不依赖于其他任何第三方库,而且API是链式编程风格。最新版本maven依赖:
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
package cn.hxy;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;
public class ThumbnailatorTest {
public static void main(String[] args) throws IOException {
ThumbnailatorTest thumbnailatorTest = new ThumbnailatorTest();
//thumbnailatorTest.test1();
//thumbnailatorTest.test2();
//thumbnailatorTest.test3();
//thumbnailatorTest.test4();
thumbnailatorTest.test5();
}
/** * 指定大小进行缩放 * @throws IOException */
public void test1() throws IOException{
/* * size(width,height) 若图片横比200小,高比300小,不变 * 若图片横比200小,高比300大,高缩小到300,图片比例不变 若图片横比200大,高比300小,横缩小到200,图片比例不变 * 若图片横比200大,高比300大,图片按比例缩小,横为200或高为300 */ Thumbnails.of("D:\\img\\test.jpg").size(200, 300).toFile("D:\\img\\end\\test_200_300.jpg");
}
/** * 按照比例缩放 * @throws IOException */
public void test2() throws IOException{
/* * size(width,height) 若图片横比200小,高比300小,不变 * 若图片横比200小,高比300大,高缩小到300,图片比例不变 若图片横比200大,高比300小,横缩小到200,图片比例不变 * 若图片横比200大,高比300大,图片按比例缩小,横为200或高为300 */ Thumbnails.of("D:\\img\\test.jpg").scale(0.5f).toFile("D:\\img\\end\\test_0.5f.jpg");
}
/** * 不按照比例,指定大小进行缩放 * * @throws IOException */
private void test3() throws IOException {
/** * keepAspectRatio(false) 默认是按照比例缩放的 */
Thumbnails.of("D:\\img\\test.jpg").size(120, 120).keepAspectRatio(true).toFile("D:\\img\\end\\image_120x120_2.jpg");
}
/** * 旋转 * * @throws IOException */
private void test4() throws IOException {
/** * rotate(角度),正数:顺时针 负数:逆时针 */
Thumbnails.of("D:\\img\\test.jpg").size(1280, 1024).rotate(90).toFile("D:\\img\\end\\image+90.jpg");
}
/** * 水印 * * @throws IOException */
private void test5() throws IOException {
/** * watermark(位置,水印图,透明度) */
Thumbnails.of("D:\\img\\test.jpg").size(1280, 1024).watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("D:\\img\\water.jpg")), 0.5f).outputQuality(0.8f).toFile("D:\\img\\end\\image_watermark_bottom_right.jpg");
}
}