DuKBitmapImages 图片压缩处理技术

Android图片压缩上传系列

*压缩中的问题:

--图片压缩上如果存在问题,势必造成消耗大量的流量,下载图片的速度慢等影响产品性能,那么如何解决?请看下面:

  1. 压缩图片一共多少张?一起压缩?分开压缩?尺寸?
  2. 压缩后的图片保存的路径?
  3. 对于多图压缩性能处理的问题?并发or线性处理?
  4. 能不能使用service来进行压缩处理,是local(本地)还是remote(远程)的方式来启动service?
  5. 如果需要压缩的图片非常多,如何使用线程池来处理?

 

 其实做过图片压缩的朋友应该知道,这一块的技术点就那么几个,按照逻辑处理起来也是不一样的效果,主要是关注处理出来的图片的尺寸和质量。

* 等比压缩

这里首先按照原始图片的宽高比,等比计算出sampleSize。代码网上也有相关,这里贴出方法的代码:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(srcImagePath, options);
//根据原始图片的宽高比和期望的输出图片的宽高比计算最终输出的图片的宽和高
float srcWidth = options.outWidth;
float srcHeight = options.outHeight;
float maxWidth = outWidth;//期望输出的图片宽度
float maxHeight = outHeight;//期望输出的图片高度
float srcRatio = srcWidth / srcHeight;
float outRatio = maxWidth / maxHeight;
float actualOutWidth = srcWidth;//最终输出的图片宽度
float actualOutHeight = srcHeight;//最终输出的图片高度

if (srcWidth > maxWidth || srcHeight > maxHeight) {
    if (srcRatio < outRatio) {
        actualOutHeight = maxHeight;
        actualOutWidth = actualOutHeight * srcRatio;
    } else if (srcRatio > outRatio) {
        actualOutWidth = maxWidth;
        actualOutHeight = actualOutWidth / srcRatio;
    } else {
        actualOutWidth = maxWidth;
        actualOutHeight = maxHeight;
    }
}
//计算sampleSize
options.inSampleSize = computSampleSize(options, actualOutWidth, actualOutHeight);

 

 *图片质量压缩

ANDORID API:

public boolean compress(CompressFormat format, int quality, OutputStream stream)

方法如下:

//进行有损压缩
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int options_ = 100;
actualOutBitmap.compress(Bitmap.CompressFormat.JPEG, options_, baos);//质量压缩方法,把压缩后的数据存放到baos中 (100表示不压缩,0表示压缩到最小)

int baosLength = baos.toByteArray().length;
while (baosLength / 1024 > maxFileSize) {//循环判断如果压缩后图片是否大于maxMemmorrySize,大于继续压缩
    baos.reset();//重置baos即让下一次的写入覆盖之前的内容
    options_ = Math.max(0, options_ - 10);//图片质量每次减少10
    actualOutBitmap.compress(Bitmap.CompressFormat.JPEG, options_, baos);//将压缩后的图片保存到baos中
    baosLength = baos.toByteArray().length;
    if (options_ == 0)//如果图片的质量已降到最低则,不再进行压缩
        break;
}

那么有个耗时问题,这里的开个线程去处理这件事。

为了达到最佳的压缩结果,可以将上面两种方案同时进行。如果压缩消耗的时间很长,需要将压缩过程放入后台线程中执行。

这里实现的功能有:

  1. 打开摄像头进行拍照处理(旋转、截取)
  2. 处理后的图片保存到指定位置
  3. 压缩后的照片保存到指定目录下
  4. 使用AsyncTask执行压缩操作,处理耗时问题
  5. 显示压缩后的照片及其相关信息到前台activity

另外,如何结合使用service和多线程会在下篇文章具体说明。

开源github地址如下:
DuKBitmapImages

欢迎大家访问并star,如果有任何问题可以在评论中加以提问,谢谢~~

 

时间: 2024-09-15 08:00:52

DuKBitmapImages 图片压缩处理技术的相关文章

Android WebP 图片压缩与传输_Android

1. 简介 直到4g时代,流量依然是宝贵的东西.而移动网络传输中,最占流量的一种载体:图片,成为了我们移动开发者不得不关注的一个问题. 我们关注的问题,无非是图片体积和质量如何达到一个比较和谐的平衡,希望得到质量不错的图片同时体积还不能太大. 走在时代前列的谷歌给出了一个不错的答案--WebP. WebP是一种图片文件格式,在相同的压缩指标下,webp的有损压缩能比jpg小 25-34%.而在我自己的测试里,有时候能小50%. 2. 大企业背书 WebP在2010年发布第一个版本,到现在已经6年

Android图片压缩上传之基础篇_Android

