一款上传图片压缩工具及压缩图片的时机说明

某些图片需作下压缩处理,以便某些页面图片列表使用压缩图,从而提高页面图片的加载速度,图片压缩的时机可选在上传图片的时候(新增时)或者读取图片的时候。(对已有图片作压缩,历史数据)。访问图片的方法是在普通图片的前面加上尺寸前缀。如:http://xxx/image/100x100-compress-aaaaaaaaaaaaaaaaaaaaaaaaaaaa.jpg

图片压缩时机:
在这里插入图片描述
下面打开压缩图的办法是存在风险的,会导致图片无限增加。由于本项目是小圈子内的小群体使用。不存在该问题。如果要用,需要把catch里面的代码删除或者对可压缩的尺寸作下限制
在这里插入图片描述

public class ImageCompressionHelper {

    @Autowired
    private FileStoreService fileStoreService;
    @Autowired
    private FileInfoMapper fileInfoMapper;

    public final static String COMPRESS_SEPARATOR = "-compress-";

    public void compressionImage(String imgPxs, FileInfo fileInfo) {
        String extName = fileInfo.getExtName();

        String contextType;
        if ("jpg".equalsIgnoreCase(extName)) {
            contextType = MediaType.IMAGE_JPEG.toString();
        } else if ("png".equalsIgnoreCase(extName)) {
            contextType = MediaType.IMAGE_PNG.toString();
        } else if ("jpeg".equalsIgnoreCase(extName)) {
            contextType = MediaType.IMAGE_JPEG.toString();
        } else {
            return;
        }
        compressionImage(imgPxs, fileInfo, contextType);
    }

    public void compressionImage(String imgPxs, FileInfo fileInfo, String contextType) {
        ImgCompressionPxs pxs = new ImgCompressionPxs(imgPxs);
        if (ZYListUtils.isEmptyList(pxs)) {
            return;
        }

        for (ImgCompressionPx px : pxs) {
            InputStream objectStream = fileStoreService.getObjectStream(fileInfo.toFileWrapper());
            if (null != objectStream) {
                doCompress(objectStream, fileInfo, px, contextType);
            }
        }
    }

    private void doCompress(InputStream objectStream, FileInfo fileInfo, ImgCompressionPx px, String contextType) {
        // 创建BufferedImage对象并加载原始图像数据
        ByteArrayOutputStream exchangeStream = null;
        InputStream expressImgInputStream = null;
        try {
            BufferedImage originalImage = ImageIO.read(objectStream);
            // 设置目标图片大小(这里将图片按比例缩放为50%)
            int targetWidth = (px.getWidth());
            int targetHeight = (px.getHeight());

            // 创建新的空白图像对象
            BufferedImage compressedImage = new BufferedImage(targetWidth, targetHeight, originalImage.getType());

            // 获得Graphics2D对象,用于操作图像55
            Graphics2D g2d = compressedImage.createGraphics();

            // 设置插值算法为双线性插值,提高图像质量
            g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);

            // 绘制缩放后的图像到compressedImage上
            g2d.drawImage(originalImage, 0, 0, targetWidth, targetHeight, null);
            g2d.dispose();

			// 转成字节流,然后字节转成输入流
            exchangeStream = new ByteArrayOutputStream();
            ImageIO.write(compressedImage, fileInfo.getExtName(), exchangeStream);

            byte[] bytes = exchangeStream.toByteArray();

            expressImgInputStream = new ByteArrayInputStream(bytes);
			
			// 包装下上传对象
            FileWrapper fileWrapper = new FileWrapper();
            fileWrapper.setInputStream(expressImgInputStream);

            String expressImgId = px.getPx() + COMPRESS_SEPARATOR + fileInfo.getId();
            fileWrapper.setId(expressImgId);
            fileWrapper.setExtName(fileInfo.getExtName());
            fileWrapper.setNewFileName(expressImgId + ZYStrUtils.DOT + fileInfo.getExtName());
            fileWrapper.setFileSize(fileInfo.getFileSize());
            fileWrapper.setOriginalFilename(fileInfo.getNewFileName());
            fileWrapper.setContentType(contextType);
            // 上传图片,此处用的是minio,不再展示细节了
            fileStoreService.upload(fileWrapper);
			// 保存文件基本信息
            FileInfo compressFileInfo = new FileInfo(fileWrapper);
            compressFileInfo.setIsKeepAlive(YES);
            fileInfoMapper.insert(compressFileInfo);

        } catch (Exception e) {
            log.warn("图片压缩失败" + e.getMessage());
        } finally {
            IoUtil.close(objectStream);
            IoUtil.close(exchangeStream);
            IoUtil.close(expressImgInputStream);
        }
    }
}

