使用UniversalImageLoader加载位图

时间:2015-03-24 18:09:50

标签: android universal-image-loader

我想用通用加载器加载位图图像,但Bitmap构造函数不被接受,因为我转换为Universal Image Loader URI的构造函数的有效位图。

ImageLoader.getInstance().displayImage(mImagesBitmap[position]), imageView, options);

这是正确的方法吗?

我的代码的一个重要部分,这被称为多次。

int windowDrawable = R.drawable.window_arch;
int resultBitmap = R.drawable.result;

Bitmap windowBitmap= BitmapFactory.decodeResource(getResources(), windowDrawable);

Bitmap editedBitMap= BitmapFactory.decodeResource(getResources(), resultBitmap);

Bitmap finalBitmap =  bitmap_overlay(windowBitmap, editedBitMap) ;
editedBitMap.recycle();
windowBitmap.recycle();

finalBitmap  . 
public static bitmap_overlay(Bitmap bmp1, Bitmap bmp2)
    { 
     try 
     { 
       int maxWidth = (bmp1.getWidth() > bmp2.getWidth() ? bmp1.getWidth() : bmp2.getWidth());
       int maxHeight = (bmp1.getHeight() > bmp2.getHeight() ? bmp1.getHeight() : bmp2.getHeight());
       Bitmap bmOverlay = Bitmap.createBitmap(maxWidth, maxHeight,  bmp1.getConfig());
       Canvas canvas = new Canvas(bmOverlay);
       canvas.drawBitmap(bmp1, 0, 0, null);
       canvas.drawBitmap(bmp2, 0, 0, null);
       return bmOverlay;

     } catch (Exception e)
     { 

      e.printStackTrace();
      return null; 
     } 
    } 


setWindowBackgroud(BitmapFactory.decodeResource(mContext.getResources(), windowDrawable));

1 个答案:

答案 0 :(得分:0)

您无法使用图像加载器显示位图。您只能提供有效的URI(文件位置,可绘制等)。因此,如果真的想要使用图像加载器显示它,则需要先将其保存下来。

既然你有位图,为什么不简单地调用它?

imageView.setImageBitmap(mImagesBitmap[position]);

<强>更新

问题发生了变化,为什么你会获得OOM异常以及如何在不损失质量的情况下解决它。

您可以参考我之前发布的dealing with many full screen png to avoid OOM这个答案,但选项2不适用于您的情况。

这里的问题是您想要编辑这些图像并且不想丢失质量。因此,以较低的分辨率加载它们可能不是一种选择(尽管如果可能,您仍应考虑以较小的分辨率加载它们)。还尝试使用RGB_565标志加载您的位图,这样可以节省50%的内存,除非您的图像具有Alpha通道(透明度)。

此处您唯一的选择可能是将largeHeap设置为true(请参阅已发布的链接),即使这不起作用,您也可以选择使用。

一般来说,你应该记住:

  1. 默认情况下,Android会使用每像素4个字节将图片加载到bitmap。这与使用的文件大小和压缩技术无关。

  2. 您应该尝试以尽可能低的分辨率加载图像。这可能取决于设备大小,您希望图像的质量以及各种其他启发式方法。

  3. 您不应在内存中加载超过需要的内容。这意味着,如果您在编辑时只显示一个图像,则只应将此图像加载到内存中。 将它们加载到内存中并将它们保存在一个数组中是一个很大的问题。

  4. 我理解为图像编辑应用程序,#2并不总是一个选项,但如果您遇到内存问题,即使使用largeHeap,也可能需要考虑它。您还应确保不将它们以任何形状或形式存储在数组中。一旦你完成编辑它们,就丢弃旧版本,并且在任何给定时间只有一个加载到内存中。

    在Android开发方面,内存是最宝贵的资产。您获得的金额非常有限,并且被迫使用您所提供的服务。有一种方法可以请求更大的内存,但即使这样也有限,所以你仍然必须确保只加载你需要的内容并丢弃你不想要的内容。