在android程序开发中我们经常见到需要上传图片的场景,在这里有个技术点,需要把图片压缩处理,然后再进行上传.这样可以减少流量的消耗,提高图片的上传速度等问题. 关于android如何压缩,网上的资料也是很多,但大多数都是代码片段,讲解压缩步骤,而没有一个实用的工具类库.那么如何将压缩算法封装成一个实用工具库呢?其中会遇到些什么问题,比如: 1.需要压缩的图片有多少 2.压缩后的图片是覆盖还是保存到另外的目录 3.如果是另存目录需要将原始图片删除吗 4.如果改变压缩后的图片的尺寸大小是按照原图

Android图片压缩以及优化实例

前言 图片压缩在Android技术中已经属于烂大街,上周看了2个开源库然后对自己项目的压缩做了对比,发现一些新东西,记录与此. 为何要压缩 1.体积的原因 如果你的图片是要准备上传的,那动辄几M的大小肯定不行的,况且图片分辨率大于设备分辨率的话毫无意义. 2.内存原因 如果图片要显示下Android设备上,ImageView最终是要加载Bitmap对象的,就要考虑单个Bitmap对象的内存占用了,如何计算一张图片的加载到内存的占用呢?其实就是所有像素的内存占用总和: bitmap内存大小 = 图

Android WebP 图片压缩与传输

1. 简介 直到4g时代,流量依然是宝贵的东西.而移动网络传输中,最占流量的一种载体:图片,成为了我们移动开发者不得不关注的一个问题. 我们关注的问题,无非是图片体积和质量如何达到一个比较和谐的平衡,希望得到质量不错的图片同时体积还不能太大. 走在时代前列的谷歌给出了一个不错的答案--WebP. WebP是一种图片文件格式,在相同的压缩指标下,webp的有损压缩能比jpg小 25-34%.而在我自己的测试里,有时候能小50%. 2. 大企业背书 WebP在2010年发布第一个版本,到现在已经6年

Android图片压缩上传之基础篇

在android程序开发中我们经常见到需要上传图片的场景,在这里有个技术点,需要把图片压缩处理,然后再进行上传.这样可以减少流量的消耗,提高图片的上传速度等问题. 关于android如何压缩,网上的资料也是很多,但大多数都是代码片段,讲解压缩步骤,而没有一个实用的工具类库.那么如何将压缩算法封装成一个实用工具库呢?其中会遇到些什么问题,比如: 1.需要压缩的图片有多少 2.压缩后的图片是覆盖还是保存到另外的目录 3.如果是另存目录需要将原始图片删除吗 4.如果改变压缩后的图片的尺寸大小是按照原图

android 比较靠谱的图片压缩

  第一:我们先看下质量压缩方法: private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中 int options = 100; while ( baos.toByteA

现在要交一份有窗口的图片压缩程序求给个MFC范例学习 本人跨专业好多内容看不懂

问题描述 现在要交一份有窗口的图片压缩程序求给个MFC范例学习 本人跨专业好多内容看不懂 求大神给个模板参考学习一下,主要现在真的没什么思路,而且这个算法涵盖的东西比较多希望能有人给份模板让我好好研究一下还有2个星期就要交了 求帮忙 解决方案 建议你找一个懂的人手把手教你.否则很难想象你又要一个涉及算法.界面的复杂程序,你又看不懂,又没有多少时间你能学会. 程序:http://download.csdn.net/download/kanhai2008/928687 解决方案二: 这个有点困难,,

移动前端—图片压缩上传实践

 此前有同事跟我聊过关于移动端用canvas压缩图片后再上传的功能,最近有了点空闲时间,所以就实践了一下.demo效果链接在文章底部贴出. 在做移动端图片上传的时候,用户传的都是手机本地图片,而本地图片一般都相对比较大,拿iphone6来说,平时拍很多图片都是一两M的,如果直接这样上传,那图片就太大了,如果用户用的是移动流量,完全把图片上传显然不是一个好办法. 目前来说,HTML5的各种新API都在移动端的webkit上得到了较好的 实现.根据查看caniuse,本demo里使用到的FileRe

图片压缩后,依然很大的解决方案

昨天碰到一个很奇怪的事情,在最近的一个项目有这样的一个需求,把上传的图片进行压缩,避免因图片过大而影响浏览速度. 代码也很简单三两句就可以实现了,但发现压缩后的图片,虽然有变小,但还不是很明显. 代码如下: 01 public void CreateThumbnailImage() 02 { 03 Image img = Image.FromFile("e:/1.jpg"); 04 Image.GetThumbnailImageAbort cb = new Image.GetThumb