【问题标题】:Is there a way to translate a matrix to an alternate scale?有没有办法将矩阵转换为替代比例?
【发布时间】:2016-05-07 19:51:19
【问题描述】:

假设我从一个 1000px x 1000px 的位图开始

我将其加载到SurfaceView 常驻Canvas 中,该Canvas 以任意尺寸(并且取决于设备不同)显示。

我可以在运行时获取这些尺寸并测量它们与原始尺寸之间的比例(如果我最后需要该信息)。

然后我允许用户在显示的画布周围捏合/缩放/翻译图像。一直以来,我都有一个 Matrix 来跟踪并用于在其显示的屏幕区域中重新绘制图像。

随后,此Matrix 的值都适用于缩放后的空间(而不是原始的 1000x1000 图形)。

到目前为止一切顺利 - 我已经完成了所有这些工作。

但是,当一切都说完了,我想将此矩阵应用于原始位图并将其保存出来。但是,我不知道如何修改其所有内部值以将其应用回未缩放的原始 (1000x1000) 大小。

很好奇是否有某种自动神奇的方式来翻译这些,或者我是否必须以某种方式根据两种尺寸之间的比例将每个值应用回一个新的矩阵。

【问题讨论】:

  • 与您的问题正交,但可能有用:android-developers.blogspot.com/2013/09/…
  • 我假设你正在使用Canvas#drawBitmap(Bitmap, Matrix, Paint) 在你的SurfaceView 上绘图,然后在临时Bitmap 上绘图时使用相同的方法,然后将其保存
  • @pskink,我是,但你看 - 这将导致所有值都是错误的!假设用户将图像向右移动了 50 像素(在屏幕上)——这在最终的艺术作品中转化为 X 轴上一些不同数量的正向运动,因为 50 个屏幕像素是一定比例的(更大或更小) 比实际的位图。因此我需要将整个矩阵重新翻译回原始尺寸(保留缩放的用户产生的更改)
  • 我不知道你的意思,你想获取屏幕图像并将其转换回原始图像(在这种情况下你应用逆矩阵)还是你想获取原始图像并应用转换,使其看起来像屏幕图像但在不同的目的地?然后只需使用相同的矩阵
  • 尝试 Matrix#mapRect 看看你的 1000x1000 矩形将被映射到哪里,然后你可以使用 lefttop 字段重新翻译

标签: android matrix bitmap android-canvas


【解决方案1】:

反转矩阵

matrix{ a,b,c,d,e,f } 逆矩阵为 { ia, ib, ic, id, ie, if }

    var cross =  a * d - b * c;
    ia = d / cross;
    ib = -b / cross;
    ic = -c / cross;
    id = a / cross;
    ie = (c * f - d * e) / cross;
    if = -(a * f - b * e) / cross;

逆向变换,原来从图像坐标到屏幕坐标,逆矩阵将屏幕坐标转换到图像坐标。

如果您在屏幕上有一个变换,并且您想知道图像上屏幕左上角的位置。获取逆变换并将其应用于屏幕左上角坐标 (0,0)。

scrX = ?
scrY = ?
imageX = scrX  * ia + scrY * ic + ie;
imageY = scrX  * ib + scrY * id + if;

【讨论】:

  • 我很想这实际上回答了我的问题,但我不确定它是否确实如此。我的Matrix 适用于当前屏幕上的内容。我需要做的是将它转换回用户在屏幕上操作的位图的原始比例。因此,原始图像是 X 乘 Y 并且在屏幕上以屏幕允许的任何尺寸出现,并且“矩阵”相对于这些屏幕尺寸。您的解决方案是否适用于这种情况?如果适用,您能否介绍一下矩阵转换的实际语法?
  • @GeniaS。如果您想在图像上的哪个位置显示屏幕坐标,则可以。例如,如果您想要屏幕坐标的图像坐标,其中顶部/左侧 (0,0)、顶部/右侧 (199,0)、底部/右侧 (199,399) 和底部/左侧 (0,299),然后将每个坐标相乘(作为第二个 sn-p 显示)通过逆变换,您将获得每个角的图像坐标,其中包括旋转、缩放和平移。您将需要访问当前的转换(我没有使用过安卓设备,所以无法帮助您编写代码)
  • 非常感谢。 Android 对细节无关紧要。实际上,我需要将显示的图像(无论其显示尺寸如何)映射回原始位图矩形,但保留应用于显示元素的旋转/平移/缩放。我必须确保 Android 中的 Matrix 类将其 a、b、c、d 等映射到您在解决方案中概述的数组 - 或者您能否确认它确实如此?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
  • 2022-08-12
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
相关资源
最近更新 更多