我是靠谱客的博主 平淡发箍,最近开发中收集的这篇文章主要介绍android-------获取图片缩略图,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

背景:要实现本地文件夹下的图片缩略图的显示问题。

分析:首先在Adapter里面判断图片形式(以图片后缀名判断),如:

 if(fileType.equals("file"))
{
if(name.endsWith(".jpg") || name.endsWith(".jpeg")
|| name.endsWith(".bmp") || name.endsWith(".gif")
|| name.endsWith(".png") || name.endsWith(".SVG")
|| name.endsWith(".tif") || name.endsWith(".tiff"))
{
Bitmap bmp = getImageThumbnail(listMediaFiles.get(position).getPath(), 100, 100);
item.setImageBitmap(bmp);
//设置setImageBitmap()方法
item.setChkVisible(true);
item.setUploadInfoVisibility(true);
}
else
{
item.setImageResource(R.drawable.file_item);
item.setChkVisible(true);
item.setUploadInfoVisibility(true);
}
} 

再设

setImageBitmap()<span style="font-size:14px;"><span style="font-size:14px;"><span style="font-size:14px;">方法。</span></span></span>

最后,调用getImageThumbnail()方法,直接上代码:

    /*
     * 根据指定的图像路径和大小来获取缩略图,此方法有两点好处:
     * 1、使用较小的内存空间,第一次获取的bitmap实际上为null,只是为了读取宽度和高度,第二次读取的bitmap是根据比例缩放过的图像,第三次读取的bitmap是所要的缩略图。
     * 2、缩略图对于原图像来讲没有拉伸,这里使用了ThumbnailUtils,使用这个工具生成的图像不会被拉伸。
     * imagePath----图像的路径
     * width----指定输出图像的宽度
     * height----指定输出图像的高度
     * return----返回生成的缩略图
     */
  

 private Bitmap getImageThumbnail(String imagePath, int width, int height)
{
Bitmap bitmap = null;
BitmapFactory.Options options = new BitmapFactory.Options();
//缩放图片,width、height按相同比例缩放图片
options.inJustDecodeBounds = true;
//options为true时,构造出的bitmap没有图片,只有一些长宽等配置信息,但是速度快;也就是说,当inJustDecodeBounds为true时,bitmap并不加载到内存,这样效率很高。options为false时,才有图片。
bitmap = BitmapFactory.decodeFile(imagePath, options);
//获取这个图像的宽和高,这里的bitmap为null
options.inJustDecodeBounds = false;
//此处一定要设为false,真正解码图片
//计算缩放比
int h = options.outHeight;
int w = options.outWidth;
int beWidth = w / width;
int beHeight = h / height;
int be = 1;
if (beWidth < beHeight)
{
be = beWidth;
}
else {
be = beHeight;
}
if (be <= 0)
{
be = 1;
}
options.inSampleSize = be;
//inSampleSize是缩放比,如options.inSampleSize =8,就是原图的八分之一
bitmap = BitmapFactory.decodeFile(imagePath, options);
//重新读入图片,读取缩放后的bitmap
bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,
ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
//利用ThumbnailUtils来创建缩略图,这里要指定缩放哪个Bitmap对象
return bitmap;
//返回生成的缩略图
}


TIPS:此方法很简单,其实它做了如下几件事:
1、根据传入的图片路径构造bitmap,得到原图的宽度和高度。
2、计算出图片合适的缩放比。
3、利用ThumbnailUtils来创建缩略图,然后返回这个最终缩放后的bitmap。
尽管此方法使用了较小的内存空间,但是整个方法还是开辟了3个bitmap对象的内存区域,这还没有考虑
ThumbnailUtils.extractThumbnail()方法所耗费的空间。
虽然最后我使用这个方法实现了在ListView中遍历本地文件夹下的图片,但上下滑动的时候还是非常的卡顿。
对于这种现象,个人觉得应该还有更好的方法用来解决这种问题,寻找ing。(将图片先放入缓存中就可以解决了)

最后,附上一张效果图




前面提到过上面这种方法实现的缩略图会出现卡顿的现象。

现在使用另一种方法来实现就不会出现这种问题了。

参考的:http://blog.csdn.net/joke124/article/details/50494973和http://blog.csdn.net/adayabetter/article/details/45047017

下面是我的实现过程:

在适配器中

if (name.endsWith(".jpg") || name.endsWith(".jpeg")
|| name.endsWith(".png")
|| name.endsWith(".bmp")
|| name.endsWith(".gif")
|| name.endsWith(".psd"))
{
String path = listMediaFiles.get(position).getPath();
item.mImageView.setTag(path);
Bitmap bitmap = ImageLoader.getInstance().<strong>loadNativeImage</strong>(path, new NativeImageCallBack()
{
@Override
public void onImageLoader(Bitmap bitmap, String path) {
ImageView mImageView = (ImageView)mListView.findViewWithTag(path);
if(bitmap != null && mImageView != null)
{
mImageView.setImageBitmap(bitmap);
}
}
});
if(bitmap != null)
{
item.setImageBitmap(bitmap);
}
else
{
item.mImageView.setImageResource(R.drawable.friends_sends_pictures_no);
}

public Bitmap loadNativeImage(final String path, final NativeImageCallBack mCallBack){
Bitmap bitmap = getBitmapFromMemCache(path);
final Handler mHander = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
mCallBack.onImageLoader((Bitmap)msg.obj, path);
}
};
if(bitmap == null){
mImageThreadPool.execute(new Runnable() {
@Override
public void run() {
Bitmap mBitmap = decodeThumbBitmapForFile(path, 200,200);
Message msg = mHander.obtainMessage();
msg.obj = mBitmap;
mHander.sendMessage(msg);
addBitmapToMemoryCache(path, mBitmap);
}
});
}
return bitmap;
}
这里关键是使用 imageloader加载图片。

setTag():  此外,Adapter 有个getView方法,可以使用setTag把查找的view缓存起来方便多次重用。如

public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder vh;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) mWidgetsSwitchApp
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.app_gallery_item, null);
vh = new ViewHolder();
vh.view1 = (ImageView) convertView.findViewById(R.id.view1);
vh.view2 = (ImageView) convertView.findViewById(R.id.view2);
vh.view3= (ImageView) convertView.findViewById(R.id.view3);
vh.view4 = (ImageView) convertView.findViewById(R.id.view4);
convertView.setTag(vh);
} else {
vh = (ViewHolder) convertView.getTag();
}

View中的setTag(Object)表示给View添加一个额外的数据,以后可以用getTag()将这个数据取出来。

setTag(),取出来的是对象所指向的对象。与setId()不同,findViewById找到的是对象本身。

在同一个类中,存取数据很方便,不用数据库建库,也比sharePreference更节约内存。



最后

以上就是平淡发箍为你收集整理的android-------获取图片缩略图的全部内容,希望文章能够帮你解决android-------获取图片缩略图所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部