Android 图片处理(一)

Android开发的过程中,对于图片的加载可以分为两种:本地图片、网络请求图片。对于前者的加载一般的操作为:

imgview.setImageResource(图片地址

但是对于网络请求过来的图片这种方式处理是不太合理的。那么对于一般的网络请求过来的图片又是怎么样处理的呢?当然,步骤是:通过网络请求----> 图片压缩------>显示图片。

这个过程就必须要提到bitmapFactory这个类,那接下来我们进行学习:

先看一下对应的方法:


对于上面的方法是将获得的图片流、文件、byte[]等放入对应的方法中,然后得到Bitmap对象。然而这样子做对于多图片时候或者图片过大的时候还是会出现OOM 问题,一脸懵逼了吧....那好,就让BitmapFactory.Optens上场了。在BitmapFactory.Optens类中有一个:


 Options opts = new Options();
 opts.inJustDecodeBounds = true;

这个设置为true 的时候,那么返回的不是一个真正意义上的Bitmap对象而是对应的宽高,这样就不会造成OOM现象了。

  可是有的时候,我们觉得这样还不够我们想要的是指定大小的图片显示,那么就下来的就是对于图片的设置:1. 获得屏幕的宽高 2.Bitmap获得网络图片的实际宽高 3. 我们预想的图片显示的宽高。好,知道这些之后调理就清洗了,我们要做的是判断 Bitmap的宽高和我们屏幕的宽高的关系,进行适当的设置比例。

public class ImageSizeUtil
{
/**
 * 根据需求的宽和高以及图片实际的宽和高计算SampleSize
 * 
 * @param options
 * @param width
 * @param height
 * @return
 */
public static int caculateInSampleSize(Options options, int reqWidth,
int reqHeight)
{
int width = options.outWidth;
int height = options.outHeight;
 
int inSampleSize = 1;
 
if (width > reqWidth || height > reqHeight)
{
int widthRadio = Math.round(width * 1.0f / reqWidth);
int heightRadio = Math.round(height * 1.0f / reqHeight);
 
inSampleSize = Math.max(widthRadio, heightRadio);
}
 
return inSampleSize;
}
 
/**
 * 根据ImageView获适当的压缩的宽和高
 * 
 * @param imageView
 * @return
 */
public static ImageSize getImageViewSize(ImageView imageView)
{
 
ImageSize imageSize = new ImageSize();
DisplayMetrics displayMetrics = imageView.getContext().getResources()
.getDisplayMetrics();
 
LayoutParams lp = imageView.getLayoutParams();
 
int width = imageView.getWidth();// 获取imageview的实际宽度
if (width <= 0)
{
width = lp.width;// 获取imageview在layout中声明的宽度
}
if (width <= 0)
{
 //width = imageView.getMaxWidth();// 检查最大值
width = getImageViewFieldValue(imageView, "mMaxWidth");
}
if (width <= 0)
{
width = displayMetrics.widthPixels;
}
 
int height = imageView.getHeight();// 获取imageview的实际高度
if (height <= 0)
{
height = lp.height;// 获取imageview在layout中声明的宽度
}
if (height <= 0)
{
height = getImageViewFieldValue(imageView, "mMaxHeight");// 检查最大值
}
if (height <= 0)
{
height = displayMetrics.heightPixels;
}
imageSize.width = width;
imageSize.height = height;
 
return imageSize;
}
 
public static class ImageSize
{
int width;
int height;
}
/**
 * 通过反射获取imageview的某个属性值
 * 
 * @param object
 * @param fieldName
 * @return
 */
private static int getImageViewFieldValue(Object object, String fieldName)
{
int value = 0;
try
{
Field field = ImageView.class.getDeclaredField(fieldName);
field.setAccessible(true);
int fieldValue = field.getInt(object);
if (fieldValue > 0 && fieldValue < Integer.MAX_VALUE)
{
value = fieldValue;
}
} catch (Exception e)
{
}
return value;
}
}


好了对于图片的大小在屏幕显示的比例已经获得了,那么接下来进行的是对于多图片的压缩,将要用到ImageLoader进行处理,下一个博客写吧。这里很感谢 鸿洋大神的博客,在他的博客中受益匪浅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值