thumbnailator 基本使用教程

thumbnailator 基本使用教程

本文中的 Demo 项目使用 SpringBoot 创建,代码仓库地址: thumbnailator-study: 使用 Thumbnailator 库的 Demo 程序,演示地址: www.huhailong.vip/thumbnailator-study。我的站点。)

index

使用 thumbnailator 库来操作图片非常的方便,基本上我们使用 Thumbnails这个类完成大部分的常见操作,并且使用流式调用使我们的使用体验更加完美,接下来我将介绍几种常见的使用方法。

生成指定文件夹下所有图片的缩略图

这个是 Thumbnailator 库官方的第一个演示示例,我们将完成下面步骤:

  1. 指定一个文件夹路径

  2. 指定缩略图的最大宽度和最大高度

  3. 指定缩略图格式

  4. 将生成的图片保存到指定文件夹下

Demo 界面如下:

demo1

点击提交后我们到这个文件夹下会发现,所有的图片都生成了一个带 thumbnail. 的前缀的图片,假设文件夹下有一个名为 test.jpg 的图片,那么执行完成后会生成一个名为 thumbnail.test.jpg 这里假设我们指定的缩略图图片格式为 jpg。这里需要注意的是最大宽度和最大高度,Thumbnails默认情况下是等比例操作的,也就是说如果一个图片原始尺寸是 400x200,那么我们设置最大宽度为200,最大高度也为200的时候,生成的图片大小是 200x100的。

下面是上述功能步骤的代码:

