‘壹’ android开发怎么得到Bitmap所占资源的大小
首先得到Bitmap对象所占资源的大小,在新的API上提供了一个方法
bitmap.getByteCount() // from API Level 12
也就是说从SDK12才能使用这个方法,针对以前的版本还是不能使用,那么怎么办?看第二种方法
bitmap.getRowBytes() * bitmap.getHeight() //这样也能很准确的计算出Bitmap所占内存的大小,方法都是从SDK1就开始存在的。bingo!正解!
需要注意的是我上面说的两种方法是得到bitmap对象在内存中所占的存储空间大小,其实比实际图片(比如图片文件)大,如果想得到文件大小呢?
如何得到bitmap所使用图片的文件大小?
bitmap.compress(format, quality, stream)
至于方法的解释,参数的传入自己去看API文档,最后一个参数是一个OutPutStream对象,得到大小
‘贰’ android: ImageView的setImageBitmap()方法
一、ImageView的setImageBitmap()是设置imageView组件的图片显示。它的定义和源码如下:
1、在源代码中输入:if this is used frequently,may handle bitmaps explicitly // to rece the intermedite drawable abject;
2、它实际上是对setImageDrawable接口的封装,支持直接略过Bitmap对象进行组件图片的设置。需要指出的是这个方法设置图片时,进行大图片的处理时,注意对图片的缩放,否则会内存溢出。
(2)android得到bitmap扩展阅读:
一、Bitmap设置代码:
1、ImageView的setImageBitmap()是设置imageView组件的图片显示,实际上是setImageDrawable接口的封装,支持直接略过Bitmap对象进行组件图片的设置。
2、需要指出的是这个方法设置图片时,进行大图片的处理时,注意对图片的缩放,否则会内存溢出。if this is used frequently,may handle bitmaps explicitly // to rece the intermedite drawable abject;
二、根据位深度,可将位图分为1、4、8、16、24及32位图像等。每个像素使用的信息位数越多,可用的颜色就越多,颜色表现就越逼真,相应的数据量越大。例如,位深度为 1 的像素位图只有两个可能的值(黑色和白色)。
1、所以又称为二值位图。位深度为 8 的图像有 2^8(即 256)个可能的值。位深度为 8 的灰度模式图像有 256 个可能的灰色值。
2、RGB图像由三个颜色通道组成。8 位/通道的 RGB 图像中的每个通道有 256 个可能的值,这意味着该图像有 1600 万个以上可能的颜色值。
3、有时将带有 8 位/通道 (bpc) 的 RGB 图像称作 24 位图像(8 位 x 3 通道 = 24 位数据/像素)。通常将使用24位RGB组合数据位表示的的位图称为真彩色位图。
4、BMP文件是微软公司所开发的一种交换和存储数据的方法,各个版本的Windows都支持BMP格式的文件。Windows提供了快速、方便的存储和压缩BMP文件的方法。BMP格式的缺点是,要占用较大的存储空间,文件尺寸太大。
‘叁’ Android 图片加载(一)高效加载Bitmap 基础篇
由于Bitmap的特殊性以及Android对单个应用所规定的最大内存限制,我们在同时加载大量Bitmap时很容易发生内存溢出,即我们通常所说的OutOfMemoryError(OOM),因此高效加载Bitmap就成为了每个Android开发者的必备技能。
在学习如何高效地加载Bitmap之前,首先介绍一下如何加载一个Bitmap。我们都知道,Bitmap在Android中通常指的是一张图片,那么如何将JPG、PNG等格式的图片转换成Bitmap对象呢?BitmapFactory类给我们提供了一些方法:
接下来开始介绍如何高效地加载Bitmap,其实核心思想很简单: 就是采用BitmapFactory.Options参数来调整图片尺寸来适配控件的大小。
假如我们显示图片的控件ImageView宽高为100×100像素,而图片的尺寸为1024×1024像素,这个时候如果将整个图片加载进来并显示到控件上,自然是很占用内存资源的。这个时候可以通过BitmapFactory.Options按一定的采样率加载缩小后的图片,再将缩小后的图片显示到ImageView中,这样就能减小内存占用从而在一定程度上避免OOM的发生。
通过BitmapFactory.Options来缩放图片,主要是使用它的inSampleSize参数,也就是前面提到的采样率。当采样率inSampleSize为1时,采样后的图片大小为原图大小;当采样率inSampleSize>1,比如为2时,采样后的图片宽高都为原图的1/2,即像素降为原图的1/4,占用的内存大小也就是原图的1/4;比较特殊的是,当采样率inSampleSize<1时,系统会自动将该值当做1来处理。 因此可以得出一个结论:采样率inSampleSize必须是大于1的整数图片才会有缩小的效果,并且采样率同时作用于宽高,也就是说采样后的图片会缩小到原图的1/(inSampleSize^2)。比如inSampleSize=4,那么缩放比例为1/16。
我们现在知道了,通过采样率可以提高图片的加载效率,那么如何才能计算出最合适的采样率?我们可以按照如下流程:
接下来以decodeFile方法为例实现图片的缩放,其他三个方法处理方式类似。
下一篇: Android 图片加载(二)图片加载框架Glide 入门篇
《Android开发艺术探索》
‘肆’ android怎么获取bitmap左上角坐标
用ImageView来装载这个bitmap并且填满整个ImageView,再用imageview对象来获取坐标值,getX(),getY(),获取的就是左上角的坐标值
‘伍’ android 怎么获得bitmap对象
保存界面可视化组件,在调用View.getDrawingCache方法前需要调用measure和layout方法才能可以成功获取布局的Bitmap对象
代码如下:
//获得xml的布局截图
View view=getLayoutInflate r().inflate(R.layout.dialog, null);
//打开图像缓存
view.setDrawingCacheEnabled(true);
//需要调用measure和layout方法
view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
//发送位置和尺寸到view及其所有的子view
view.layout(0, 0, view.getMeasuredWidth(),view.getMeasuredHeight());
//获得可视化组件的截图
Bitmap bitmap=view.getDrawingCache();
try {
//保存在sdcard目录下
FileOutputStream fos=new FileOutputStream("/sdcard/test.png");
bitmap.compress(CompressFormat.PNG, 100, fos);
//关闭文件输出流
fos.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
‘陆’ android中怎么获取一个bitmap在屏幕中位置
是要编写一个这样的功能么,android提供的api里面一般图片都是bitmap,可以通过canvas.drawbitmap的方法在view进行图片的绘制,在方法中需要进行传入一个类型为matrix的参数,设置martrix的一些参数就可以进行图片的放大的绘制,这只是显示,也就是mvc中的view层,然后通过提供的一些触摸函数的重写并实现自己需要的一些功能,如拖动,实际上就是改变bitmap绘制的位置。关于触摸的处理和图片的绘制可以在网上进行一些教程的搜索,我就不罗列了,最终就是需要通过控制函数来改变图片的绘制方式,这也许就是你所需要的功能。
‘柒’ android 读取Bitmap的几种方式
想读取本地项目里的资源图片,但又不能用到R文件。查了很多资料终于找到了。 现总结以下几种读取Bitmap的方法。 1.以文件流的方式,假设在sdcard下有 test.png图片 FileInputStream fis = new FileInputStream("/sdcard/test.png"); Bitmap bitmap=BitmapFactory.decodeStream(fis); 2. 以R文件的方式,假设 res/drawable下有 test.jpg文件Bitmapbitmap =BitmapFactory.decodeResource(this.getContext().getResources(), R.drawable.test); 3.以ResourceStream的方式,但不用到R文件。 Bitmap.bitmap=BitmapFactory.decodeStream(getClass().getResourceAsStream(“/res/drawable/test.png”)); 图片名就可以读取到 Bitmap啦。 BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 2; //图片宽高都为原来的二分之一,即图片为原来的四分一 //以上代码可以优化内存溢出,但它只是改变图片大小,并不能彻底解决内存溢出。