文档章节

使用Thumbnailtor实现图片的裁剪,缩放

Soi
 Soi
发布于 2015/10/15 23:06
字数 1480
阅读 74
收藏 3
点赞 1
评论 0
pom.xml

<!-- thumbnail generation library for Java -->
<dependency>
  <groupId>net.coobird</groupId>
  <artifactId>thumbnailator</artifactId>
<version>0.4.8</version></dependency>
package team.soi.utils;

import net.coobird.thumbnailator.Thumbnails;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

/**
 * 图片工具类:<br/>
 * 使用Thumbnailtor实现图片的裁剪,缩放等。<br/>
 * 代码基于hoojo的工具类修改,主要是因为其代码使用了底层的API,具有平台依赖性。
 *
 * @author Soi 2015-10-15
 * @email ycrxun@163.com
 * @blog http://my.oschina.net/u/1580674
 */
public class ImageUtils {

    /**
     * 图像文件的格式
     */
    private static final String DEFAULT_IMAGE_FORMAT = ".jpg";
    /**
     * 默认文件存放路径
     */
    private static final String DEFAULT_FILE_PATH = "./temp-";

    private static Image image = null;

    private ImageUtils() {

    }

    /**
     * 图片压缩质量枚举<br/>
     * MAX-1.0f<br/>
     * HIGH-0.75f<br/>
     * MEDIUM-0.5f<br/>
     * LOW-0.25f<br/>
     */
    public enum ImageQuality {

        MAX(1.0f), HIGH(0.75f), MEDIUM(0.5f), LOW(0.25f);

        final Float QUALITY;

        ImageQuality(Float quality) {
            this.QUALITY = quality;
        }
    }

    /**
     * <b>function:</b> 通过目标对象的大小和标准(指定)大小计算出图片缩小的比例
     *
     * @param targetWidth    目标的宽度
     * @param targetHeight   目标的高度
     * @param standardWidth  标准(指定)宽度
     * @param standardHeight 标准(指定)高度
     * @return 最小的合适比例
     * @author hoojo
     * @createDate 2012-2-6 下午04:41:48
     */
    public static double getScaling(double targetWidth, double targetHeight, double standardWidth, double standardHeight) {
        double widthScaling = 0d;
        double heightScaling = 0d;
        if (targetWidth > standardWidth) {
            widthScaling = standardWidth / (targetWidth * 1.00d);
        } else {
            widthScaling = 1d;
        }
        if (targetHeight > standardHeight) {
            heightScaling = standardHeight / (targetHeight * 1.00d);
        } else {
            heightScaling = 1d;
        }
        return Math.min(widthScaling, heightScaling);
    }

    /**
     * 将Image的宽度、高度缩放到指定width、height,并保存在savePath目录<br/>
     *
     * @param width       缩放的宽度
     * @param height      缩放的高度
     * @param savePath    保存目录
     * @param targetImage 即将缩放的目标图片
     * @return 图片保存路径、名称
     * @throws IOException
     * @author Soi
     */
    public static String resize(int width, int height, String savePath, Image targetImage) throws IOException {
        return resize(width, height, ImageQuality.MAX.QUALITY, savePath, targetImage);
    }

    /**
     * <b>function:</b> 可以设置图片缩放质量,并且可以根据指定的宽高缩放图片
     *
     * @param width       缩放的宽度
     * @param height      缩放的高度
     * @param quality     图片压缩质量,最大值是1; 使用枚举值:{@link ImageQuality}
     *                    Some guidelines: 0.75 high quality、0.5  medium quality、0.25 low quality
     * @param savePath    保存目录
     * @param targetImage 即将缩放的目标图片
     * @return 图片保存路径、名称
     * @throws IOException
     * @author hoojo
     * @createDate 2012-2-7 上午11:01:27
     */
    public static String resize(int width, int height, Float quality, String savePath, Image targetImage) throws IOException {
        width = Math.max(width, 1);
        height = Math.max(height, 1);
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        image.getGraphics().drawImage(targetImage, 0, 0, width, height, null);

        if (savePath == null || "".equals(savePath)) {
            savePath = DEFAULT_FILE_PATH + System.currentTimeMillis() + DEFAULT_IMAGE_FORMAT;
        }

        if (quality == null || quality <= 0) {
            quality = ImageQuality.MAX.QUALITY;
        }

        Thumbnails.of(image).size(width, height).outputQuality(quality).toFile(new File(savePath));

        return savePath;
    }

