图片压缩最优方案

图片压缩最优方案

大家好,又见面了,我是全栈君。

Github地址: https://github.com/jeanboydev/Android-BitherCompress

原文地址:http://blog.csdn.net/copy_yuan/article/details/51353629

拓展:鲁班压缩 Github地址:https://github.com/Curzibn/Luban

源码(增加回调)

import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.Canvas; import android.graphics.Rect; import java.io.ByteArrayOutputStream; public class NativeUtil { private static int DEFAULT_QUALITY = 95; /** * @param bit bitmap对象 * @param fileName 指定保存目录名 * @param optimize 是否采用哈弗曼表数据计算 品质相差5-10倍 * @Description: JNI基本压缩 */ public static void compressBitmap(Bitmap bit, String fileName, boolean optimize) { saveBitmap(bit, DEFAULT_QUALITY, fileName, optimize); } public interface CompressBitmapListener { void onComplete(String fileUri); } /** * @param image bitmap对象 * @Description: 通过JNI图片压缩把Bitmap保存到指定目录 */ public static void compressBitmap(Bitmap image, String filePath, CompressBitmapListener listener) { // 最大图片大小 1000KB int maxSize = 1000; // 获取尺寸压缩倍数 int ratio = NativeUtil.getRatioSize(image.getWidth(), image.getHeight()); // 压缩Bitmap到对应尺寸 Bitmap result = Bitmap.createBitmap(image.getWidth() / ratio, image.getHeight() / ratio, Config.ARGB_8888); Canvas canvas = new Canvas(result); Rect rect = new Rect(0, 0, image.getWidth() / ratio, image.getHeight() / ratio); canvas.drawBitmap(image, null, rect, null); ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中 int options = 100; result.compress(Bitmap.CompressFormat.JPEG, options, baos); // 循环判断如果压缩后图片是否大于最大值,大于继续压缩 while (baos.toByteArray().length / 1024 > maxSize) { // 重置baos即清空baos  baos.reset(); // 每次都减少10 options -= 10; // 这里压缩options%,把压缩后的数据存放到baos中  result.compress(Bitmap.CompressFormat.JPEG, options, baos); } // JNI调用保存图片到SD卡 这个关键 NativeUtil.saveBitmap(result, options, filePath, true); // 释放Bitmap if (result != null && !result.isRecycled()) { result.recycle(); result = null; } listener.onComplete(filePath); } /** * 计算缩放比 * * @param bitWidth 当前图片宽度 * @param bitHeight 当前图片高度 * @return * @Description:函数描述 */ public static int getRatioSize(int bitWidth, int bitHeight) { // 图片最大分辨率 int imageHeight = 1920; int imageWidth = 1080; // 缩放比 int ratio = 1; // 缩放比,由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可 if (bitWidth > bitHeight && bitWidth > imageWidth) { // 如果图片宽度比高度大,以宽度为基准 ratio = bitWidth / imageWidth; } else if (bitWidth < bitHeight && bitHeight > imageHeight) { // 如果图片高度比宽度大,以高度为基准 ratio = bitHeight / imageHeight; } // 最小比率为1 if (ratio <= 0) ratio = 1; return ratio; } /** * 调用native方法 * * @param bit * @param quality * @param fileName * @param optimize * @Description:函数描述 */ private static void saveBitmap(Bitmap bit, int quality, String fileName, boolean optimize) { compressBitmap(bit, bit.getWidth(), bit.getHeight(), quality, fileName.getBytes(), optimize); } /** * 调用底层 bitherlibjni.c中的方法 * * @param bit * @param w * @param h * @param quality * @param fileNameBytes * @param optimize * @return * @Description:函数描述 */ private static native String compressBitmap(Bitmap bit, int w, int h, int quality, byte[] fileNameBytes, boolean optimize); /** * 加载lib下两个so文件 */ static { System.loadLibrary("jpegbither"); System.loadLibrary("bitherjni"); } }

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/108622.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 列车调度(PTA)

    列车调度(PTA)7-11列车调度(25分)火车站的列车调度铁轨的结构如下图所示。两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道。每趟列车从入口可以选择任意一条

  • 网页406错误(网页错误代码1607)

    原因出现网页出现406问一般为一下两种情况 *1、缺失jar包, * *2、如果访问的url的后缀名是以.html结尾的,则服务端不能响应json数据。因为springMVC会误以为.html后缀名的请求,是请求访问某个html文件,则springMVC则无法处理响应json数据 解决方法 *解决方法: * 1、检查所依赖的jar包是否完整 *2、在we…

  • linux命令_linux基本命令的使用

    linux命令_linux基本命令的使用创建petalinux工程:petalinux-create-tproject–templatezynq-nzynq_linux配置petalinux工程:petalinux-config–get-hw-description/mnt/hgfs/VMShare/ZYNQ7035_Linux/ZYNQ7035_Linux.sdk/重新配置petalinux工程:petalinux-config配置Linux内核:petalinux-config-ckernel配置Lin

  • phpstorm2021最新激活码[在线序列号]

    phpstorm2021最新激活码[在线序列号],https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • windows文件读取 xxe_XXE漏洞「建议收藏」

    windows文件读取 xxe_XXE漏洞「建议收藏」0x00什么是XML1.定义XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。2.文档结构XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。]]]>DaveTom3.DTDXML文档结构包括XML声明、DTD文档类型定义(可选)…

  • Vue2+VueRouter2+webpack 构建项目实战(一)准备工作

    Vue2+VueRouter2+webpack 构建项目实战(一)准备工作Vue2+VueRouter2+webpack构建项目实战(一)准备工作之前写的博客没有采用打包工具,而是直接引用js的方式来做的。这种方式很扯淡,也因此,我写了三篇博客之后就没有再写了。通过几个月的学习和实战,基本厘清了Vue1+VueRouter1+browserify的一些技术点。并且通过几个实际项目的工作,已经验证了自己利用该技术完成项目是没有问题的了。但是,现在主流的打包方式已经

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号