public void generateThumbnailImageForDir(String dirPath, Integer widthPix, Integer heightPix, String imageType) {
    String[]imageSuffixArray = {".jpg",".jpeg",".png"};
    File[] files = new File(dirPath).listFiles();
    if(files != null && files.length > 0){
        File[] array = Stream.of(files).filter(item -> {
            String suffix = item.getName().substring(item.getName().lastIndexOf("."));
            return Arrays.stream(imageSuffixArray).anyMatch(item2 -> item2.equalsIgnoreCase(suffix));
        }).toArray(File[]::new);
        try{
            if(array.length > 0){
                Thumbnails.of(array).size(widthPix, heightPix).outputFormat(imageType).toFiles(Rename.PREFIX_DOT_THUMBNAIL);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

输出指定大小和质量的图片

上面的操作是针对文件夹里的图片,并且最终是将图片保存到了文件夹内,在实际应用中我们可能会直接通过一个请求连接来获取图片,并且根据传递的参数来更改图片的尺寸大小和输出质量,以便避免带宽的浪费。下面就介绍以下如何实现这样的功能。我们将完成以下步骤:

  1. 指定图片文件路径

  2. 指定图片最大宽度和最大高度

  3. 指定图片输出质量

  4. 指定是否保持横纵比例

  5. 使用 HttpServletResponse 输出图片

Demo 界面如下:

点击提交后,按钮下方将会输出上方指定参数配置的图片,大家可以拖动输出质量输出不同的图片,然后下载查看图片的大小,我会发现该功能的作用,当选择了不保持横纵比例后,图片可能会变形。

下面是上述功能的代码

public void getImage(String filePath, Integer widthPix, Integer heightPix, Boolean aspect, Double opacity, HttpServletResponse response) {
    try {
        Thumbnails.of(new File(filePath)).size(widthPix,heightPix).keepAspectRatio(aspect).outputQuality(opacity).toOutputStream(response.getOutputStream());
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

上面代码中 keepAspectRatio 方法就是用来控制是否保持横纵比例,如果确定不保持横纵比例也可以用 forceSize方法代替size方法,outputQuality方法是用来控制输出质量的,它是接收一个0到1的floatdouble类型的值,toOutputStream方法将最终图片结果通过流输出到 HttpServletResponse中响应给前端。

旋转图片和添加图片水印

Demo 界面如下:

demo3

demo4

接下来将演示如何旋转图片和如何为图片添加水印,这两个功能比较简单,因此放到一个演示页面,需要注意的是,这里演示的添加水印是图片水印,文字水印的话还是需要我们通过使用 Java 中的 2D 绘图,转换成 BufferedImage 后使用。旋转图片的核心代码如下:

Thumbnails.of(new File(filePath)).size(widthPix,heightPix).rotate(deg).toOutputStream(response.getOutputStream());

上面代码中的 rotate就是用来旋转的方法,参数deg是一个0到360的浮点型数字,最终同样我们输出给响应流。

添加水印的方法代码如下:

public void addWatermark(String sourceImagePath, String watermarkImagePath, Integer widthPix, Integer heightPix,Integer watermarkWidthPix, Integer watermarkHeightPix, Float opacity, HttpServletResponse response) {
    try {
        BufferedImage bufferedImage = Thumbnails.of(new File(watermarkImagePath)).size(watermarkWidthPix, watermarkHeightPix).asBufferedImage();
        Thumbnails.of(new File(sourceImagePath)).size(widthPix,heightPix).watermark(Positions.BOTTOM_RIGHT,bufferedImage,opacity)
                    .toOutputStream(response.getOutputStream());
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

添加水印的主要方法是通过watermark设置的,它可以接收三个参数(还有第四个参数,这里没有展示):水印的位置、水印的 BufferedImage 对象,水印的不透明度(0到1的浮点型数据)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/288859.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大语言模型LLM微调技术:P-Tuning

1 引言 Bert时代,我们常做预训练模型微调(Fine-tuning),即根据不同下游任务,引入各种辅助任务loss和垂直领域数据,将其添加到预训练模型中,以便让模型更加适配下游任务的方式。每个下游任务都存…

基于华为ENSP模拟器-vlan划分网络

需求 不连外网的内网。需求隔离故障和隔离广播风暴,并要保证网络的连通。 解决方案使用三层交互机,设置vlan用于隔离网络,并在三层交互机为网关保证各个vlan之间的通讯。 实现 使用三层交互机,设置vlan用于隔离网络&#xff0…

广州怎么找工作哪里工作机会多

广州找工作上 吉鹿力招聘网 打开 吉鹿力招聘网 “注册账号”,然后输入个人基本信息,进行注册(可使用手机号注册,也可以使用邮箱注册)。 填写求职意向,基本信息点击“下一步”。 填写工作经历点击“下一步”…

【感知机】感知机(perceptron)学习算法的原始形式

感知机( perceptron )是二类分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取1 和-1二值。感知机对应输入空间(特征空间)中将实例划分为正负两类的分离超平面,是一种判别模型。感知机是神经网络与支持向量机的基础…

湖南大学-算法设计与分析-2023期末考试【原题】

前言 21:00刚刚结束的考试,凭着回忆把题目重现出来了,在复习的时候根本找不到往年的试卷,希望这张回忆的试卷能帮助到下一届的同学。知道题目基本上就能做出来了,但是不知道是真的做不出来,我就不给答案了…

交换机02_共享式交换式

1、共享式网络 早期的以太网是共享式网络,它是由集线器(HUB)相连,由一个HUB相连了两台主机,形成一个冲突域也称广播域。 (1)相关名词解释 集线器 HUB中心的意思,集线器就是对接收…

域传送漏洞

DNS解析 当用户访问域名时浏览器解析首先会查看浏览器缓存是否有对应的ip,如果没有则会到本地host文件中查看是否有对应的ip,如果没用则会将域名发送给本地区的DNS服务器. DNS服务器分为递归服务器,根服务器,权威服务器 首先是递…

【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(Docker-compose使用全解 一)

Docker-compose使用全解 Compose介绍Compose的作用和职能 Compose和Docker兼容性安装docker-compose添加可执行权限 Docker Compose常用配置imagebuildcontext上下文指定镜像名args构建环境变量 commanddepends_onports特殊映射关系 volumesenvironment Docker Compose命令详解…

牧云主机管理助手 —— 一款免费且便捷的服务器运维工具

牧云主机管理助手 —— 一款免费且便捷的服务器运维工具 在日常运维工作中,服务器管理是一项至关重要的任务。对于许多企业和个人而言,这往往意味着需要投入大量的时间和精力。然而在一些运维工具的帮助下,服务器运维工作也可以变得高效快捷…

pytest conftest定义一个fixtrue获取测试环境地址

方便全局切换地址 pytest.fixture() def config():data {测试环境: {A环境: 127.0.0.1,B环境: 127.0.0.2,C环境: 127.0.0.3,D环境: 127.0.0.4},}return data.get(测试环境, {}).get(A环境)import pytestdef test_case001(config):url http://str(config):8080/api/user/logi…

RocketMQ5.0消息过滤

前言 消费者订阅了某个主题后,RocketMQ 会将该主题中的所有消息投递给消费者。若消费者只需要关注部分消息,可通过设置过滤条件在 Broker 端进行过滤,只获取到需要关注的消息子集,避免接收到大量无效的消息。 以电商交易场景为例…

Vue3 结合typescript 组合式函数(2)

安装axios:npm install axios 1、hooks文件夹下新建useURLLoader 在APP.VUE中使用useURLLoader 使用Dog API 2、使用对象中的属性,必须使用toRefs,否则Reactive响应失效 3、使用泛型 结果:

爬虫如何获取免费代理IP(二)

89ip代理爬取代码实现 一、代码实现 import requests import time import random from fake_useragent import UserAgent from lxml import etree import os import csv""" 89ip代理爬取 """class IPSipder(object):def __init__(self):self.u…

【损失函数】Quantile Loss 分位数损失

1、介绍 Quantile Loss(分位数损失)是用于回归问题的一种损失函数,它允许我们对不同分位数的预测误差赋予不同的权重。这对于处理不同置信水平的预测非常有用,例如在风险管理等领域。 当我们需要对区间预测而不单是点预测时 分位…

ArkTS语言应用开发入门指南与简单案例解析

文章目录 前言创建项目及其介绍简单案例学习本文总结问答回顾-学习前言 在前几节课中,我们已经了解了ArkTS语言的特点以及其基本语法。现在,我们将正式利用ArkTS来进行应用开发。本节课将通过一个快速入门案例,让大家熟悉开发工具的用法,并介绍UI的基础概念。 创建项目及…

5分钟理解什么是多模态

大家好,我是董董灿。 大模型越来越多了,大模型下沉的行业也越来越多。前几周一个在电厂工作的老哥发消息问我:大模型中所谓的多模态是什么意思? 我当时大概跟他解释了一下。 其实在人工智能领域,我们经常会听到&quo…

力扣hot100 对称二叉树 递归 队列

👨‍🏫 题目地址 👨‍🏫 参考思路 递归的难点在于:找到可以递归的点 为什么很多人觉得递归一看就会,一写就废。 或者说是自己写无法写出来,关键就是你对递归理解的深不深。 对于此题&#xf…

Java后端开发——Spring实验

文章目录 Java后端开发——Spring实验一、Spring入门1.创建项目,Spring依赖包。2.创建JavaBean:HelloSpring3.编写applicationContext.xml配置文件4.测试:启动Spring,获取Hello示例。 二、Spring基于XML装配实验1.创建JavaBean类&…

requests库中Session对象超时解决过程

引言 在使用Python进行网络请求时,requests库是一个非常常用的工具。它提供了Session对象来管理和持久化参数,例如cookies、headers等。但是,对于一些需要长时间运行的请求,我们需要设置超时时间来避免长时间等待或者无限期阻塞的…

互联网加竞赛 Yolov安全帽佩戴检测 危险区域进入检测 - 深度学习 opencv

1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 Yolov安全帽佩戴检测 危险区域进入检测 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:3分创新点:4分 该项目较为新颖&am…
最新文章