    public static String resize(final int width, final int height, final String savePath, final String targetFile) throws IOException {
        return resize(width, height, savePath, new File(targetFile));
    }

    public static String resize(final int width, final int height, final String savePath, final File targetFile) throws IOException {
        return resize(width, height, savePath, new FileInputStream(targetFile));
    }

    public static String resize(final int width, final int height, final String savePath, InputStream inputStream) throws IOException {
        image = ImageIO.read(inputStream);
        int[] size = getSize(width, height, image);
        return resize(size[0], size[1], savePath, image);
    }

    /**
     * <b>function:</b> 将一个网络图片文件按照指定的比例进行缩放
     *
     * @param scale     缩放比例
     * @param savePath  保存文件路径、名称
     * @param targetURL 本地图片文件
     * @return 新的文件名称
     * @throws IOException
     * @author hoojo
     * @createDate 2012-2-7 上午10:30:56
     */
    public static String resize(final float scale, final String savePath, final URL targetURL) throws IOException {
        image = ImageIO.read(targetURL);
        int[] size = getSize(scale, image);
        return resize(size[0], size[1], savePath, image);
    }


    /**
     * <b>function:</b> 按照固定宽度进行等比缩放本地图片
     *
     * @param width      固定宽度
     * @param savePath   保存路径、名称
     * @param targetFile 本地目标文件
     * @return 返回保存路径
     * @throws IOException
     * @author hoojo
     * @createDate 2012-2-7 上午10:49:56
     */
    public static String resize(final int width, final String savePath, final File targetFile) throws IOException {
        image = ImageIO.read(targetFile);
        int[] size = getSize(width, image);
        return resize(size[0], size[1], savePath, image);
    }

    /**
     * <b>function:</b> 按照固定宽度进行等比缩放网络图片
     *
     * @param width     固定宽度
     * @param savePath  保存路径、名称
     * @param targetURL 本地目标文件
     * @return 返回保存路径
     * @throws IOException
     * @author hoojo
     * @createDate 2012-2-7 上午10:50:52
     */
    public static String resize(final int width, final String savePath, final URL targetURL) throws IOException {
        image = ImageIO.read(targetURL);
        int[] size = getSize(width, image);
        return resize(size[0], size[1], savePath, image);
    }

    /**
     * <b>function:</b> 按照固定高度进行等比缩放本地图片
     *
     * @param height     固定高度
     * @param savePath   保存路径、名称
     * @param targetFile 本地目标文件
     * @return 返回保存路径
     * @throws IOException
     * @author hoojo
     * @createDate 2012-2-7 上午10:51:17
     */
    public static String resizeByHeight(final int height, final String savePath, final File targetFile) throws IOException {
        image = ImageIO.read(targetFile);
        int[] size = getSizeByHeight(height, image);
        return resize(size[0], size[1], savePath, image);
    }

    /**
     * <b>function:</b> 按照固定高度进行等比缩放网络图片
     *
     * @param height    固定高度
     * @param savePath  保存路径、名称
     * @param targetURL 本地目标文件
     * @return 返回保存路径
     * @throws IOException
     * @author hoojo
     * @createDate 2012-2-7 上午10:52:23
     */
    public static String resizeByHeight(final int height, final String savePath, final URL targetURL) throws IOException {
        image = ImageIO.read(targetURL);
        int[] size = getSizeByHeight(height, image);
        return resize(size[0], size[1], savePath, image);
    }

    /**
     * <b>function:</b> 通过指定大小和图片的大小,计算出图片缩小的合适大小
     *
     * @param width  指定的宽度
     * @param height 指定的高度
     * @param image  图片文件
     * @return 返回宽度、高度的int数组
     * @author hoojo
     * @createDate 2012-2-6 下午05:53:10
     */
    public static int[] getSize(final int width, final int height, final Image image) {
        int[] target = getSize(image);
        double scaling = getScaling(target[0], target[1], width, height);
        long[] standard = getStandard(target, scaling);
        return new int[]{Integer.parseInt(Long.toString(standard[0])), Integer.parseInt(String.valueOf(standard[1]))};
    }

