- 浏览: 197295 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
xyyx_nk:
在demo中没有下载的示例,能详细说一下怎么监听下载过程吗?比 ...
DhNet 网络http工具(带缓存功能哦) -dhroid文档 -
zhaoguowei998:
dhroid ioc模块对 加密混淆问题 -
zhaoguowei998:
你太牛了,佩服佩服,以后要多想你请教了
dhroid ioc模块对 加密混淆问题 -
白色蜻蜓:
转载下您的文章,已注明出处。
IOS开发之百度地图API应用 -
wenjiefeng:
你好,在andrioidpn-client客户端源码里,Not ...
Android 推送之原理与初触Androidpn(Android Push Notification)
常用的Android版缩放图片代码: ContentResolver cr = this.getContentResolver();
try { InputStream in = cr.openInputStream(uri); Bitmap bitmap = BitmapFactory.decodeStream(in); try { in.close(); } catch (IOException e) { e.printStackTrace(); } if(null == bitmap) { Toast.makeText(this, "Head is not set successful,Decode bitmap failure", 2000); } //原始图片的尺寸 int bmpWidth = bitmap.getWidth(); int bmpHeight = bitmap.getHeight(); //缩放图片的尺寸 float scaleWidth = (float) 40 / bmpWidth; float scaleHeight = (float) 40 / bmpHeight; Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); //产生缩放后的Bitmap对象 Bitmap resizeBitmap = Bitmap.createBitmap( bitmap, 0, 0, bmpWidth, bmpHeight, matrix, false); bitmap.recycle(); //Bitmap to byte[] byte[] photoData = Bitmap2Bytes(resizeBitmap); //save file String fileName = "/sdcard/test.jpg"; FileUtil.writeToFile(fileName, photoData); //save photo check sum to db DataCenter.GetInstance().ModifyIMMUser(); //refresh ImageView } catch (FileNotFoundException exp) { exp.printStackTrace(); }
如果图片非常大,在执行BitmapFactory.decodeStream的时候就会抛出OOM异常。
我们来看看系统应用MMS是如何处理的,SMS添加了多媒体附件后就作MMS处理了,当附加文件原图超过300K,也会做个缩放处理,具体参考:com.android.mms.ui/.UriImage:
package com.android.mms.ui; public class UriImage { private int mWidth; private int mHeight; ... ... // private void decodeBoundsInfo() { InputStream input = null; try { input = mContext.getContentResolver().openInputStream(mUri); BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inJustDecodeBounds = true;//只描边,不读取数据 BitmapFactory.decodeStream(input, null, opt); mWidth = opt.outWidth; mHeight = opt.outHeight; } catch (FileNotFoundException e) { // Ignore Log.e(TAG, "IOException caught while opening stream", e); } finally { if (null != input) { try { input.close(); } catch (IOException e) { // Ignore Log.e(TAG, "IOException caught while closing stream", e); } } } } private byte[] getResizedImageData(int widthLimit, int heightLimit) { int outWidth = mWidth; int outHeight = mHeight; int s = 1; while ((outWidth / s > widthLimit) || (outHeight / s > heightLimit)) { s *= 2; } //先设置选项 BitmapFactory.Options options = new BitmapFactory.Options(); //returning a smaller image to save memory. options.inSampleSize = s; InputStream input = null; try { input = mContext.getContentResolver().openInputStream(mUri); Bitmap b = BitmapFactory.decodeStream(input, null, options);//注意看options的用法 if (b == null) { return null; } ByteArrayOutputStream os = new ByteArrayOutputStream(); b.compress(CompressFormat.JPEG, MessageUtils.IMAGE_COMPRESSION_QUALITY, os); return os.toByteArray(); } catch (FileNotFoundException e) { Log.e(TAG, e.getMessage(), e); return null; } finally { if (input != null) { try { input.close(); } catch (IOException e) { Log.e(TAG, e.getMessage(), e); } } } } ... ... }
可以看出,MMS应用的方法是:先设置缩放选项,再读取缩放的图片数据到内存,规避了内存引起的OOM。
修改后的代码:
ContentResolver cr = this.getContentResolver(); try { InputStream in = cr.openInputStream(uri); BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeStream(in, null, options); try { in.close(); } catch (IOException e) { e.printStackTrace(); } int mWidth = options.outWidth; int mHeight = options.outHeight; int sWidth = 40; int sHeight = 40; int s = 1; while ((mWidth / s > sWidth * 2) || (mHeight / s > sHeight * 2)) { s *= 2; } options = new BitmapFactory.Options(); options.inSampleSize = s; in = cr.openInputStream(uri); Bitmap bitmap = BitmapFactory.decodeStream(in, null, options); try { in.close(); } catch (IOException e) { e.printStackTrace(); } if(null == bitmap) { Toast.makeText(this, "Head is not set successful,Decode bitmap failure", 2000); return ; } //原始图片的尺寸 int bmpWidth = bitmap.getWidth(); int bmpHeight = bitmap.getHeight(); //缩放图片的尺寸 float scaleWidth = (float) sWidth / bmpWidth; float scaleHeight = (float) sHeight / bmpHeight; Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); //产生缩放后的Bitmap对象 Bitmap resizeBitmap = Bitmap.createBitmap( bitmap, 0, 0, bmpWidth, bmpHeight, matrix, false); bitmap.recycle(); Bitmap resizeBitmap = bitmap; //Bitmap to byte[] byte[] photoData = bitmap2Bytes(resizeBitmap); //save file String fileName = "/sdcard/test.jpg"; FileUtil.writeToFile(fileName, photoData);
private byte[] bitmap2Bytes(Bitmap bm) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); return baos.toByteArray(); }
发表评论
-
Dhdb 简化sqlite数据库操作--dhroid文档
2014-04-15 12:30 1301android数据库其实使用的不多,dhroid框架中的 ... -
dhroid ioc模块对 加密混淆问题
2014-04-14 12:52 916大家应该已经看过ioc ... -
NetJSONAdapter 网络化的adapter(高效) -dhroid文档
2014-04-04 12:15 839关于adapter 我想对于大家来说已经不陌生了,基本应用 ... -
DhNet 网络http工具(带缓存功能哦) -dhroid文档
2014-03-24 13:36 1395网络请求是大多数应用不可获取的一部分,曾经和一个其他公司的 ... -
eventbus 事件总线-dhroid文档
2014-03-23 11:47 1206你听过onClick 事件,onItemClick 事件, ... -
ioc基础(视图,资源,assert注入)-dhroid文档
2014-03-21 12:59 816上一节 Android 极速开发框架 dhroid来了 ... -
ioc高级(接口,对象注入)-dhroid文档
2014-03-21 13:04 1078前一章 ioc基础( ... -
IOC容器详解(想晋升的进来)---dhroid框架教教程(一)
2014-03-20 10:30 935控制反转(Inversion of Control,英文缩写 ... -
Android 极速开发框架 dhroid来了(提供demo)
2014-03-19 17:24 1324我们公司内部使用的商业级android开发框架dhr ... -
HttpClient的3种超时说明
2013-03-14 11:05 840/* 从连接池中取连接的超时时间 */ConnManag ... -
MeasureSpec介绍及使用详解
2013-01-24 21:21 723一个MeasureSpec封装了父 ... -
Android学习——TextView 设置中划线 下划线
2012-10-31 14:42 3423android:textAppearance ... -
ListView与其中的Button,EditText,RatingBar等widget的click事件
2012-10-26 14:48 803在<RelativeLayout>中 an ... -
在线词典API
2012-09-09 19:34 679QQ词典 http://dict.qq.com/dic ... -
关于android WebViewClient的方法解释
2012-09-09 17:12 7321、public boolean shouldOverride ... -
android Uri获取真实路径转换成File的方法
2012-08-23 12:40 3019data.getData()返回的 ... -
Java之WeakReference与SoftReference使用讲解
2012-08-22 09:46 639如果你想写一个 Java 程序,观察某对象什么时候会被垃圾收集 ... -
Android自定义捕获Application全局异常
2012-08-21 17:24 1137package qianlong.qlmobile ... -
获取手机设备方向
2012-08-03 09:33 1428@Override public void onS ... -
activity四种启动模式
2012-08-03 09:30 768Activity 有四种加载模式 [1] standa ...
相关推荐
如何为你的Android应用缩放图片,详细比较了android图片显示缩放前后用时,占用内存资源大小。防止加载大图是发生内存溢出
* 使用SubsamplingScaleImageView实现局部加载超大图片 巨大图片等. * 自带图片手势缩放和双击放大缩小等功能 * 有效解决 viewpager+fragment 内存溢出OOM
但是如果图片多了就会遇到内存溢出的情况,及时你对图片做了缩放处理但是图片张数多了还是一样的会内存溢出。所以这个时候就需要我们动态的释放和加载图片资源。附件中是小弟根据自己的想法实现的动态加载和释放图片...
android加载大图片oom是常遇到的问题,此资源加载前将图片进行缩放,按缩放比例加载缩放后的图片来解决oom问题。Gallery和ImageSwitcher配合展示图片
图片的下载缓存用的是imageloader框架,可加载大量图片,不会出现内存溢出。
对于超大的图片,如果不缩放的话,容易导致内存溢出。而经过处理后,无论多大的图片,都能够在手机屏幕上加载出来,不会导致内存溢出。当然,脸黑的除外 该应用涉及到的知识有: – 1.Bitmap的使用 – 2.Android...
缩放,旋转,裁剪等,AndroidJniBitmapOperations也是Android原生图片处理类库,通过JNI在bitmaps上执行各种简单的操作,同时还提供在Android使用本地java环境防止出现OOM(内存溢出)的策略。 下面是一些操作: 1、...
zz-doctor中医大夫助理...防止内存溢出浅析.rar 飞行历 飞行模式 AirPlus.rar 飞行射击类游戏源码.rar 高仿 WIN8系统 磁贴点击下沉倾斜效果源码.zip 高仿基于android2.2(Froyo)的Contacts.zip 高仿多米音乐播放器.rar
//将图片设为原来宽高的1/2,防止内存溢出 Bitmap bm = BitmapFactory.decodeFile("",option);//文件流 URL url = new URL(""); InputStream is = url.openStream(); Bitmap bm = BitmapFactory.decodeStream(is); ...
目录 第一篇 Android开发初步 ...16.5 Bitmap内存溢出 16.5.1 图片预先缩放 16.5.2 普通的图片缩放方法 16.5.3 Dalvik虚拟机的堆内存分配 16.5.4 Bitmap对象及时释放 16.6 多分辨率适应 16.7 本章小结
|--图片的缩放处理(防内存溢出) |--多媒体应用设计图 |--多线程下载 |--多线程下载及断点续传 |--多线程之AsyncTask的用法 |--多线程之线程池ExecutorService |--字体为粗体 |--安卓下的多线程断点上传 |--对话框与...
下面提出一些优化: 1、采用线程池 2、内存缓存+文件缓存 3、内存缓存中网上很多是采用SoftReference来防止堆溢出,这儿严格限制只能使用最大JVM内存的1/4 4、对下载的图片进行按比例缩放,以减少内存的消耗 具体的...
3、会导致客户端内存溢出 。。。 因为这些问题,我不得不放弃这种方法。要解决上面的问题只能使用矢量图进行开发了,于是我使用了HTML5进行了矢量图的开发,不仅解决了地图缩放失真等问题,还同时适用于Android、...