Android 图片压缩(建议采用下面的方式而不是compress)
2015-09-17 14:07
549 查看
在调用系统摄像机中我们使用过图片压缩的方式,由于手机自身的原因可能不支持过大图片的显示,需要对图片进行压缩,方法比较重要因此这里将代码提取出来作为重点。
不建议使用bitmap的compress方法是因为compress方法会对像素点进行压缩,比如 001的就压缩为000了,多次调用容易使得图片最终变得十分模糊。
不建议使用bitmap的compress方法是因为compress方法会对像素点进行压缩,比如 001的就压缩为000了,多次调用容易使得图片最终变得十分模糊。
[code] //下面的方法是google发布的图片压缩的方法 //有的手机对显示的图片不进行限制,有的手机可能会有限制, //这时需要对图片进行压缩 private void zipImage(String savePath) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(savePath, options); options.inSampleSize = computeInitialSampleSize(options, 480, 480 * 960); options.inJustDecodeBounds = false; Bitmap bitmap = BitmapFactory.decodeFile(savePath, options); try { FileOutputStream fos = new FileOutputStream(savePath); bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos); fos.flush(); fos.close(); } catch (IOException e) { e.printStackTrace(); } bitmap.recycle(); bitmap = null; System.gc(); } public int computeSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) { int initialSize = computeInitialSampleSize(options, minSideLength, maxNumOfPixels); int roundedSize; if (initialSize <= 8) { roundedSize = 1; while (roundedSize < initialSize) { roundedSize <<= 1; } } else { roundedSize = (initialSize + 7) / 8 * 8; } return roundedSize; } private int computeInitialSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) { double w = options.outWidth; double h = options.outHeight; int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math .sqrt(w * h / maxNumOfPixels)); int upperBound = (minSideLength == -1) ? 128 : (int) Math.min( Math.floor(w / minSideLength), Math.floor(h / minSideLength)); if (upperBound < lowerBound) { // return the larger one when there is no overlapping zone. return lowerBound; } if ((maxNumOfPixels == -1) && (minSideLength == -1)) { return 1; } else if (minSideLength == -1) { return lowerBound; } else { return upperBound; }
相关文章推荐
- 调研Android Studio开发环境的发展演变(附安装教程,多图)
- Android中wp promote为sp流程
- Android多线程任务优化1:探讨AsyncTask的缺陷
- 关于安卓开发选择android 4.2.2(API 17)应用无法打开的解决办法
- 【Android】Log优雅的注释(github开源项目)
- Android 动态创建Drawable selector
- ListView+checkBox删除需求实现以及注意事项
- Android 音效 SoundPool
- 【Android】别话 AsyncTask
- Android 混淆备忘
- android5.0以上版本的状态栏透明
- android NDK 笔记
- 【Android】时区、时制、电量、内存信息
- 【Android】轮询的若干问题 Timer, TimerTask;Timer 的缺陷,ScheduledThreadPoolExecutor
- android开发笔记,杂
- 【Android】DownloadManager的使用
- Android本地数据库升级
- Android Activity和Fragment传递数据
- 【Android】FileInputStream
- android数据的四种存储方式