ImgCompressionPxs 类:

	@Data
	public class ImgCompressionPxs extends ArrayList<ImgCompressionPx> {
	
	    public ImgCompressionPxs(String imgPxs) {
	        if (ZYStrUtils.isNull(imgPxs)) {
	            return;
	        }
	        // 100*200,200*400,400*600
	        List<String> pxs = ZYListUtils.str2List(imgPxs);
	
	        for (String px : pxs) {
	            this.add(new ImgCompressionPx(px));
	        }
	    }
	}
	
    @Data
    public static class ImgCompressionPx {

        private String px;

        private Integer width;

        private Integer height;

        public ImgCompressionPx(String px) {
            String[] xes = px.split("x");
            if (xes.length != 2) {
                throw new LocalException("压缩图片尺寸有误");
            }
            String widthStr = xes[0];
            String heightStr = xes[1];

            this.px = px;
            this.width = ZYNumberUtils.toInt(widthStr);
            this.height = ZYNumberUtils.toInt(heightStr);
            if (null == this.width || null == this.height) {
                throw new LocalException("压缩图片尺寸有误");
            }
        }
    }

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

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

相关文章

Java--业务场景:获取请求的ip属地信息

文章目录 前言步骤在pom文件中引入下列依赖IpUtil工具类在Controller层编写接口&#xff0c;获取请求的IP属地测试接口 IpInfo类中的方法 前言 很多时候&#xff0c;项目里需要展示用户的IP属地信息&#xff0c;所以这篇文章就记录一下如何在Java Spring boot项目里获取请求的…

灵活使用Redis高可用

1 Redis高可用 1.1 Redis的高可用方式 主从复制&#xff1a; 主从复制时高可用Redis的基础&#xff0c;哨兵和集群都是在主从复制的基础上实现高可用。主从复制主要实现了数据的多机备份&#xff0c;以及对于读操作的负载均衡和简单的故障恢复。缺陷&#xff1a;复制恢复无法…

回首2023,厉兵秣马,启航2024

目录 回首风波的20232023&#xff0c;感恩相遇暂停发文发文狂潮感恩有你备战2024学习之余跆拳道比赛做手工diy 学习心路年初学习伊始心路其后学习后来心路 必须看配图说明 未知的2024Flag 回首风波的2023 2023&#xff0c;感恩相遇 还记得&#xff0c;22年末&#xff0c;23年…

idea右上角浏览器图标没有idea内部浏览器怎么显示

idea右上角浏览器图标没有idea内部浏览器怎么显示 file -> settings -> tools -> web brosers 选择需要的浏览器&#xff0c;勾选上展示到编辑器中 打开上图的Built-in Preview&#xff0c;就会显示idea标志的内部显示了&#xff01;&#xff01;&#xff01;

第二证券:如何判断主力是在洗盘还是出货?

怎样判别主力是在洗盘仍是出货&#xff1f; 1、依据股票成交量判别 在洗盘时&#xff0c;个股的成交量与前几个生意相比较&#xff0c;呈现缩量的状况&#xff0c;而出货其成交量与前几个生意日相比较呈现放量的走势。 2、依据股票筹码分布判别 洗盘首要是将一些散户起浮筹…

面试算法108:单词演变

题目 输入两个长度相同但内容不同的单词&#xff08;beginWord和endWord&#xff09;和一个单词列表&#xff0c;求从beginWord到endWord的演变序列的最短长度&#xff0c;要求每步只能改变单词中的一个字母&#xff0c;并且演变过程中每步得到的单词都必须在给定的单词列表中…

Python 基础(四):序列

目录 简介2 基本使用2.1 索引2.2 切片2.3 相加2.4 相乘2.5 元素是否在序列中2.6 内置函数 简介 Python 中的序列是一块可存放多个值的连续内存空间&#xff0c;所有值按一定顺序排列&#xff0c;每个值所在位置都有一个编号&#xff0c;称其为索引&#xff0c;我们可以通过索引…

DAY2-English Learning

一、积累 1.trunk 案例&#xff1a; i put my luggage in the trunk of the car. 翻译&#xff1a;我把行李放在汽车的后备箱里。 2. solvent 例句&#xff1a;The sovlent is uesd to dissolve the paint. 翻译&#xff1a;溶剂是用来溶解油漆的。 3. 受伤的表达 1.cramp …

