Android 有没有办法将矩阵转换为另一个比例?
假设我从一个1000像素x 1000像素的位图开始 我将其加载到一个Android 有没有办法将矩阵转换为另一个比例?,android,matrix,bitmap,android-canvas,Android,Matrix,Bitmap,Android Canvas,假设我从一个1000像素x 1000像素的位图开始 我将其加载到一个SurfaceViewresidentCanvas中,该视图以任意(并且取决于不同的设备)维度显示 我可以在运行时获取这些维度,并测量它们与原始维度之间的比例(如果我最后需要这些信息) 然后,我允许用户围绕显示的画布收缩/缩放/平移图像。一直以来,我都有一个矩阵,它跟踪并用于在显示的屏幕区域重新绘制图像 随后,该矩阵的值均适用于缩放空间(而不是原始1000x1000图形) 到目前为止,一切都很好——我已经做好了 然而,当一切都说
SurfaceView
residentCanvas
中,该视图以任意(并且取决于不同的设备)维度显示
我可以在运行时获取这些维度,并测量它们与原始维度之间的比例(如果我最后需要这些信息)
然后,我允许用户围绕显示的画布收缩/缩放/平移图像。一直以来,我都有一个矩阵
,它跟踪并用于在显示的屏幕区域重新绘制图像
随后,该矩阵的值均适用于缩放空间(而不是原始1000x1000图形)
到目前为止,一切都很好——我已经做好了
然而,当一切都说了又做了,我想把这个矩阵应用到原始位图并保存下来。但是,我不知道如何修改其所有内部值以将其应用回未缩放的原始(1000x1000)大小
好奇是否有一些自动神奇的方法来转换这些,或者我是否必须基于两个大小之间的比例将每个值应用到一个新的矩阵 来反转矩阵
矩阵{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;
与您的问题正交,但可能有用:我假设您正在使用Canvas#drawBitmap(位图、矩阵、绘画)
在SurfaceView
上绘制,然后在绘制临时位图时使用相同的方法,然后保存它out@pskink,但你看,这将导致所有的值都是错误的!假设用户将图像向右移动了50px(在屏幕上)-这将转换为X轴上的不同数量的正运动,这将是最终的艺术,因为50个屏幕像素比实际位图有一定比例(大或小)。因此,我需要将整个矩阵重新转换回原始尺寸(保留缩放用户生成的更改)我不确定您的意思,是否要将屏幕图像转换回原始尺寸(在这种情况下,y0u应用逆矩阵)或者,您是否希望获取原始图像并应用转换,使其看起来像屏幕图像,但位于不同的目的地??然后只需使用相同的matrixtryMatrix#mapRect
来查看1000x1000个rect将映射到哪里,然后您可以使用左
和顶部
字段来重传。我很想这实际上回答了我的问题,但我不确定它是否会。我的矩阵
适用于当前屏幕上的内容。我需要做的是将它转换回用户在屏幕上操作的位图的原始比例。因此,原始图像是X乘Y,在屏幕上,它以屏幕允许的任何尺寸显示,“矩阵”与这些屏幕尺寸相关。您的解决方案是否适用于此场景?如果适用,您是否愿意为矩阵变换列出实际语法?@GeniaS。如果您想知道图像上屏幕坐标的位置,则选择“是”。例如,如果您想要屏幕坐标的图像坐标,其中上/左(0,0)、上/右(199,0)、下/右(199399)和下/左(0299),然后将每个坐标(如第二个片段所示)乘以逆变换,您将获得每个角的图像坐标,这包括旋转、缩放和平移。您将需要访问当前转换(我没有使用android设备,因此无法帮助您编写代码),非常感谢。Android对于细节来说无关紧要。实际上,我需要显示的图像(无论其显示尺寸如何)映射回原始位图矩形,但保留应用于显示元素的旋转/平移/缩放。我必须确保Android中的Matrix类将其a、b、c、d等映射到您在解决方案中概述的数组,或者您可以确认它是否映射到了?