`

ImageCompressUtils

阅读更多
package com.movitech.johnson.util;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

public class ImageCompressUtils {
    public static final int FILE_SIZE = 3 * 1024; // kb
    public static final int FILE_SIZE_BYTE = 3 * 1024 * 1024;

    public static String getThumbUploadPath(String oldPath, int bitmapMaxWidth) throws Exception {
        if (getFileSize(oldPath) < FILE_SIZE_BYTE) {
            return oldPath;
        }
        String newPath = oldPath.substring(0, oldPath.lastIndexOf(".")) + "_resize"
                         + oldPath.substring(oldPath.lastIndexOf("."), oldPath.length());
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(oldPath, options);
        int height = options.outHeight;
        int width = options.outWidth;
        int reqHeight = 0;
        int reqWidth = bitmapMaxWidth;
        reqHeight = (reqWidth * height) / width;
        // 在内存中创建bitmap对象,这个对象按照缩放大小创建
        options.inSampleSize = calculateInSampleSize(options, bitmapMaxWidth, reqHeight);
        options.inJustDecodeBounds = false;
        Bitmap bitmap = BitmapFactory.decodeFile(oldPath, options);
        Bitmap bbb = compressImage(Bitmap.createScaledBitmap(bitmap, bitmapMaxWidth, reqHeight, false));
        return saveImg(bbb, newPath);
    }

    public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
        // Raw height and width of image
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;
        if (height > reqHeight || width > reqWidth) {
            if (width > height) {
                inSampleSize = Math.round((float) height / (float) reqHeight);
            } else {
                inSampleSize = Math.round((float) width / (float) reqWidth);
            }
        }
        return inSampleSize;
    }

    public static Bitmap compressImage(Bitmap image) {

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        image.compress(Bitmap.CompressFormat.JPEG, 80, baos);// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
        int options = 100;
        while ((baos.toByteArray().length / 1024 > FILE_SIZE) && options > 10) { // 循环判断如果压缩后图片是否大于3
                                                                                 // *
                                                                                 // 1024
                                                                                 // kb,大于继续压缩
            options -= 10;// 每次都减少10
            baos.reset();// 重置baos即清空baos
            image.compress(Bitmap.CompressFormat.JPEG, options, baos);// 这里压缩options%,把压缩后的数据存放到baos中
        }
        ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());// 把压缩后的数据baos存放到ByteArrayInputStream中
        Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);// 把ByteArrayInputStream数据生成图片
        return bitmap;
    }

    public static String saveImg(Bitmap b, String newPath) throws Exception {
        File mediaFile = new File(newPath);
        mediaFile.createNewFile();
        FileOutputStream fos = new FileOutputStream(mediaFile);
        b.compress(Bitmap.CompressFormat.PNG, 100, fos);
        fos.flush();
        fos.close();
        b.recycle();
        b = null;
        System.gc();
        return mediaFile.getPath();
    }

    public static int getFileSize(String path) {
        int fileSize = 0;
        FileInputStream fis;
        try {
            fis = new FileInputStream(path);
            fileSize = fis.available();
            return fileSize;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return fileSize;
        } catch (IOException e) {
            e.printStackTrace();
            return fileSize;
        }
    }

}

 

分享到:
评论

相关推荐

    压缩照片工具类.zip

    在IT行业中,图片压缩是一个常见的需求,特别是在存储和传输大量图像数据时。这个"压缩照片工具类.zip...通过`ImageCompressUtils`进行压缩,`CompressResult`记录和返回压缩结果,而`FileTest`确保所有功能的正确性。

    Java毕业设计-springboot-vue-新闻推荐系统(源码+sql脚本+29页零基础部署图文详解+27页论文+环境工具+教程+视频+模板).zip

    资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:29页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:配套毕业论文,万字长文,word文档,支持二次编辑。 4:范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于 B/S 网络结构,在 IDEA 中开发。服务端用 Java 并借 Spring Boot 框架搭建后台。前台采用支持 HTML5 的 VUE 框架。用 MySQL 存储数据,可靠性强。 能学到什么: 使用Spring Boot搭建后台。VUE 框架构建前端交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。

    Java毕业设计-springboot-vue-公司日常考勤系统(源码+sql脚本+29页零基础部署图文详解+31页论文+环境工具+教程+视频+模板).zip

    资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:29页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:配套毕业论文,万字长文,word文档,支持二次编辑。 4:范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于B/S网络结构,在IDEA中开发。服务端用Java并借Spring Boot框架搭建后台。前台采用支持HTML5的VUE框架。用MySQL存储数据,可靠性强。 能学到什么: 使用Spring Boot搭建后台。VUE框架构建前端交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。

    **Qt CPP多列时间轴控件:事件线发展故事大纲的可视化编辑器**,Qt CPP实现的多列时间轴控件、可与多段字符串格式自由转、也可手动添加列表项、专门用来以时间轴作为事件线发展顺序的故事大纲 时

    **Qt CPP多列时间轴控件:事件线发展故事大纲的可视化编辑器**,Qt CPP实现的多列时间轴控件、可与多段字符串格式自由转、也可手动添加列表项、专门用来以时间轴作为事件线发展顺序的故事大纲。 时间可输入任意内容,不限于时间,每一时间段允许多列,即多个文字节点,行与行、列与列 之间任意拖拽更顺序,可与文字自由转,按需修改快捷键,所有的编辑可撤销,美观的调整动画。 源码: 使用Qt5.13.1_MinGW编译通过。 ,Qt CPP时间轴控件; 多列时间节点; 自由转换字符串格式; 手动添加列表项; 时间轴事件线; 拖拽更换顺序; 快捷键自定义; 编辑可撤销; 动画调整。,基于Qt C++的多功能多列时间轴故事线管理控件

    Java毕业设计-springboot-vue-大学生入学审核系统(源码+sql脚本+29页零基础部署图文详解+25页论文+12页答辩+环境工具+教程+视频+模板).zip

    资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:29页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:配套毕业论文,万字长文,word文档,支持二次编辑。 4:配套答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于 B/S 网络结构,在 IDEA 中开发。服务端用 Java 并借 Spring Boot 框架搭建后台。前台采用支持 HTML5 的 VUE 框架。用 MySQL 存储数据,可靠性强。 能学到什么: 使用Spring Boot搭建后台。VUE 框架构建前端交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。

    多智能体系统一致性研究(Matlab代码实现)

    多智能体系统一致性研究(Matlab代码实现) This chapter overviews consensus algorithms in cooperative control. The mo￾tivation for information consensus in cooperative control is given. A litera￾ture review on consensus algorithms is provided. Theoretical results regard￾ing consensus-seeking under both time-invariant and dynamically changing communication topologies are summarized. A few specific applications of con￾sensus algorithms to multivehicle cooperative control are described. The or￾ganization of the monog

    MATLAB仿真分步傅里叶法生成光纤激光器锁模脉冲与湍流随机相位屏的研究,MATLAB分步傅里叶法仿真光纤激光器锁模脉冲产生 MATLAB仿真湍流随机相位屏 生成海洋湍流,大气湍流随机相位屏 可用于仿

    MATLAB仿真分步傅里叶法生成光纤激光器锁模脉冲与湍流随机相位屏的研究,MATLAB分步傅里叶法仿真光纤激光器锁模脉冲产生 MATLAB仿真湍流随机相位屏 生成海洋湍流,大气湍流随机相位屏 可用于仿真激光(涡旋光,高斯光)等在湍流介质中的传输。 ,MATLAB; 傅里叶法仿真; 光纤激光器锁模脉冲; 湍流随机相位屏; 海洋湍流仿真; 大气湍流仿真; 激光传输。,MATLAB仿真湍流介质中激光传输及光纤锁模脉冲产生研究

    基于机器学习智能文本摘要 深度学习 注意力机制源码 自然语言处理 源代码与数据集

    ### 背景介绍 该数据集由来自亚马逊的精品食品评论组成,涵盖了超过10年的数据,包含截至2012年10月的所有约500,000条评论。这些评论不仅包含了产品和用户信息、评分,还有纯文本形式的评论内容。值得注意的是,此数据集还收录了亚马逊所有其他类别的商品评论。 ### 内容 - **Reviews.csv**:从名为`Reviews`的SQLite表中提取。 - **database.sqlite**:包含一个名为`Reviews`的表,即上述CSV文件的数据源。 ### 数据详情 - 时间范围:1999年10月至2012年10月 - 总评论数:568,454条 - 用户总数:256,059位 - 涉及产品数:74,258种 - 审评次数超过50次的用户数:260位

    Java毕业设计-springboot-vue-医院管理系统(源码+sql脚本+29页零基础部署图文详解+29页论文+环境工具+教程+视频+模板).zip

    资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:29页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:配套毕业论文,万字长文,word文档,支持二次编辑。 4:范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于 B/S 网络结构,在 IDEA 中开发。服务端用 Java 并借 Spring Boot 框架搭建后台。前台采用支持 HTML5 的 VUE 框架。用 MySQL 存储数据,可靠性强。 能学到什么: 使用Spring Boot搭建后台。VUE 框架构建前端交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。

    《已调试》springboot 网站建设服务系统(源码+sql).zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。

    基于VSG控制的MMC变流器功率平衡与电网适应性优化研究,基于VSG控制(同步发电机控制)的模块化多电平变流器MMC 通过设置可编程电源,模拟电网频率和电压改变, 观测MMC输出功率的变化情况 初步设

    基于VSG控制的MMC变流器功率平衡与电网适应性优化研究,基于VSG控制(同步发电机控制)的模块化多电平变流器MMC 通过设置可编程电源,模拟电网频率和电压改变, 观测MMC输出功率的变化情况 初步设定值电网线电压U=10kV;Pref=10e6;Qref=2e6; 1、VSG外环控制(同步发电机控制) a.有功-频率控制 b.无功-电压控制 2、电流内环控制 3、环流抑制控制 4、电容电压均衡控制 (1)当电网中负荷突然发生变化时,系统频率会因功率不平衡发生偏移,而下垂控制可以自动调节MMC流站的有功输出,给与电网一定的有功功率支撑。 (2)VSG的无功-电压控制在保证无功功率跟踪的同时,还能参与MMC流站受端电网的电压调节,根据电压的偏差为受端电网提供必要的无功支撑。 ,基于VSG控制的MMC; 模块化多电平变流器(MMC); 可编程电源; 电网频率与电压变化; 输出功率变化; 虚拟同步发电机控制(VSG外环控制); 有功-频率控制; 无功-电压控制; 电流内环控制; 环流抑制控制; 电容电压均衡控制; 功率不平衡; 下垂控制; 无功功率跟踪; 电压调节。,基于

    2025年公共基础知识题库及参考答案(完整版).pptx

    2025年公共基础知识题库及参考答案(完整版).pptx

    Java毕业设计-springboot-vue-学生宿舍管理系统(源码+sql脚本+29页零基础部署图文详解+42页论文+环境工具+教程+视频+模板).zip

    资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:29页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:配套毕业论文,万字长文,word文档,支持二次编辑。 4:范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于 B/S 网络结构,在 IDEA 中开发。服务端用 Java 并借 Spring Boot 框架搭建后台。前台采用支持 HTML5 的 VUE 框架。用 MySQL 存储数据,可靠性强。 能学到什么: 使用Spring Boot搭建后台。VUE 框架构建前端交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。

    2025年护理三基考试题库及答案(通用版).docx

    2025年护理三基考试题库及答案(通用版).docx

    mmexport1736921254924.jpg

    mmexport1736921254924.jpg

    Java毕业设计-springboot-vue-华强北商城二手手机管理系统(源码+sql脚本+29页零基础部署图文详解+48页论文+环境工具+教程+视频+模板).zip

    资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:29页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:配套毕业论文,万字长文,word文档,支持二次编辑。 4:范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于B/S网络结构,在IDEA中开发。服务端用Java并借Spring Boot框架搭建后台。前台采用支持HTML5的VUE框架。用MySQL存储数据,可靠性强。 能学到什么: 使用Spring Boot搭建后台。VUE框架构建前端交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。

    甲烷气氛下褐煤热解动力学研究.pdf

    甲烷气氛下褐煤热解动力学研究.pdf

    Python Web Flask开发基础

    flask

    SVID_20250118_213725_1.mp4

    SVID_20250118_213725_1.mp4

    MTF 计算小工具软件 Windows 下使用

    MTF SFR 计算小工具软件 ,Windows 下使用

Global site tag (gtag.js) - Google Analytics