从自定义视图缩放形状坐标以适应不同的屏幕尺寸
scale shape coordinates from custom view to adapt different screen sizes
我正在开发一个应用程序,使用相机预览实时检测物体,然后拍照并将其显示在另一个 activity 和一个边界框(大多数情况下是多边形)在检测到的对象上绘制。
我设法做到了,一切正常。现在,我试图通过设置较小的相机预览尺寸并通过更改相机参数拍摄具有更大分辨率的照片来加快检测过程。但我将获得的坐标必须缩放以匹配大图片尺寸。
就我而言:
- 相机预览尺寸始终为:640x480(坐标匹配此尺寸)
- 将使用已接受答案here中提到的方法选择照片尺寸。
- 在大多数情况下,图片尺寸会很大(在我的 phone 中是 4260x3120),我正在调整 canvas 的尺寸以使其适合屏幕
对于 canvas 大小,我使用它来获取屏幕分辨率:
public static int getScreenWidth() {
return Resources.getSystem().getDisplayMetrics().widthPixels;
}
public static int getScreenHeight() {
return Resources.getSystem().getDisplayMetrics().heightPixels;
}
我的 xml 文件如下所示:
<LinearLayout>
....
<android.support.v7.widget.Toolbar
....
</android.support.v7.widget.Toolbar>
....
<FrameLayout
android:id="@android:id/content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_marginBottom="16dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginTop="16dp">
<packagename.CropImageView
android:id="@+id/scannedImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:adjustViewBounds="true"
android:src="@mipmap/ic_launcher_round" />
</FrameLayout>
</LinearLayout>
在我的自定义视图中 class CropImageView 我将四个坐标传递给 onDraw 方法并绘图 他们之间的路径。
注意 :我看到了几个关于大致相同主题的问题,但我无法与它们联系起来,因为我无法使用像我这样的用例。非常感谢任何信息,帮助。
我需要做的就是在下面找到 Y
和 X
的比例因子:
scaleFactorY = (float) newWidth / oldWidth;
scaleFactorX = (float) newHeight / oldHeight;
然后将坐标乘以这些因数。此外,您还需要确保 preview size
、picture size
和将容纳图片的 container
具有相同的宽高比,否则您将得到错位的坐标。
要获得所需的纵横比,只需执行以下操作:width / height
。
我正在开发一个应用程序,使用相机预览实时检测物体,然后拍照并将其显示在另一个 activity 和一个边界框(大多数情况下是多边形)在检测到的对象上绘制。
我设法做到了,一切正常。现在,我试图通过设置较小的相机预览尺寸并通过更改相机参数拍摄具有更大分辨率的照片来加快检测过程。但我将获得的坐标必须缩放以匹配大图片尺寸。
就我而言:
- 相机预览尺寸始终为:640x480(坐标匹配此尺寸)
- 将使用已接受答案here中提到的方法选择照片尺寸。
- 在大多数情况下,图片尺寸会很大(在我的 phone 中是 4260x3120),我正在调整 canvas 的尺寸以使其适合屏幕
对于 canvas 大小,我使用它来获取屏幕分辨率:
public static int getScreenWidth() {
return Resources.getSystem().getDisplayMetrics().widthPixels;
}
public static int getScreenHeight() {
return Resources.getSystem().getDisplayMetrics().heightPixels;
}
我的 xml 文件如下所示:
<LinearLayout>
....
<android.support.v7.widget.Toolbar
....
</android.support.v7.widget.Toolbar>
....
<FrameLayout
android:id="@android:id/content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_marginBottom="16dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginTop="16dp">
<packagename.CropImageView
android:id="@+id/scannedImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:adjustViewBounds="true"
android:src="@mipmap/ic_launcher_round" />
</FrameLayout>
</LinearLayout>
在我的自定义视图中 class CropImageView 我将四个坐标传递给 onDraw 方法并绘图 他们之间的路径。
注意 :我看到了几个关于大致相同主题的问题,但我无法与它们联系起来,因为我无法使用像我这样的用例。非常感谢任何信息,帮助。
我需要做的就是在下面找到 Y
和 X
的比例因子:
scaleFactorY = (float) newWidth / oldWidth;
scaleFactorX = (float) newHeight / oldHeight;
然后将坐标乘以这些因数。此外,您还需要确保 preview size
、picture size
和将容纳图片的 container
具有相同的宽高比,否则您将得到错位的坐标。
要获得所需的纵横比,只需执行以下操作:width / height
。