有没有办法从Android中的文件加载和部分绘制位图?

cha*_*rit 8 android bitmap

假设我在磁盘上有一点大(即不适合大多数手机的内存)位图.我想以一种不缩放的方式在屏幕上绘制部分内容(即inSampleSize == 1)

有没有办法加载/绘制我想要的部分给定一个Rect指定区域而不加载整个位图内容?

cha*_*rit 9

我非常有信心这是可能的,因为你可以将一个非常大的位图文件加载到ImageView没有问题的所以必须有某种内置的方法来处理大型位图...并且在几次尝试之后,我发现了一个办法:

而不是加载整个位图并自己手动绘制,Drawable而是将其加载为:

InputStream mapInput = getResources().openRawResource(
        R.drawable.transit_map);
_map = Drawable.createFromStream(mapInput, "transit_map");

_map.setBounds(0, 0, _mapDimension.width(), _mapDimension.height());
Run Code Online (Sandbox Code Playgroud)

我正在使用资源文件,但由于您可以使用Drawable.createFromStream从任何加载图像InputStream,它应该适用于任意位图.

然后,使用该Drawable.draw方法将其绘制到所需的画布上,如下所示:

int left = -(int) contentOffset.x;
int top = -(int) contentOffset.y;
int right = (int) (zoom * _mapDimension.width() - contentOffset.x);
int bottom = (int) (zoom * _mapDimension.height() - contentOffset.y);

_map.setBounds(left, top, right, bottom);
_map.draw(canvas);
Run Code Online (Sandbox Code Playgroud)

与上面的情况一样,您也可以通过操纵drawable的边界来缩放和转换位图,只有位图的相关部分才会被加载并绘制到Canvas.

结果是只有一个200KB位图文件的可缩放缩放视图.我还用22MB的PNG文件对它进行了测试,OutOfMemoryError当屏幕方向发生变化时,它仍然可以正常工作.


Vad*_*dim 6

现在它非常相关:BitmapRegionDecoder

注意:自 Android SDK 10 起可用