【大数据进阶第三阶段之Hue学习笔记】Hue的安装和使用

1、 Hue的安装 1.1 上传解压安装包 Hue的安装支持多种方式&#xff0c;包括rpm包的方式进行安装、tar.gz包的方式进行安装以及cloudera manager的方式来进行安装等&#xff0c;我们这里使用tar.gz包的方式来进行安装 Hue的压缩包的下载地址&#xff1a; http://archive.cloude…

hadoop自动获取时间

1、自动获取前15分钟 substr(from_unixtime(unix_timestamp(concat(substr(20240107100000,1,4),-,substr(20240107100000,5,2),-,substr(20240107100000,7,2), ,substr(20240107100000,9,2),:,substr(20240107100000,11,2),:,00))-15*60,yyyyMMddHHmmss),1) unix_timestam…

儿童护眼灯如何选择?适合儿童的护眼灯十大排行榜

为家里的孩子选择一款合适的护眼台灯&#xff0c;我想对于大多数家长来说&#xff0c;还是非常不容易的&#xff0c;需要综合考虑多个因素&#xff0c;包括色温、亮度与均匀度、无频闪、无眩光、显色指数、安全性和设计风格等。为了保护孩子的眼睛&#xff0c;可以说是费劲心思…

RTK使用步骤

RTK&#xff08;工作电压3.3V&#xff09;使用步骤 基准站&#xff08;蓝牙 WiFi&#xff09; 配置基本都在Web端&#xff0c;但配置USB-C的输入输出还是要到u-center Base Station模式 当开关设置为 Base 时&#xff0c;设备将进入 Base Station 模式。这在设备安装到固定位…

Yolov4重大的更新,结构组件

YOLO之父在2020年初宣布退出CV界&#xff0c;YOLOv4 的作者并不是YOLO系列 的原作者。YOLO V4是YOLO系列一个重大的更新&#xff0c;其在COCO数据集上的平均精度(AP)和帧率精度(FPS)分别提高了10% 和12%&#xff0c;并得到了Joseph Redmon的官方认可&#xff0c;被认为是当前最…

在生产环境中使用uWSGI来运行Flask应用

安装uwsgi pip install uwsgi -i https://pypi.tuna.tsinghua.edu.cn/simple安装不上则使用以下命令&#xff1a; conda install -c conda-forge uwsgi 当您成功安装uwsgi后&#xff0c;您可以通过以下步骤来测试uwsgi是否安装成功&#xff1a; 创建一个Python脚本&#xff…

【python基础教程】print输出函数和range()函数的正确使用方式

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 print()有多个参数&#xff0c;参数个数不固定。 有四个关键字参数&#xff08;sep end file flush&#xff09;&#xff0c;这四个关键字参数都有默认值。 print作用是将objects的内容输出到file中&#xff0c;objects中的…

linux 网络设置

查看linux基础的网络配置 命令 网关route -nip 地址ifconfig / ip aDNS 服务器cat /etc/resolv.conf主机名hostname路由route -n网络连接状态ss / netstat 一&#xff0c;ifconfig 查看网络接口信息 &#xff08;一&#xff09;ifconfig …

Java后端返回的MySQL日期数据在前端格式错误的解决方法,区分jackson和fastjson

写在前面 在写web项目的时候经常会遇到后端返回的MySQL日期数据(date)类型在前端显示不正确的情况&#xff0c;有的时候会出现一串数字的时间戳&#xff0c;有的时候显示为日期晚了一天。 这是因Json给前端返回数据的时候格式问题造成的 解决方法 其实总结起来就是一句话在…

Ansible自动化运维(二)ad-hoc 模式详解

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

postgresql 流复制原理

这部分纯理论内容&#xff0c;结合配图和数据进程了解流复制的工作逻辑。 通过WAL完成复制的方式 PostgreSQL在数据目录下的pg_wal(旧版为pg_xlog)子目录中维护了一个WAL日志文件&#xff0c;该文件用于记录数据库文件的每次改变&#xff0c;这种日志文件机制提供了一种数据库…

大数据本地环境搭建-Linux基础环境搭建

1.安装VMware 下载 VMware Workstation Pro | CN 2.配置虚拟网卡 3.Windows网络配置 4.安装centos7.9 Download (centos.org) 4.1 新建虚拟机 如果开机的时候电脑蓝屏使用WindowsR输入optionalfeatures 打开启用或关闭Windows功能->勾选打开以下两项 重启 继续安装ce…