    /**
     * <b>function:</b> 通过指定的比例和图片对象,返回一个放大或缩小的宽度、高度
     *
     * @param scale 缩放比例
     * @param image 图片对象
     * @return 返回宽度、高度
     * @author hoojo
     * @createDate 2012-2-7 上午10:27:59
     */
    public static int[] getSize(final float scale, final Image image) {
        int[] target = getSize(image);
        long[] standard = getStandard(target, scale);
        return new int[]{Integer.parseInt(Long.toString(standard[0])), Integer.parseInt(String.valueOf(standard[1]))};
    }

    public static int[] getSize(final int width, final Image image) {
        int[] target = getSize(image);
        long height = Math.round((target[1] * width) / (target[0] * 1.00f));
        return new int[]{width, Integer.parseInt(String.valueOf(height))};
    }

    public static int[] getSizeByHeight(final int height, final Image image) {
        int[] target = getSize(image);
        long width = Math.round((target[0] * height) / (target[1] * 1.00f));
        return new int[]{Integer.parseInt(String.valueOf(width)), height};
    }

    public static int[] getSize(final Image image) {
        int targetWidth = image.getWidth(null);
        int targetHeight = image.getHeight(null);
        return new int[]{targetWidth, targetHeight};
    }

    public static long[] getStandard(final int[] target, final double scale) {
        long standardWidth = Math.round(target[0] * scale);
        long standardHeight = Math.round(target[1] * scale);
        return new long[]{standardWidth, standardHeight};
    }

    public static void main(String[] args) throws IOException{
        ImageUtils.resize(500,500,"/home/soi/xn.png","/home/soi/012133dsa4toxud8snsbo1.jpg");
    }

}

 

© 著作权归作者所有

共有 人打赏支持
Soi

Soi

粉丝 16
博文 11
码字总数 4845
作品 0
合川
【开源】canvas图像裁剪、压缩、旋转

前言 前段时间遇到了一个移动端对图像进行裁剪、压缩、旋转的需求。 考虑到已有各轮子的契合度都不高,于是自己重新造了一个轮子。 关于图像裁剪、压缩 在HTML5时代,的功能已经非常强大了,...

撒网要见鱼
2017/11/16
0
0
【开源】canvas图像裁剪、压缩、旋转

前言 前段时间遇到了一个移动端对图像进行裁剪、压缩、旋转的需求。 考虑到已有各轮子的契合度都不高,于是自己重新造了一个轮子。 关于图像裁剪、压缩 在HTML5时代,的功能已经非常强大了,...

撒网要见鱼
2017/11/16
0
0
【开源】canvas图像裁剪、压缩、旋转

前言 前段时间遇到了一个移动端对图像进行裁剪、压缩、旋转的需求。 考虑到已有各轮子的契合度都不高,于是自己重新造了一个轮子。 关于图像裁剪、压缩 在HTML5时代,的功能已经非常强大了,...

dailc
07/01
0
0
【bash】批量缩放、裁剪图片脚本

产品上线后好多用户写的文章都没图片,这样看起来并不能达到预想的显示效果,尤其是一打开的首页文章列表。 于是我们自己搜集了一些素材作为默认显示的封面图。 考虑网络传输及页面显示速度,...

haolisand
2015/12/03
0
0
如何在微信公众号开发中实现图片裁剪

接触微信公众号开发已经有一段时间了,发现其实和网页开发差不多,但是因为浏览器的不同,自己也碰过一些坑,其中就有怎么实现图片裁剪功能。 一开始我是用PC端的思路去做的,首先在本地获取...

豆花饭烧土豆
2016/08/17
359
0
Java 借助ImageMagic实现图片编辑服务

Java 借助ImageMagic实现图片编辑服务 java原生对于图片的编辑处理并没有特别友好,而且问题也有不少,那么作为一个java后端,如果要提供图片的编辑服务可以怎么办?也得想办法去支持业务需求...

小灰灰Blog
04/18
0
0
裁剪图片中的小细节

之前在完成一个项目时要求用户可以从相册中选择一张图片,裁剪出自己喜欢的区域作为头像或是背景的功能,尝试了许多方法后发现其中有很多小细节,于是就记录了下来,主要包括UIBezierPath与C...

