旋转大尺寸位图的最快方法

10

我正在处理大尺寸的图片,当我尝试旋转它们(在位图上应用矩阵)时,会出现长时间等待几秒钟。

我看到 Android 系统相册可以以非常快的方式完成此任务。这是怎么做到的?

我想在 asyncTask 上执行旋转操作,在主线程上只应用 ImageView 旋转(这不需要很长时间),但如果在 asyncTask 结束之前应用程序被杀死,则应用程序会处于不一致状态。

这是我的位图旋转代码,对于大型位图需要长时间执行:

Matrix mat = new Matrix();
mat.setRotate(90);
bMap = Bitmap.createBitmap(bMap, 0, 0, bMap.getWidth(), bMap.getHeight(), mat, true);
1个回答

4
当对大型图像进行修改时,创建一个低质量的位图副本,并将其用于显示即时旋转或其他编辑效果。一旦用户停止运动(或离开滑块控件),则用相同效果应用于原始图像的原始图像替换低质量位图。这将显着提高用户体验。请尝试并告诉我。
这可能听起来与原始要求有所偏差 - 您可以绘制矩形而不是实时旋转整个图像。最终,用户需要的是他的图片旋转了多少的指示。这样会更快,并且可以轻松地在UI线程上完成而没有延迟。
这是画布上最简单的旋转代码。
canvas.save(); //save the position of the canvas
canvas.rotate(angle, X + (imageW / 2), Y + (imageH / 2)); //rotate the canvas
canvas.drawBitmap(imageBmp, X, Y, null); //draw the image on the rotated canvas
canvas.restore();  // restore the canvas position.

这是改善用户体验的好方法,当然。但主要问题是,当我最终在原始图像上工作时,任务可能需要很长时间才能完成,并且会出现以下问题:
  • 如果我在主线程上执行操作,用户必须等待
  • 如果我在异步任务上执行操作,在完成之前应用程序将被终止并且更改将丢失
- Joe Aspara
这可能听起来与原始要求有所偏差 - 你可以绘制一个矩形而不是实时旋转整个图像。最终用户需要的是他的图像旋转了多少的指示。这将更快速,并且可以在UI线程上轻松完成,没有延迟。 - Ron
好的,我明白了。为此,我需要知道您如何进行旋转。查看您的旋转代码可能会告诉我们一些信息... - Ron
我的原始答案仍然适用。您可以创建一个低质量的位图并在其上执行转换。跟踪所有转换,并在用户保存时对原始位图进行操作。 - Ron
好的,非常感谢您的帮助。我非常感激您的努力,也许重现系统画廊的行为并不那么简单。 - Joe Aspara
显示剩余5条评论

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