类库怎么使用setimagebitmap不显示image

下次自动登录
关注移动互联网和移动APP开发工具、开发框架、测试工具、微信开发、Android源码、Android开源类库以及各种开源组件的IT科技网站
现在的位置:
SoBitmap——处理Bitmap文件的Android类库
SoBitmap不是一个图片加载类库,它用于处理单一的Bitmap位图文件,可根据用户的配置对Bitmap位图文件进行解码、调整大小、质量和压缩率,指定输入和输出Bitmap文件的大小。
有时候,我们想在某些限制条件下显示图片,例如图片的内存消耗、最大尺寸限制以及格式要求,SoBitmap就可以解决上述的问题,你完全可以将SoBitmap当做一个黑盒子来使用,仅仅要做的事情是对SoBitmap进行配置。
1、支持本地文件,MediaStore和网络流
2、使用okhttp作为现在的httpclient客户端,
3、所有的调用都是在UI thread中发生。
4、支持两种设置方式:(1)是精确的限制,例如最大的压缩率,输入和输出Bitmap文件的大小。(2)模糊限制,只需设置一个等级或者使用默认的设置。
【上篇】【下篇】
您可能还会对这些文章感兴趣!
同分类最新文章Android 多种方式正确的加载图像,有效避免oom
【原文地址:http://blog.csdn.net/ys/article/details/】图像加载的方式:&&&&&&&&Android开发中消耗内存较多一般都是在图像上面,本文就主要介绍怎样正确的展现图像减少对内存的开销,有效的避免oom现象。首先我们知道我的获取图像的来源一般有三种源头:1.从网络加载2.从文件读取3.从资源文件加载&&&&&&&&针对这三种情况我们一般使用BitmapFactory的:decodeStream,decodeFile,decodeResource,这三个函数来获取到bitmap然后再调用ImageView的setImageBitmap函数进行展现。我们的内存去哪里了(为什么被消耗了这么多):&&&&&&&&其实我们的内存就是去bitmap里了,BitmapFactory的每个decode函数都会生成一个bitmap对象,用于存放解码后的图像,然后返回该引用。如果图像数据较大就会造成bitmap对象申请的内存较多,如果图像过多就会造成内存不够用自然就会出现out of memory的现象。
怎样才是正确的加载图像:&&&&&&&&我们知道我们的手机屏幕有着一定的分辨率(如:840*480),图像也有自己的像素(如高清图片:)。如果将一张840*480的图片加载铺满840*480的屏幕上这就是最合适的了,此时显示效果最好。如果将一张的图像放到840*480的屏幕并不会得到更好的显示效果(和840*480的图像显示效果是一致的),反而会浪费更多的内存。&&&&&&&&我们一般的做法是将一张网络获取的照片或拍摄的照片放到一个一定大小的控件上面进行展现。这里就以nexus 5x手机拍摄的照片为例说明,其摄像头的像素为1300万(拍摄图像的分辨率为),而屏幕的分辨率为。其摄像头的分辨率要比屏幕的分辨率大得多,如果不对图像进行处理就直接显示在屏幕上,就会浪费掉非常多的内存(如果内存不够用直接就oom了),而且并没有达到更好的显示效果。&&&&&&&&为了减少内存的开销,我们在加载图像时就应该参照控件(如:263pixel*263pixel)的宽高像素来获取合适大小的bitmap。下面就一边看代码一边讲解:public&static&Bitmap&getFitSampleBitmap(String&file_path,&int&width,&int&height)&{
&&&&BitmapFactory.Options&options&=&new&BitmapFactory.Options();
&&&&options.inJustDecodeBounds&=&
&&&&BitmapFactory.decodeFile(file_path,&options);
&&&&options.inSampleSize&=&getFitInSampleSize(width,&height,&options);
&&&&options.inJustDecodeBounds&=&
&&&&return&BitmapFactory.decodeFile(file_path,&options);
public&static&int&getFitInSampleSize(int&reqWidth,&int&reqHeight,&BitmapFactory.Options&options)&{
&&&&int&inSampleSize&=&1;
&&&&if&(options.outWidth&&&reqWidth&||&options.outHeight&&&reqHeight)&{
&&&&&&&&int&widthRatio&=&Math.round((float)&options.outWidth&/&(float)&reqWidth);
&&&&&&&&int&heightRatio&=&Math.round((float)&options.outHeight&/&(float)&reqHeight);
&&&&&&&&inSampleSize&=&Math.min(widthRatio,&heightRatio);
&&&&return&inSampleS
}&&&&&&&&BitmapFactory提供了BitmapFactory.Option,用于设置图像相关的参数,在调用decode的时候我们可以将其传入来对图像进行相关设置。这里我们主要介绍option里的两个成员:inJustDecodeBounds(Boolean类型) 和inSampleSize(int类型)。&&&&&&&&inJustDecodeBounds :如果设置为true则表示decode函数不会生成bitmap对象,仅是将图像相关的参数填充到option对象里,这样我们就可以在不生成bitmap而获取到图像的相关参数了。&&&&&&&&inSampleSize:表示对图像像素的缩放比例。假设值为2,表示decode后的图像的像素为原图像的1/2。在上面的代码里我们封装了个简单的getFitInSampleSize函数(将传入的option.outWidth和option.outHeight与控件的width和height对应相除再取其中较小的值)来获取一个适当的inSampleSize。&&&&&&&&在设置了option的inSampleSize后我们将inJustDecodeBounds设置为false再次调用decode函数时就能生成bitmap了。同理我们编写decodeResource的重载函数public&static&Bitmap&getFitSampleBitmap(Resources&resources,&int&resId,&int&width,&int&height)&{
&&&&BitmapFactory.Options&options&=&new&BitmapFactory.Options();
&&&&options.inJustDecodeBounds&=&
&&&&BitmapFactory.decodeResource(resources,&resId,&options);
&&&&options.inSampleSize&=&getFitInSampleSize(width,&height,&options);
&&&&options.inJustDecodeBounds&=&
&&&&return&BitmapFactory.decodeResource(resources,&resId,&options);
}这里需要注意的是如果我们decodeFile解析的文件是外部存储里的文件,我们需要在Manifists加上文件的读写权限,不然获取的bitmap会为null.&uses-permission&android:name=&android.permission.READ_EXTERNAL_STORAGE&/&
&uses-permission&android:name=&android.permission.WRITE_EXTERNAL_STORAGE&&/&然后是decodeStream的相关重载:&public&static&Bitmap&getFitSampleBitmap(InputStream&inputStream,&int&width,&int&height)&throws&Exception&{
&&&&&&&&BitmapFactory.Options&options&=&new&BitmapFactory.Options();
&&&&&&&&options.inJustDecodeBounds&=&
&&&&&&&&byte[]&bytes&=&readStream(inputStream);
&&&&&&&&//BitmapFactory.decodeStream(inputStream,&null,&options);
&&&&&&&&BitmapFactory.decodeByteArray(bytes,&0,&bytes.length,&options);
&&&&&&&&options.inSampleSize&=&getFitInSampleSize(width,&height,&options);
&&&&&&&&options.inJustDecodeBounds&=&
//&&&&&&&&return&BitmapFactory.decodeStream(inputStream,&null,&options);
&&&&&&&&return&BitmapFactory.decodeByteArray(bytes,&0,&bytes.length,&options);
&&&&&*&从inputStream中获取字节流&数组大小
&&&&public&static&byte[]&readStream(InputStream&inStream)&throws&Exception&{
&&&&&&&&ByteArrayOutputStream&outStream&=&new&ByteArrayOutputStream();
&&&&&&&&byte[]&buffer&=&new&byte[1024];
&&&&&&&&int&len&=&0;
&&&&&&&&while&((len&=&inStream.read(buffer))&!=&-1)&{
&&&&&&&&&&&&outStream.write(buffer,&0,&len);
&&&&&&&&outStream.close();
&&&&&&&&inStream.close();
&&&&&&&&return&outStream.toByteArray();
&&&&}&&&&&&&&我们发现在处理stream的时候我们并不是同之前一样通过调用两次decodeStream函数来进行设置的,而是将stream转化成byte[],然后在两次调用decodeByteArray。其原因是:如果我们两次调用按照两次调用decodeStream的方式,会发现我们得到到bitmap为null内存对比&&&&&&&&这样我们加载相关代码就完成了,最后我们通过一个demo来对比下正确加载图像和不处理的加载图像时的内存消耗吧,这里我们就写一个手机拍摄头像的程序吧。还是一样一边看代码一边讲解吧:&?xml&version=&1.0&&encoding=&utf-8&?&
&LinearLayout&xmlns:android=&/apk/res/android&
&&&&xmlns:app=&/apk/res-auto&
&&&&xmlns:tools=&/tools&
&&&&android:layout_width=&match_parent&
&&&&android:layout_height=&match_parent&
&&&&android:orientation=&vertical&
&&&&android:gravity=&center_horizontal&
&&&&tools:context=&.Activity.MainActivity&&
&&&&&android.support.v7.widget.Toolbar
&&&&&&&&android:id=&@+id/toolbar&
&&&&&&&&android:layout_width=&match_parent&
&&&&&&&&android:layout_height=&?attr/actionBarSize&
&&&&&&&&android:background=&?attr/colorPrimary&
&&&&&&&&app:popupTheme=&@style/AppTheme.PopupOverlay&&/&
&&&&&ImageView
&&&&&&&&android:layout_margin=&32dp&
&&&&&&&&android:id=&@+id/img_preview&
&&&&&&&&android:layout_width=&100dp&
&&&&&&&&android:layout_height=&100dp&
&&&&&&&&android:src=&@drawable/res_photo&
&&&&&&&&/&
&&&&&Button
&&&&&&&&android:id=&@+id/btn_take_photo&
&&&&&&&&android:layout_width=&wrap_content&
&&&&&&&&android:layout_height=&wrap_content&
&&&&&&&&android:text=&TAKE&PHOTO&/&
&/LinearLayout&界面很简单:就是一个用拍照的Button和一个用于显示头像的ImageView,其中ImageView大小为100dp*100dp.java代码:public&class&MainActivity&extends&AppCompatActivity&implements&View.OnClickListener&{
&&&&private&Button&mTakePhoneB
&&&&private&ImageView&mPreviewImageV
&&&&public&static&final&int&TAKE_PHOTO&=&0;
&&&&private&String&photoPath&=&Environment.getExternalStorageDirectory()&+&&/outout_img.jpg&;
&&&&private&Uri&imageU
&&&&@Override
&&&&protected&void&onCreate(Bundle&savedInstanceState)&{
&&&&&&&&super.onCreate(savedInstanceState);
&&&&&&&&setContentView(R.layout.activity_main);
&&&&&&&&Toolbar&toolbar&=&(Toolbar)&findViewById(R.id.toolbar);
&&&&&&&&setSupportActionBar(toolbar);
&&&&&&&&init();
&&&&&&&&mTakePhoneButton.setOnClickListener(this);
&&&&private&void&init()&{
&&&&&&&&mTakePhoneButton&=&(Button)&findViewById(R.id.btn_take_photo);
&&&&&&&&mPreviewImageView&=&(ImageView)&findViewById(R.id.img_preview);
&&&&@Override
&&&&public&void&onClick(View&v)&{
&&&&&&&&switch&(v.getId())&{
&&&&&&&&&&&&case&R.id.btn_take_photo:
&&&&&&&&&&&&&&&&File&file&=&new&File(photoPath);
&&&&&&&&&&&&&&&&try&{
&&&&&&&&&&&&&&&&&&&&if&(file.exists())&{
&&&&&&&&&&&&&&&&&&&&&&&&file.delete();
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&file.createNewFile();
&&&&&&&&&&&&&&&&}&catch&(IOException&e)&{
&&&&&&&&&&&&&&&&&&&&e.printStackTrace();
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&imageUri&=&Uri.fromFile(file);
&&&&&&&&&&&&&&&&Intent&intent&=&new&Intent(MediaStore.ACTION_IMAGE_CAPTURE);
&&&&&&&&&&&&&&&&intent.putExtra(MediaStore.EXTRA_OUTPUT,&imageUri);
&&&&&&&&&&&&&&&&startActivityForResult(intent,&TAKE_PHOTO);
&&&&&&&&&&&&&&&&
&&&&@Override
&&&&protected&void&onActivityResult(int&requestCode,&int&resultCode,&Intent&data)&{
&&&&&&&&switch&(requestCode)&{
&&&&&&&&&&&&case&TAKE_PHOTO:
&&&&&&&&&&&&&&&&if&(resultCode&==&RESULT_OK)&{
&&&&&&&&&&&&&&&&&&&&if&(ContextCompat.checkSelfPermission(this,&Manifest.permission.WRITE_EXTERNAL_STORAGE)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&!=&PackageManager.PERMISSION_GRANTED)&{
&&&&&&&&&&&&&&&&&&&&&&&&//申请WRITE_EXTERNAL_STORAGE权限
&&&&&&&&&&&&&&&&&&&&&&&&ActivityCompat.requestPermissions(this,&new&String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0);
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&Bitmap&bitmap&=&
&&&&&&&&&&&&&&&&&&&&int&requestWidth&=&mPreviewImageView.getWidth();
&&&&&&&&&&&&&&&&&&&&int&requestHeight&=&mPreviewImageView.getHeight();
&&&&&&&&&&&&&&&&&&&&//不处理直接加载
//&&&&&&&&&&&&&&&&&&&&bitmap&=&BitmapFactory.decodeFile(photoPath);
&&&&&&&&&&&&&&&&&&&&//缩放后加载:从file中加载
&&&&&&&&&&&&&&&&&&&&bitmap&=&BitmapUtils.getFitSampleBitmap(photoPath,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&requestWidth,&requestHeight);
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&mPreviewImageView.setImageBitmap(bitmap);
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&
}这里简单的实现了一个调用相机的功能,点击button调用系统自带相机,然后再onActivityResult里加载拍摄的照片。这里我们重点关注加载照片的部分:&Bitmap&bitmap&=&
&&&&&&&&&&&&&&&&&&&&int&requestWidth&=&mPreviewImageView.getWidth();
&&&&&&&&&&&&&&&&&&&&int&requestHeight&=&mPreviewImageView.getHeight();
&&&&&&&&&&&&&&&&&&&&//不处理直接加载
//&&&&&&&&&&&&&&&&&&&&bitmap&=&BitmapFactory.decodeFile(photoPath);
&&&&&&&&&&&&&&&&&&&&//缩放后加载:从file中加载
&&&&&&&&&&&&&&&&&&&&bitmap&=&BitmapUtils.getFitSampleBitmap(photoPath,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&requestWidth,&requestHeight);
&&&&&&&&&&&&&&&&&&&&mPreviewImageView.setImageBitmap(bitmap);这里提供了两种加载照片的方式:1.不做任何处理直接加载。2.就是调用我们之前写的代码缩放后加载(这里的BitmapUtils就是将之前的代码封装成的一个工具类)。最后我们看看在两种方式下分别的内存消耗对比图吧:调用BitmapUtils加载的:没拍摄照片前:拍摄照片后:直接加载的方式:没拍摄照片前:拍摄照片后:&&&&&&&&相信看到内存对比图后也不用我再多说什么了吧,最后将所有代码上传至GitHub:包含了所有加载函数,还有拍摄相机的demo,其中github里的代码比文章里的要多一些,里面还分别测试了从stream里和rersouces里加载图片ps:对于不同手机运行直接加载图像方式的时候可能会不能正在运行,直接就oom了。地址:/CoolThink/EfficientLoadingPicture.git(欢迎加星或fork)
上一篇: 摘要 性能优化涉及面很广。一般而言,性能优化指降低响应时间和提高系统吞吐量两个方面,但在流量高峰时候,性能问题往往会表现为服务可用性下降,所以性能优化也可以包括提高服务可用性。在某些情况下,降低响应时间、提高系统吞吐量和提高服务可用性三者相
下一篇: 原文链接: Android Application Architecture 原文作者: Iván Carballo 译文出自: 小子的简书 译者: 小子 状态: 完成 Android开发生态圈的节奏非常之快。每周都会有新的工具诞生,类库的更新,博客的发表以及技术探讨。如果你外出度假一个月,当你在_NET类库中Bitmap类的Save方法使用注意些什么_李斌_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
在_NET类库中Bitmap类的Save方法使用注意些什么_李斌
上传于||文档简介
&&.​N​e​t​ ​类​库​中​有​ ​B​i​t​m​a​p​ ​类​用​来​操​作​位​图​对​象​,​ ​其​中​有​一​
​
​个​ ​S​a​v​e​ ​方​法​可​用​来​将​位​图​对​象​保​存​成​指​定​要​求​下​的​各​种​其​他​位​图​对​象​,​ ​它​能​方​便​地​实​现​不​同​位​图​对​象​的​相​互​转​换
阅读已结束,如果下载本文需要使用
想免费下载本文?
你可能喜欢下次自动登录
关注移动互联网和移动APP开发工具、开发框架、测试工具、微信开发、Android源码、Android开源类库以及各种开源组件的IT科技网站
现在的位置:
subsampling-scale-image-view——缩放和显示大图的Android类库
subsampling-scale-image-view是一个自定义的Android ImageView类库,为图片库和显示大图(例如大图、建筑图)时不出现内存泄露而设计。包含使用pinch手势进行缩放、平移、旋转操作,支持动画,还能够轻易的扩展添加自己的覆盖图(overlays)和触摸事件检测。
该类库包含两个类,SubsamplingScaleImageView和ScaleImageView。
SubsamplingScaleImageView使用subsampling和tiles显示大图高清图,避免在内存中持有够多数据出现内存泄露。
ScaleImageView显示Bitmap对象图片以及支持Bitmap所有相同的功能。
1、显示图片:
(1)从assets, resources或文件系统中显示图片;
(2)根据EXIF自动旋转文件系统(例如相机或图库)中的图片;
(3)手动对图片角度加90°进行旋转;
(4)运行时交换图片;
(5)使用自定义的bitmap解码器。
2、手势检测:
(1)一个手指拖动pan手势;
(2)两个手指捏住缩放;
(4)在拖动和缩放手势件无缝切换;
(5)Fling momentum after panning
(6)双击放大或缩小;
(7)禁用pan and/or zoom手势选项。
(1)拉伸或居中的动画公共方法;
(2)可自定动画持续和释放时间;
(3)不间断动画可选项。
4、覆盖事件检测:
(1)支持OnClickListener和OnLongClickListener;
(2)支持使用GestureDetector和OnTouchListener拦截事件;
(3)处理改变视图大小和wrap_content布局;
Github托管地址:
【上篇】【下篇】
您可能还会对这些文章感兴趣!
同分类最新文章}

我要回帖

更多关于 image bitmap 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信