java 本地图片压缩 转base64并限制文件大小

2023-11-17

  1. /**
    • 本地图片转base64并限制文件大小
    • @param imagePath 图片全路径
    • @param sizeLimit 大小 整数 限制的大小 KB 1024
    • @return 返回值为0,imageurl为空;返回值为1,imageurl路径不可访问;具体指为转换后的值
      */
      public static String convertLocalImageToBase64(String imagePath, Integer sizeLimit) {
      Log.debug(“[本地图片转base64]imagePath:{},sizeLimit:{}” + imagePath + sizeLimit);
      // 判断路径是否为空
      if (StrUtil.isBlank(imagePath)) {
      Log.debug(“传入的地址为空!”);
      return “0”;
      }
      // 默认上限为50k
      if (sizeLimit == null) {
      sizeLimit = 50;
      }
      sizeLimit = sizeLimit * 1024;
      String base64Image = null;
      DataInputStream dataInputStream = null;
      ByteArrayOutputStream outputStream = null;
      ByteArrayInputStream inputStream = null;
      try {
      FileInputStream fis = new FileInputStream(imagePath);
      dataInputStream = new DataInputStream(fis);
      outputStream = new ByteArrayOutputStream();
      byte[] buffer = new byte[2048];
      int length;
      while ((length = dataInputStream.read(buffer)) > 0) {
      outputStream.write(buffer, 0, length);
      }
      byte[] context = outputStream.toByteArray();
      Log.debug(“[本地图片转base64]byte context”);
      // 将图片数据还原为图片
      inputStream = new ByteArrayInputStream(context);
      BufferedImage image = ImageIO.read(inputStream);
      int imageSize = context.length;
      int type = image.getType();
      int height = image.getHeight();
      int width = image.getWidth();
      BufferedImage tempImage;
      // 判断文件大小是否大于size,循环压缩,直到大小小于给定的值
      Log.debug(“[imageSize]” + imageSize + " sizeLimit :" + sizeLimit);
      while (imageSize > sizeLimit) {
      Log.debug(“[循环压缩]” + imageSize + " ,sizeLimit :" + sizeLimit);
      // 将图片长宽压缩到原来的90%
      height = new Double(height * 0.9).intValue();
      width = new Double(width * 0.9).intValue();
      tempImage = new BufferedImage(width, height, type);
      // 绘制缩小后的图 //不执行也不报错需要配置下服务器tomcat启动配置 留在文章结尾
      Log.debug(“[tempImage]” + tempImage);
      tempImage.getGraphics().drawImage(image, 0, 0, width, height, null);
      // 重新计算图片大小
      outputStream.reset();
      boolean wriFlag = ImageIO.write(tempImage, “jpg”, outputStream);
      imageSize = outputStream.toByteArray().length;
      Log.debug(“[压缩后 imageSize]” + imageSize);
      }
      // 将图片转化为base64并返回
      byte[] data = outputStream.toByteArray();
      // 此处一定要使用org.apache.tomcat.util.codec.binary.Base64,防止再linux上出现换行等特殊符号
      base64Image = Base64.encodeBase64String(data);
      return base64Image;
      } catch (Exception e) {
      Log.error(“[本地图片转base64][异常]”, e);
      } finally {
      IoUtil.close(dataInputStream);
      IoUtil.close(outputStream);
      IoUtil.close(inputStream);
      }
      Log.debug(“[本地图片转base64]base64Image的长度:{}” + base64Image.length());
      return base64Image;
      }

//这个不执行困扰了好几天,找了很多说法也换了很多方法都不行,最后在tomcat启动配置项修改了下 竟然成功了