小时候De_我
2016/12/19
0
0
如何为你的Android应用缩放图片[原创翻译]

很难为你的应用程序得到正确的图像缩放吗?是你的图片过大,造成内存问题?还是图片不正确缩放造成不良用户体验的结果?为了寻求一个好的解决方案,我们咨询了Andreas Agvard(索尼爱立信软件...

迷途d书童
2012/02/22
0
3
iOS 图片裁剪--YSHYClipImageController

YSHYClipImageController 实现圆形 方形两种方式的图片裁剪,支持自定义裁剪大小,支持自定义图片缩放比例。 实现圆形 方形两种方式的图片裁剪,支持自定义裁剪大小,支持自定义图片缩放比例、 ...

yangshuyuan
2015/12/11
714
1
iOS开发——UIImageView的contentMode、裁剪和layer属性详解

在我们iOS开发过程中,UIImageView是一个非常常见的控件,但是我们未必会用的很溜,因为里面的有些属性不曾注意,或者很难理解。所以会对我们使用该控件带来麻烦,在布局UI过程中可能会造成意...

CHENYUFENG1991
2016/07/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

十大Intellij IDEA快捷键

Intellij IDEA中有很多快捷键让人爱不释手,stackoverflow上也有一些有趣的讨论。每个人都有自己的最爱,想排出个理想的榜单还真是困难。以前也整理过Intellij的快捷键,这次就按照我日常开发...

HJCui
15分钟前
0
0
word 使用mathtype 编写 数学公式

下载安装,这个链接命名。。。。 http://www.mathtype.cn/xiazai.html 安装之后会多出一个选项 使用内联方式插入图表 编写公式的界面 设置支持latex 语法 输入公式回车就可以看到结果...

阿豪boy
33分钟前
0
0
Promise

定义 Promise是异步编程的一种解决方案,所谓Promise就是一个容器,里面保存着某个未来才会结束的事件(通常是一个一步操作)的结果。 特点: 2.1 对象的状态不受外界影响,三种状态pending...

litCabbage
44分钟前
0
0
设计模式:适配器模式

说明:在不改变旧接口代码的前提下,为该接口新增其他接口的功能 适配器模式可以分为:类适配器模式、对象适配器模式、接口适配器模式 前两种模式下,我会以播放器为例。老版的播放器(Playe...

人觉非常君
44分钟前
0
0
使用VsCode搭建Java开发环境,创建springboot应用

1、在 Visual Studio Code 中打开扩展视图(Ctrl+Shift+X),输入关键词java、spring分别下载Java开发插件包和springboot插件包 2、配置参数 点击设置按钮,进入设置选项,配置用户设置 在用户...

qsyan
48分钟前
20
0
调教属于你的“贾维斯”(给自己挖了一个很大的坑)

今天玩一下现在很火的人工智能。 废话不多说,先来看几张图: 看出什么蹊跷了吗? 再来看一个视频: https://www.zhihu.com/video/1002567561061511168 (演示网址和代码见文末) 人工智能离...

crossin
53分钟前
1
0
ES10-检索入门

1.创建索引,准备数据 定义索引结构 DELETE telegraphPUT telegraph{ "mappings": { "msg":{ "properties": { "title":{ "type": "text", ...

贾峰uk
59分钟前
1
0
css 三角形

1.无边框三角形 条件:width,height设置为0,border-width设置一定的宽度,border-color保留一边有颜色其他三边设置透明 .triangle{ width:0px; height:0px; border-width:40...

爱喝水的小熊
今天
0
0
NPM依赖包版本号~和^和*的区别

~ 会匹配最近的小版本依赖包,比如~1.2.3会匹配所有1.2.x版本,但是不包括1.3.0 ^ 会匹配最新的大版本依赖包,比如^1.2.3会匹配所有1.x.x的包,包括1.3.0,但是不包括2.0.0 * 这意味着安装最...

fangPeng_
今天
0
0
第三章 spring-bean之SimpleAliasRegistry(2)

前言 AliasRegistry的实现类,嗯,嗯,嗯,一个很简单的实现。只有一个map。 源码解读 接口 AliasRegistry public interface AliasRegistry {void registerAlias(String name, String al...

鸟菜啊
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部