我正在尝试将高图像的一部分加载到可滚动的图像视图(滚动视图内的imageview)。
它适用于较小的图像,但如果图像大于2048x2048,应用程序将因内存开放而崩溃。
我可以加载部分图像:
private Bitmap decodeBitmapRegion(InputStream in, Rect region) {
BitmapRegionDecoder decoder = null;
try {
decoder = BitmapRegionDecoder.newInstance(in, false);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
region.right = decoder.getWidth();
Bitmap reg = decoder.decodeRegion(region, null);
return reg;
}
矩形可以是(0,0,DisplayWidth,800)。
在大多数情况下都适用,因为我使用imageview让用户裁剪图像的一部分并将其保存为coveriamge。图像视图的宽度与显示宽度相同,高度为400 dp。
因此,用户保存的图像宽度与原始图像相同,但只有400 dp的高度。
无论如何,用户是否可以一直滚动到原始图像的底部?
webview如何加载大于2048x2048的图片?
答案 0 :(得分:0)
这是一个想法。
想象一下你的形象被分成几排乐队。使用ListView显示波段。 ListView使用适配器。在adapter.getView()中,您使用解码器加载适当的波段。
ListView已经"回收"。因此,它或多或少只能容纳足够的行来填充屏幕。
如果你的图像太宽,这种技术应该可以正常工作。如果它们是,并且它不够高,不能占用多个屏幕高度,那么您仍然会遇到相同的内存问题。更复杂的解决方案是使用某种网格视图,但是您必须自己进行视图回收。不是很难,但比使用ListView更难。
答案 1 :(得分:0)
我设法获得了我想要的功能。但我不认为这是最好的解决方案? 我将图像加载到webview中,然后我截取了webview的可见部分的屏幕截图。之后,我可以保存该位图,并做任何我想做的事。
但是,除了使用webview显示原始图像之外,还有更好的方法吗?
无论如何,这就是我所做的:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button1);
imgView = (ImageView) findViewById(R.id.imageview);
webView = (WebView) findViewById(R.id.webview);
webView.loadUrl("file:///android_asset/test.jpg");
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
imgView.setImageBitmap(getBitmapForVisibleRegion(webView));
}
});
}
public static Bitmap getBitmapForVisibleRegion(WebView webview) {
Bitmap returnedBitmap = null;
webview.setDrawingCacheEnabled(true);
returnedBitmap = Bitmap.createBitmap(webview.getDrawingCache());
webview.setDrawingCacheEnabled(false);
return returnedBitmap;
}