linux下tomcat的启动文件要设置JAVA_OPTS=“-Djava.awt.headless=true”
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 本地图片压缩 转base64并限制文件大小 的相关文章

  • 带有 Android 支持库 v7 的 Maven Android 插件

    我使用 maven android plugin 构建我的 android 应用程序 它依赖于 android 支持库 v4 和 v7 由于我没有找到如何从developer android com下载整个sdk 因此我无法使用maven
  • 使用 WebDriver 单击新打开的选项卡中的链接

    有人可以在这种情况下帮助我吗 场景是 有一个网页 我仅在新选项卡中打开所有指定的链接 现在我尝试单击新打开的选项卡中的任何一个链接 在下面尝试过 但它仅单击主 第一个选项卡中的一个链接 而不是在新选项卡中 new Actions drive
  • (Java) App Engine 中的静态文件无法访问

    The 示例文档 http code google com appengine docs java gettingstarted staticfiles html表示您只需将文件放在 war 或子目录 中 并且应该可以从主机访问它们 只要它
  • HAProxy SSL终止+客户端证书验证+curl/java客户端

    我希望使用我自己的自签名证书在 HAProxy 上进行 SSL 终止 并使用我创建的客户端证书验证客户端访问 我通过以下方式创建服务器 也是 CA 证书 openssl genrsa out ca key 1024 openssl req
  • 如何将jscrollpane添加到jframe?

    我有以下源代码 有人可以给我建议如何将 jscrollpane 添加到 jframe 上吗 我尝试了几次将其添加到 jframe 但没有任何进展 它甚至没有显示 public class Form3 JFrame jframe new JF
  • Reactive Spring 不支持 HttpServletRequest 作为 REST 端点中的参数?

    我创建了一个 RestController 如下所示 RestController public class GreetingController RequestMapping value greetings method RequestM
  • 删除优先级队列的尾部元素

    如何删除优先级队列的尾部元素 我正在尝试使用优先级队列实现波束搜索 一旦优先级队列已满 我想删除最后一个元素 优先级最低的元素 Thanks 没有简单的方法 将元素从原始元素复制到新元素 最后一个除外 PriorityQueue remov
  • 从 MS Access 中提取 OLE 对象(Word 文档)

    我有一个 Microsoft Access 数据库 其中包含一个包含 Microsoft Word 文档的 OLE 对象字段 我试图找到代码来检索保存在 OLE 对象中的文件 以便用户可以从我的 JavaFx 应用程序中的按钮下载它 但没有
  • 当 minifyEnabled 为 true 时 Android 应用程序崩溃

    我正在使用多模块应用程序 并且该应用程序崩溃时minifyEnabled true in the installed模块的build gradle 以下是从游戏控制台检索到的反混淆堆栈跟踪 FATAL EXCEPTION Controlle
  • Eclipse - 安装新的 JRE (Java SE 8 1.8.0)

    我正在尝试安装 Java 8 到目前为止我所做的 安装最新版本的 Eclipse 下载并安装 Java SE 运行时环境 8http www oracle com technetwork java javase downloads jre8
  • 如何从日期中删除毫秒、秒、分钟和小时[重复]

    这个问题在这里已经有答案了 我遇到了一个问题 我想比较两个日期 然而 我只想比较年 月 日 这就是我能想到的 private Date trim Date date Calendar calendar Calendar getInstanc
  • Karaf / Maven - 无法解决:缺少需求 osgi.wiring.package

    我无法在 Karaf 版本 3 0 1 中启动捆绑包 该包是使用 Maven 构建的并导入gson http mvnrepository com artifact com google code gson gson 2 3 1 我按照要求将
  • IntelliJ 组织导入

    IntelliJ 是否具有类似于 Eclipse 中的组织导入功能 我拥有的是一个 Java 文件 其中多个类缺少导入 例子 package com test public class Foo public Map map public J
  • Lombok @Builder 不创建不可变对象?

    在很多网站上 我看到 lombok Builder 可以用来创建不可变的对象 https www baeldung com lombok builder singular https www baeldung com lombok buil
  • 使用Java绘制维恩图

    我正在尝试根据给定的布尔方程绘制维恩图 例如 a AND b AND c我想在 Android 手机上执行此操作 因此我需要找到一种使用 Java 来执行此操作的方法 我找到了一个完美的小部件 它可以完成我在这方面寻找的一切布尔代数计算器
  • 禁用 Android 菜单组

    我尝试使用以下代码禁用菜单组 但它不起作用 菜单项仍然启用 你能告诉我出了什么问题吗 资源 菜单 menu xml menu menu
  • 如何处理 StaleElementReferenceException

    我正在为鼠标悬停工作 我想通过使用 for 循环单击每个链接来测试所有链接的工作条件 在我的程序中 迭代进行一次 而对于下一次迭代 它不起作用并显示 StaleElementReferenceException 如果需要 请修改代码 pub
  • 替换文件中的字符串

    我正在寻找一种方法来替换文件中的字符串而不将整个文件读入内存 通常我会使用 Reader 和 Writer 即如下所示 public static void replace String oldstring String newstring
  • 使用 JFreeChart 为两个系列设置不同的 y 轴

    我正在使用 JFreeChart 使用折线图绘制两个数据系列 XYSeries 复杂的因素是 其中一个数据系列的 y 值通常远高于第二个数据系列的 y 值 假设第一个系列的 y 值约为数百万数量级 而第二个数据系列的 y 值约为数百万数量级
  • 即使调整大小,如何获得屏幕的精确中间位置

    好的 这个问题有两部分 当我做一个JFrame 并在其上画一些东西 即使我将宽度设置为 400 并使其在一个项目击中它时 当然 允许项目宽度 它会反弹回来 但由于某种原因 它总是偏离屏幕约 10 个像素 有没有办法解决这个问题 或者我只需要

