关于安卓(Android)图片上传大图的两点建议。

上传带宽是极其有限的,那么怎么才能做到加快速度上传呢。

其实就是压缩大图容量大小的过程,而在这个过程中尽量不降低图片的清晰度,把图片压缩到较小的容量,就是下面要简单讲的两点内容。

现在手机的分辨率比较高,有点容量动不动就大道6M左右,而上传图片的并没有这种需求,所以第一步就是降低分辨率,这个可以根据工作的实质要求来定。

降低分辨率,首先要识别图片长宽的比例,计算其缩放比例。


//计算缩放比
public static int getRatioSize(int bitWidth, int bitHeight) {
    // 图片最大分辨率
    int imageHeight = 1280;
    int imageWidth = 960;
    // 缩放比
    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;
}

    现在做一个画板,把缩放的图片放进去。


//把图片分辨率降为1280*960宽高,做一个画板。RGB565模式降低内存占有率。
Bitmap result = Bitmap.createBitmap(image.getWidth() / ratio, image.getHeight() / ratio, Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(result);
Rect rect = new Rect(0, 0, image.getWidth() / ratio, image.getHeight() / ratio);
canvas.drawBitmap(image, null, rect, null);


放进去以后呢,就对图片进行压缩了,每次都降低10%的质量,来循环压缩,直到它小于100k或者你设定的任意值。


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

下面就到了保存压缩好的图片的环节了,这里有两种保存方式,一种是正常保存方式,另外一种是无损保存图片的方式,这里由于copy_yuan大大已经是提供非常详细的调用jni文件保存图片,这里不再赘述。可以说是目前的终极保存图片的解决方法,也顺带解析了为何AndroidiOS保存图片机制的差异性。

博文地址在此:http://blog.csdn.NET/copy_yuan/article/details/51353629。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值