java - Thumbnailator实现图片的压缩和裁切----Google开源类库

前言

作为java程序员的你是否对业务中操作图片苦恼过?!

现在开发中,有很多应用都有上传图片这个功能,对于移动端调用手机摄像头拍照再上传图片到服务器这种操作很多。

现在的手机拍摄的图片都是高清图片,分辨率也是相当的高,当然占用内存也是不小的。

比如作者随手拍的一张:

java - Thumbnailator实现图片的压缩和裁切----Google开源类库

手机随拍的一张

可以看下占用多少内存:

java - Thumbnailator实现图片的压缩和裁切----Google开源类库

图片详细信息

可以看到图片分辨率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");

}

}