【问题标题】:Speed up zoom feature in ImageView加快 ImageView 中的缩放功能
【发布时间】:2015-08-21 13:57:54
【问题描述】:

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

现在,我们的想法是在自定义 ImageView 中显示它们,使用户能够执行双击缩放、捏缩放等操作。

我使用这个库来完成这项工作:https://github.com/MikeOrtiz/TouchImageView

我也尝试过其他库,但其他所有库仍然很慢。有人可以给我一些指示/建议以使其更快(甚至编写我自己的 C++ 实现)吗?

我对所有这些“Matrix”、“flig”、“scale”的东西有点迷茫,我不知道应该触摸什么来让它更快。如果您还知道其他更快的库(或者如何使用自定义的 Android 实现,它的运行速度非常快),那就太好了。

【问题讨论】:

  • 它们的像素大小有多大?你能把它们上传到 GLES 纹理吗?
  • 抱歉,什么是 GLES 纹理?顺便说一句,它们是 3680x3288、6.4MB,不能调整大小或缩放。
  • 在大多数设备上,OpenGL-ES 纹理最高可达 4096x4096,但一些低端设备可能会限制为 2048x2048。 GLES 可以处理缩放(和旋转,以及您可能想做的任何其他事情)。您的图像在磁盘上可能是 6.4MB,但它们在内存中是 46MB(假设每像素 32 位),因为它们必须在显示之前解压缩;在软件中处理这么多数据不会很快,所以最好让 GPU 来做。
  • 我该怎么做才能让 GPU 来处理它?
  • 你需要学习一点 OpenGL-ES,它带有一点学习曲线。您可以在 Grafika (github.com/google/grafika) 中找到一些示例,例如“来自相机的纹理”显示实时相机输入的缩放和旋转。您需要使用glTexImage2D() 将图像上传到纹理然后显示它,而不是从相机接收数据。你可以在TextureUploadActivity#runTextureTest() 中看到一个例子(这是一个离屏基准);在这两个示例之间,我认为您拥有所需的所有部分。

标签: android c++ image-scaling zooming


【解决方案1】:

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

【讨论】:

  • 它不仅是增强功能,因为它不是“一次性”缩放。它是与手势等相关的整个缩放功能。
【解决方案2】:

您是否尝试过使用 Ion 库的 DeepZoom 功能?

https://github.com/koush/ion

https://www.youtube.com/watch?v=yIMltNEAKZY

如果你不想用opengl,或者上面的库不起作用,你也可以试试http://developer.android.com/reference/android/graphics/BitmapRegionDecoder.html这个类。也就是说,跟踪用户的“位置”(视口和缩放级别)并从主线程中解码该区域,每次用户更改输入时将其推送到画布中。

【讨论】:

  • 这很有魅力,真的谢谢你! :) 正是我需要的
【解决方案3】:

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

【讨论】:

  • 但是全缩放图像仍然会很慢,对吗?在图像上移动也很慢,不仅是缩放:(
  • 是的。我想您可以将图像拆分为较小的图块并仅显示这些图块(进行数学运算以将它们排列起来)...
【解决方案4】:

试试名为PhotoView 的库。当与picasso 一起使用时,我能够实现 Onlick 功能,使用户能够单击较小的图像并让它在具有缩放功能的自定义视图上弹出完整的图像。它真的很容易实现

【讨论】:

  • 谢谢,但这也太慢了。我不断收到:“跳过 82 帧!应用程序可能在其主线程上做太多工作。”还有什么想法吗? :(
【解决方案5】:

解决此问题的一种方法是使用 WebView,它支持平移、捏合缩放等。不过我认为图像质量可能是个问题。

android-local-image-in-webview

android-add-image-to-webview-from-a-drawable

等等。 您还可以动态生成和加载html

【讨论】:

  • 其实这似乎是个好主意。虽然我无法理解为什么在浏览器上它只是超级快而在 webview 上它仍然有点滞后(虽然比其他解决方案好很多)。有什么想法吗?
  • 抱歉,不,不能说为什么会慢。
【解决方案6】:

在 TouchImageView.java 类 DoubleTapZoom 中为 ZOOM_TIME 设置一个较低或较高的值

private class DoubleTapZoom implements Runnable {
 ......
 private static final float ZOOM_TIME = 500 //(lower - faster)
 ......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    相关资源
    最近更新 更多