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

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

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

Solutions Collecting From Web of "有没有办法从Android的文件中加载和绘制部分位图?"

我相当有信心这是可能的,因为你可以加载一个非常大的位图文件到一个ImageView没有问题,所以必须有某种内置的方式来处理大的位图…经过几次尝试,我已经find了解决办法:

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

 InputStream mapInput = getResources().openRawResource( R.drawable.transit_map); _map = Drawable.createFromStream(mapInput, "transit_map"); _map.setBounds(0, 0, _mapDimension.width(), _mapDimension.height()); 

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

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

 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); 

就像在上面的例子中一样,您也可以通过操作drawable的边界来缩放和平移位图,只有位图的相关部分将被加载并绘制到Canvas

结果就是从一个单一的200KB位图文件中获得一个缩放视图。 我还testing了一个22MB的PNG文件,它仍然工作,没有任何OutOfMemoryError包括当屏幕方向改变。

现在它非常相关: BitmapRegionDecoder 。

注意:从Android SDK 10开始可用

使用RapidDecoder可以轻松完成。

 import rapid.decoder.BitmapDecoder; Rect bounds = new Rect(10, 20, 30, 40); Bitmap bitmap = BitmapDecoder.from("your-file.png") .region(bounds) .decode(); imageView.setImageBitmap(bitmap); 

它支持Android 2.2(API级别8)。

一般来说,这是不可能的,特别是因为大多数图像格式是压缩的,所以你甚至不知道要读取哪些字节,直到你解压缩的forms。

将图像分解成小块,然后只加载需要覆盖要在运行时显示的区域的图块。 为了避免紧张的滚动,你可能还需要在后台线程上预先加载看不见的瓦片(边界可见的瓦片)。