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

前言

作为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");

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文始发于我的博文App图片压缩裁剪原理和上传方案,以及那些有趣的事儿...,现转发至此。 目录 App怎么压缩质...
    zackzheng阅读 19,491评论 20 130
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,353评论 25 708
  • 7.1 压缩图片 一、基础知识 1、图片的格式 jpg:最常见的图片格式。色彩还原度比较好,可以支持适当压缩后保持...
    AndroidMaster阅读 2,575评论 0 13
  • “安之,你考的怎么样,我可能去不了我们想去的瑾州了。” “不会的,我们说好了,一直在一起,我们都可以去瑾州大学的。...
    茶小荼阅读 603评论 0 1
  • 1、疲惫 周六上班,疲惫的起床出发,让自己尽可能的打起精神。克服寒冷的天气。生活也许这就是意义。 2、导游 今天跑...
    钱程浩瀚阅读 138评论 0 2