上传带宽是极其有限的,那么怎么才能做到加快速度上传呢。
其实就是压缩大图容量大小的过程,而在这个过程中尽量不降低图片的清晰度,把图片压缩到较小的容量,就是下面要简单讲的两点内容。
现在手机的分辨率比较高,有点容量动不动就大道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文件保存图片,这里不再赘述。可以说是目前的终极保存图片的解决方法,也顺带解析了为何Android与iOS保存图片机制的差异性。
博文地址在此:http://blog.csdn.NET/copy_yuan/article/details/51353629。