加速ImageView中的缩放功能

3

我目前正在处理一些无法调整大小或压缩的非常大的图片(7-10mb),出于多种原因。

现在,我的想法是在自定义的ImageView中显示它们,以便用户可以进行双击缩放、捏合缩放等操作。

我使用了这个库: https://github.com/MikeOrtiz/TouchImageView

我也试过其他库,但每一个都非常慢。有人能给我一些指针/建议,让它变得更快(甚至写自己的C++实现)吗?

对于所有的矩阵、flig和缩放方面,我有点迷茫,不知道我应该去哪里使它更快。如果你还知道其他更快的库(或如何使用自定义的Android实现,那效果真的很快),那就太好了。


它们的像素尺寸有多大?你能将它们上传到GLES纹理中吗? - fadden
抱歉,请问GLES纹理是什么?顺便说一下,它们的尺寸为3680x3288,大小为6.4MB,无法调整大小或缩放。 - Filnik
在大多数设备上,OpenGL-ES纹理的尺寸可以达到4096x4096,尽管一些低端设备可能限制在2048x2048。GLES可以处理缩放(以及旋转和其他你想要做的操作)。你的图像在磁盘上可能是6.4MB,但在内存中占用46MB(假设每个像素32位),因为它们在显示之前必须解压缩;在软件中处理这么多数据不会很快,所以最好让GPU来处理。 - fadden
我该如何让GPU来处理它? - Filnik
你需要学习一些OpenGL-ES,这需要一定的学习曲线。你可以在Grafika(https://github.com/google/grafika)中找到一些例子,例如“texture from camera”展示了实时相机输入的缩放和旋转。你需要使用glTexImage2D()将图像上传到纹理中,然后显示它,而不是从相机接收数据。你可以在TextureUploadActivity#runTextureTest()中看到一个例子(这是一个离屏基准测试);我认为这两个例子包含了你所需的所有要素。 - fadden
6个回答

5

尝试使用一个名为 openCV 的库,或在 Matlab 中使用它,然后将代码移植到 C/C++ 中进行图像增强。


这不仅仅是一个增强功能,因为它不是一个“一次性”的缩放.. 它是与手势等相关的整个缩放功能。 - Filnik

3

这个真的很好用,非常感谢! :) 真正我所需要的。 - Filnik

2
你可以尝试手动实现“mipmaps”——同一图像的不同尺寸,然后只使用最合适的图像进行显示...因此当缩小时,你会操作一个相对较小的图像(但仍会在放大时获得完整的大图像细节)。

但是即使使用完整的缩放图像,速度仍然会很慢,我是对的吗?它在图像上移动得很慢,不仅仅是缩放 :( - Filnik
True。我想你可以将图像分成较小的瓷砖,只需显示这些瓷砖(计算以对齐它们)... - Buddy

2
尝试使用名为PhotoView的库。与picasso一起使用时,我能够实现Onlick功能,使用户可以点击较小的图像,并在自定义视图上弹出完整的图像,包括缩放功能。这很容易实现。

谢谢,但这个太慢了。我一直收到以下提示:“跳过了82帧!应用程序可能在其主线程上执行太多的工作。”还有其他想法吗? :( - Filnik

2

实际上这似乎是个好主意。虽然我不明白为什么在浏览器上它非常快,但在 Webview 上仍然有点滞后(尽管比其他解决方案要好得多)。你有什么想法吗? - Filnik
抱歉,我不能说为什么它更慢。 - reden

0
在 TouchImageView.java 类中的 DoubleTapZoom 方法中,为 ZOOM_TIME 设置较低或较高的值。
private class DoubleTapZoom implements Runnable {
 ......
 private static final float ZOOM_TIME = 500 //(lower - faster)
 ......

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接