问题 Android捏缩放大图像,内存高效而不丢细节


我的应用程序必须显示许多高分辨率图像(约1900 * 2200像素),支持捏缩放。为避免内存不足错误,我计划使用解码图像以显示全屏

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

(我用过的观点是 TouchImageView 延伸 ImageView

所以我可以快速加载图像并在屏幕(图像)之间平滑滑动。但是,当我捏​​缩放时,我的应用程序因缩放图像而丢失细节。 如果我加载完整的图像,我无法加载快速或平滑滑动,捏缩放后拖动。 然后我尝试仅在用户开始捏缩放时加载完整图像,但由于图像非常大,我仍然无法平滑地拖动图像。 Android画廊甚至可以完美地实现8Mpx图像。

任何人都可以帮助我。提前致谢


4653
2018-03-02 14:49


起源

也许这就是你要找的东西 stackoverflow.com/questions/12022675/decode-part-of-jpeg-file - exebook
我不太了解它,但也许对我没有帮助 - Kiradev
(看起来很简单)快速显示巨大Jpegs的方法是逐步加载它们并仅解码所需的部分。访问jpeg的常用方法是libjpeg,因此上面的链接讨论了如何使用libjpeg逐步获取jpeg文件的一部分而不对其进行整体解码。 - exebook
但是libjpeg是用C语言编写的。 Java中还有另外一个吗? - Kiradev
是的,您可以从Java调用C函数,如此处所述。 stackoverflow.com/questions/12260149/libjpeg-turbo-for-android - exebook


答案:


很抱歉回答一个旧问题,但我刚刚完成了一个图像视图,它显示了来自资产或外部存储的图像以及子采样,并在您捏放大时从图像中加载更高分辨率的图块。作为区域的高分辨率图像数据屏幕未加载,应避免内存不足异常。

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


9
2017-08-26 19:22



我刚刚使用了您的库并查看了它的源代码。你应该获得诺贝尔奖! - Dan Elkayam
适用于小屏幕(320x480),但大型屏幕崩溃(1280x800):(。我真的需要一个解决方案来加载大型图像,缩放和平移。叹息... - M. Usman Khan
@usman自从我写这篇文章以来,我做了一些修改来修复一些仍然可以抛出OOME的边缘情况。一些用户报告使用该视图在任何设备上显示大至20,000x20,000的图像。 - Dave Morrissey
@DaveMorrissey我一直在使用你的子采样imageview项目。我使用x,y坐标得到图像的像素值。 - Dinesh Kannan


我知道很久以前就问了这个问题,但这个答案可能会帮助其他人挣扎。我有完全相同的问题。你应该考虑使用 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例外。


3
2017-08-06 14:24