在开发图片浏览器等软件是,很多时候要显示图片的缩略图,而一般情况下,我们要将图片按照固定大小取缩略图,一般取缩略图的方法是使用BitmapFactory的decodeFile方法,然后通过传递进去 BitmapFactory.Option类型的参数进行取缩略图,在Option中,属性值inSampleSize表示缩略图大小为原始图片大小的几分之一,即如果这个值为2,则取出的缩略图的宽和高都是原始图片的1/2,图片大小就为原始大小的1/4。
然而,如果我们想取固定大小的缩略图就比较困难了,比如,我们想将不同大小的图片去出来的缩略图高度都为200px,而且要保证图片不失真,那怎么办?我们总不能将原始图片加载到内存中再进行缩放处理吧,要知道在移动开发中,内存是相当宝贵的,而且一张100K的图片,加载完所占用的内存何止 100K?
经过研究,发现,Options中有个属性inJustDecodeBounds,研究了一下,终于明白是什么意思了,SDK中的E文是这么说的
If set to true, the decoder will return null (no bitmap), but the out... fields will still be set, allowing the caller to query the bitmap without having to allocate the memory for its pixels.
哦,明白了,那么相应的方法也就出来了,通过设置inJustDecodeBounds为true,获取到outHeight(图片原始高度)和 outWidth(图片的原始宽度),然后计算一个inSampleSize(缩放值),然后就可以取图片了,这里要注意的是,inSampleSize 可能小于1,必须做判断,同时由于inSampleSize为Int类型,而图片的高度和宽度也为int类型,通过精度的转换,可能会存在失真的问题,那么,我这样进行那个判断(实例代码中为取高度为200PX的缩略图)
int be = options.outHeight / 20;//应该直接除200的,但这里出20是为了增加一位数的精度
if(be%10 !=0)
be+=10; //尽量取大点图片,否则会模糊
be=be/10;
if (be <= 0) //判断200是否超过原始图片高度
be = 1; //如果超过,则不进行缩放
options.inSampleSize = be;
整体代码如下
BitmapFactory.Options options = new BitmapFactory.Options();
//options.inSampleSize = 3;
options.outHeight = 200;
options.inJustDecodeBounds = true;
//options.
if (position < 0) {
position = position + mImageDirs.size();
}
// 获取这个图片的宽和高
Bitmap bm = BitmapFactory.decodeFile(this.mImageDirs
.get(position % mImageDirs.size()), options); //此时返回bm为空
options.inJustDecodeBounds = false;
int be = options.outHeight / 20;
if(be%10 !=0)
be+=10;
be=be/10;
if (be <= 0)
be = 1;
options.inSampleSize = be;
bm = BitmapFactory.decodeFile(this.mImageDirs.get(position
% mImageDirs.size()), options);
int w = bm.getWidth();
int h = bm.getHeight();
w = w *200 /h;
i.setImageBitmap(bm);
原文链接:http://www.cnmsdn.com/html/201006/1276372230ID6068.html
分享到:
相关推荐
标题“从网络获取图片按图片原大小显示”和描述所指出的问题,通常涉及到图片加载库的使用、图像解码、布局适应以及性能优化等关键点。下面将详细阐述这些知识点: 1. **网络图片加载**:Android中,我们可以使用...
本文将深入探讨如何在Android开发中实现图片的高效缩放,特别是针对固定大小缩略图的生成。 #### 一、理解`BitmapFactory.Options` `BitmapFactory.Options`类在Android中用于控制`Bitmap`对象的解码过程。通过...
本文将深入探讨如何在Android应用中有效地处理图片,包括如何获取缩略图、按固定大小压缩图片以及保存压缩后的图片等内容。 #### 一、理解BitmapFactory及其选项 在Android中,`BitmapFactory`是用于解码和创建`...
在Android开发中,"Gallery从SD卡中获取图片,并显示.zip"这个项目涉及到的是如何在应用程序中实现一个图片浏览功能,允许用户从设备的外部存储(通常为SD卡)选择并展示图片。以下是对这个主题的详细解释: 1. **...
1. **inSampleSize**:表示缩略图大小为原始图片大小的比例。例如,如果`inSampleSize`设为2,则取出的缩略图的宽和高均为原始图片的1/2,图片大小则为原始大小的1/4。 2. **inJustDecodeBounds**:当该属性设为`...
本文将深入探讨“android——相册”这一主题,解析如何创建一个简单的相册应用程序,允许用户自由替换照片和以缩略图形式展示图片。 首先,Android相册的核心是图像的加载和显示。在Android中,我们可以使用`...
图片列表区域展示图片缩略图;底部操作栏则有“完成”、“取消”等按钮,用于结束选择操作。 9. **事件监听和回调**: 在用户选择图片后,需要监听并处理这些选择事件。可以通过接口回调、事件总线(如EventBus)...
总之,实现Android仿微信群聊头像的关键步骤包括获取头像图片、创建缩略图、组合Bitmap和布局设计。在实际开发中,可以根据项目需求调整头像的排列方式、形状、边框等细节,以达到更贴近原生应用的用户体验。通过...