我想用通用加载器加载位图图像,但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));
答案 0 :(得分:0)
您无法使用图像加载器显示位图。您只能提供有效的URI(文件位置,可绘制等)。因此,如果真的想要使用图像加载器显示它,则需要先将其保存下来。
既然你有位图,为什么不简单地调用它?
imageView.setImageBitmap(mImagesBitmap[position]);
<强>更新强>
问题发生了变化,为什么你会获得OOM异常以及如何在不损失质量的情况下解决它。
您可以参考我之前发布的dealing with many full screen png to avoid OOM这个答案,但选项2不适用于您的情况。
这里的问题是您想要编辑这些图像并且不想丢失质量。因此,以较低的分辨率加载它们可能不是一种选择(尽管如果可能,您仍应考虑以较小的分辨率加载它们)。还尝试使用RGB_565标志加载您的位图,这样可以节省50%的内存,除非您的图像具有Alpha通道(透明度)。
此处您唯一的选择可能是将largeHeap设置为true(请参阅已发布的链接),即使这不起作用,您也可以选择使用。
一般来说,你应该记住:
默认情况下,Android会使用每像素4个字节将图片加载到bitmap
。这与使用的文件大小和压缩技术无关。
您应该尝试以尽可能低的分辨率加载图像。这可能取决于设备大小,您希望图像的质量以及各种其他启发式方法。
您不应在内存中加载超过需要的内容。这意味着,如果您在编辑时只显示一个图像,则只应将此图像加载到内存中。 将它们加载到内存中并将它们保存在一个数组中是一个很大的问题。
我理解为图像编辑应用程序,#2并不总是一个选项,但如果您遇到内存问题,即使使用largeHeap,也可能需要考虑它。您还应确保不将它们以任何形状或形式存储在数组中。一旦你完成编辑它们,就丢弃旧版本,并且在任何给定时间只有一个加载到内存中。
在Android开发方面,内存是最宝贵的资产。您获得的金额非常有限,并且被迫使用您所提供的服务。有一种方法可以请求更大的内存,但即使这样也有限,所以你仍然必须确保只加载你需要的内容并丢弃你不想要的内容。