bitmap加载大图,bitmap放大

  bitmap加载大图,bitmap放大

  在处理位图的过中经常遇到的问题是呜,尤其是在加载像素比较大的位图时,出现这种问题的概率比较高。在加载图片的时候,就要考虑是否真的需要那么大像素的位图,如果要显示的图片的大小是120x140,但是要加载的资源的图片是1024X768的,这时候如果直接加载资源很容易出现伯父的问题,如果在加载图片之前能够知道图片的像素的大小,然后在适当的压缩处理,然后在显示出来,这样伯父的问题就比较不容易出现。

  读取位图的大小和类型

  压缩提供了很多方法来解析方法(decodeByteArray()、deco canal()、decodeResource()等等)来创建位图,你可以选择一个合适的方法来创建位图,但是这样直接的创建位图和容易引起呜,位图工厂还提供一组配套的方法来创建位图,需要加上位图工厂。选择的参数,在显示位图之前事先读取位图的大小和类型:

  位图工厂options options=new bitmap factory .options();

  选项。injustdecodebounds=true

  位图工厂。解码资源(get resources(),R.drawable.myimage,options);

  int图像高度=选项。外部高度;

  int图像宽度=选项。外部宽度;

  字符串imageType=options。outmime类型;

  将位图工厂。选择的不公正的判决设置为没错,可以在解析位图之前获得位图的大小和类型

  压缩位图之后,再加载到内存

  在显示位图之前,需要获得目标显示的位图的大小和要加载的位图的大小,然后计算出来一个合适的压缩比,把通过压缩过的位图加载到内存中,下面是一个封装的方法,来计算合适的压缩比

  public static int calculateInSampleSize(bitmap factory .Options options,int reqWidth,int reqHeight) {

  //图像的原始高度和宽度

  最终int height=options。外部高度;

  最终int width=options。外部宽度;

  samplesize=1中的int

  如果(高度要求高度宽度要求宽度){

  //计算高度和宽度与要求高度的比率

  //宽度

  最终整数高度比=数学。round((float)height/(float)reqHeight);

  最终int宽度比=数学。圆形((浮点)宽度/(浮点)请求宽度);

  //选择最小的比率作为采样率值,这将

  //保证

  //两个维度都大于或等于的最终图像

  //请求的高度和宽度。

  in samplesize=高度比宽度比?高度比:宽度比;

  返回采样率

  }

  其中请求宽度,请求高度是目标的宽的和高度,高度,宽度是资源的高度和宽的,然后计算出一个压缩的比例,使用最小的压缩比

  要使用这个方法,首先将不公正的判决设置为没错,解析获得资源的大小和类型,然后通过上面的方法获得压缩比,然后再将不公正的判决设置为假的,通过计算出来的要所比来解析最终要显示的位图

  }

  例子:图像视图的显示,图像视图要显示的图像的大小是100X100,实际的图像可能不是100X100,通过上面的方法做一下压缩处理,这样就避免出现伯父的问题

  decodeSampledBitmapFromResource(get resources(),R.drawable.myimage,100,100));

  上面是通过解析decodeSampledBitmapFromResource资源文件获得位图,当然还有其他的方法来获得位图

  //计算采样率

  选项。in samplesize=calculateInSampleSize(options,reqWidth,req height);

  //解码设置了采样率的位图

  选项。injustdecodebounds=false

  返回BitmapFactory.decodeFile(文件名,选项);

  2.通过文件描述符获得位图

  公共静态位图decodeSampledBitmapFromDescriptor(

  文件描述符文件描述符,整数请求宽度,整数请求高度,图像缓存缓存){

  //首先使用inJustDecodeBounds=true进行解码以检查尺寸

  最终位图工厂options options=new bitmap factory .options();

  选项。injustdecodebounds=true

  位图工厂。decafaildescriptor(文件描述符,空,选项);

  //计算采样率

  选项。in samplesize=calculateInSampleSize(options,reqWidth,req height);

  //解码设置了采样率的位图

  选项。injustdecodebounds=false

  返回位图工厂。decafaildescriptor(文件描述符,空,选项);

  }

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: