2013-03-02 33 views
11

我的应用程序必须显示一些高分辨率图像(约1900 * 2200像素),支持捏缩放。为了避免内存不足错误我打算解码图像通过Android捏缩放大图像,内存高效而不丢失细节

options.inSampleSize = scale (scale was calculated as Power of 2 as Document) 

到全屏显示(我的看法,我用是TouchImageView延伸的ImageView

这样我就可以快速加载图像和屏幕之间顺畅滑动(图片)。但是,当我捏​​缩放,我的应用程序丢失细节,因为缩放图像。 如果我加载完整图像,我无法快速加载或平滑轻扫,在缩放后拖动。 然后,我尝试只在用户开始捏缩放时才加载完整图像,但由于非常大的图像,我仍然无法顺利拖动图像。 Android画廊甚至可以完成8Mpx的图像。

任何人都可以帮助我。在此先感谢

+0

也许这就是你在找什么http://stackoverflow.com/questions/12022675/decode-part-of-jpeg-file – exebook 2013-03-02 14:55:15

+0

我不深刻地理解它,但也许这是没有帮助对我来说 – Kiradev 2013-03-02 17:36:00

+0

只能快速显示巨型Jpegs的方法是逐步加载它们,并只对所需的部分进行解码。访问jpeg的常用方法是libjpeg,因此上面的链接讨论了如何使用libjpeg渐进地获取jpeg文件的一部分,而不是将其作为一个整体进行解码。 – exebook 2013-03-04 03:27:01

回答

3

我知道这个问题很久以前问过,但这个答案可能会帮助其他人挣扎着与此。我有完全相同的问题。您应该考虑使用WebView并加载您的图像,即使它是本地图像。例如在资产加载图像使用以下命令:

// Get a WebView you have defined in your XML layout  
WebView webView = (WebView) findViewById(R.id.webView1); 
// Fetch the picture in your folders using HTML    
String htmlData = "<img src=\"my_image.png\">"; 
webView.loadDataWithBaseURL("file:///android_asset/", htmlData, "text/html", "utf-8", null); 
// Activate zooming 
webView.getSettings().setBuiltInZoomControls(true); 

我承认,这是很奇怪的使用WebView对于这样的任务,这是我发现的唯一的解决方案。至少你永远不会得到一个OOM异常。

8

对不起回答一个老问题,但我刚刚完成了一个图像视图,该图像显示来自资产或外部存储的图像,并在缩放时从图像中加载更高分辨率的图块。由于高分辨率屏幕区域的图像数据未加载,应避免内存不足异常。

https://github.com/davemorrissey/subsampling-scale-image-view

+0

我刚刚使用过你的库并查看了它的源代码。你应该得到诺贝尔奖! – 2014-01-29 18:15:56

+0

适用于小屏幕(320x480),但对于大屏幕(1280x800)崩溃:(我真的需要一个解决方案来加载一个大的图像,缩放和平移。叹... – usman 2014-02-24 07:49:24

+0

@usman因为我写了这个我做了一些修改,以修复一些OOME仍然可以抛出的边缘情况。几个用户报告使用该视图在任何设备上显示高达20,000x20,000的图像 – 2015-03-14 08:07:53