随机推荐

  • 微服务系列:Spring Cloud Alibaba 之 Sentinel 高级流控规则

    微服务系列 Spring Cloud Alibaba 之 Sentinel 基本流控规则 在上一篇中 我们学习完了 Sentinel 的基本流控规则 这篇我们来研究一下 Sentinel 的高级流控规则 话不多说 开始今天的学习 一 概述
  • 【进阶项目】Lombok 使用详解

    前言 在 Java 应用程序中存在许多重复相似的 生成之后几乎不对其做更改的代码 但是我们还不得不花费很多精力编写它们来满足 Java 的编译需求比如 在 Java 应用程序开发中 我们几乎要为所有 Bean 的成员变量添加 get set
  • 【java毕业设计】基于java+Lucene+Tomcat的搜索引擎设计与实现(毕业论文+程序源码)——搜索引擎

    基于java Lucene Tomcat的搜索引擎设计与实现 毕业论文 程序源码 大家好 今天给大家介绍基于java Lucene Tomcat的搜索引擎设计与实现 文章末尾附有本毕业设计的论文和源码下载地址哦 需要下载开题报告PPT模板及
  • 忽略shell脚本中回车的方法

    在实际应用过程中 经常遇到需要忽略shell脚本中回车的问题 本文做了一些总结 既有常规操作 也有令人拍案叫绝的方法 且让我慢慢说来 一 使用Linux shell自身的字符串操作 Linux shell内置了一系列的字符串操作符号 可以实
  • 高并发的epoll+多线程

    epoll是linux下高并发服务器的完美方案 因为是基于事件触发的 所以比select快的不只是一个数量级 单线程epoll 触发量可达到15000 但是加上业务后 因为大多数业务都与数据库打交道 所以就会存在阻塞的情况 这个时候就必须用
  • algorithm 修改序列的操作

    文章目录 修正序列算法 fill first last val random shuffle first last partition first last pred rotate first middle last 相关参考 修正序列算法
  • logback历史日志无法自动删除的问题

    例如在logback spring xml进行如下配置
  • 基于Tensorflow实现一个Transformer翻译器

    Transformer是谷歌在2017年的一篇论文 Attention is all you need 提出的一个seq2seq的模型架构 其创造性的提出了自注意力的思想 可以很好的表达序列中各个单词之间的相互注意力关系 这个模型在NLP领
  • html5 canvas+js实现ps钢笔抠图

    html5 canvas js实现ps钢笔抠图 原文 https www cnblogs com guozefeng p 3719915 html 1 项目要求需要用js实现photoshop中钢笔抠图功能 就用了近三四天的时间去解决它 最
  • react antd4.0 渲染树节点

  • 你应该知道如何跨域

    前言 转眼就是秋招季啦 经历了几场笔试面试 屡次被问到关于如何实现跨域 老实说 之前都是纸上谈兵 也没有项目需要跨域 甚至觉得这个东西没什么意义 直到今天项目中遇到了跨域问题 看了不少资料才理解跨域的普遍性和意义 特写此篇文章整理自己所得
  • [Error] 'else' without a previous 'if'

    使用if语句这样写 DevC 会报错 if语句后面如果有两条语句或者更多 要加上大括号 使之成为语句块 这样改之后 就可以正常编译运行
  • .NET发送请求(get/post/http/https),携带json数据,接收json数据

    C 发送https请求有一点要注意 ServicePointManager ServerCertificateValidationCallback new RemoteCertificateValidationCallback CheckV
  • C++面向对象特性之继承

    一 继承的概念 继承是一种机制 目的是实现代码复用的同时减少重复代码量 它允许程序员在保持原有类特性的基础上进行功能的拓展 这样产生的新类叫做派生类 被继承的类叫做基类 下面可以看一个实例 class Animal int age clas
  • 遇见未来

    互联网及其延伸 正在导向我们走向一个新的时代 软件技术在新一轮革命技术中毫无疑问是核心竞争力之一 C 语言发明人Biarne Stroustrup说 人类文明运行在软件之上 也突出了软件技术的重要地位 什么是软件定义 软件定义在企业的数据中
  • 利用ESP定律的upx脱壳实践

    背景 除了命令行upx d脱壳 还有手动脱壳 ESP定律的本质是堆栈平衡 又称堆栈平衡定律 是应用频率最高的脱壳方法之一 脱壳的目的就是找到真正的OEP 源文件的EP代码 方法 从pushad到popad是一段解压缩代码 解压UPX壳 这段
  • C++数组越界访问测试

    对int nums 10 进行数组越界测试 文件test cpp 第一次测试 include
  • MySQL实战45讲

    目录 前言 一 连接器 查询缓存 分析器 词法分析 语法分析 优化器 执行器 二 redo log bin log 三 读未提交 read uncommitted 读提交 read committed 可重复读 repeatable rea
  • linux 报错:telnet Connection closed by foreign host

    0 美图 1 背景 链接kudu 报错 telnet samba xx com 7051 Trying 172 xx1 xx 33 Connected to samba example com Escape character is Con
  • java 本地图片压缩 转base64并限制文件大小

    本地图片转base64并限制文件大小 param imagePath 图片全路径 param sizeLimit 大小 整数 限制的大小 KB 1024 return 返回值为0 imageurl为空 返回值为1 imageurl路径不可访