Android Java: Camera2 预览图像被拉伸
Android Java: Camera2 preview image is stretched
我目前正在使用 camera2 API 制作我的 android 应用。我能够制作图像、保存图像、编辑图像等等。但是我的相机总是拉长。
我使用的是 Samsung Galaxy Tab A 和 Samsung Galaxy Note 8,所以不是 16:9 比例。
首先,我只在风景模式下拍照。
我的 textureView 和我的显示器尺寸完全一样。我的预览应该更好,因为我也使用它的大小来保存图像。但是,如果将它设置为与我的显示器相同的尺寸,我也会得到拉伸的图像。
//getting the ratio, correct setting of sizes
if (verh == sechzehnzuneun) {
newSize = new Size(2300, 1350);
} else if (verh == sechzehnzuzehn) {
newSize = new Size(2400, 1500);
} else if (verh == note8) {
newSize = new Size(2792, 1440);
}
//also used for saving
_imageDimension = newSize;
//used for rotating the preview, otherwise i geht some strange portrait camera
Matrix matrix = new Matrix();
int rotation = getWindowManager().getDefaultDisplay().getRotation();
RectF textureRectF = new RectF(0, 0, _textureView.getWidth(), _textureView.getHeight());
RectF previewRectF = new RectF(0, 0, _imageDimension.getHeight(), _imageDimension.getWidth());
float centerX = textureRectF.centerX();
float centerY = textureRectF.centerY();
if (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) {
previewRectF.offset(centerX - previewRectF.centerX(),
centerY - previewRectF.centerY());
matrix.setRectToRect(textureRectF, previewRectF, Matrix.ScaleToFit.FILL);
float scale = Math.max((float) width / _imageDimension.getWidth(),
(float) height / _imageDimension.getHeight());
matrix.postScale(scale, scale, centerX, centerY);
matrix.postRotate(90 * (rotation - 2), centerX, centerY);
} else {
//neu weg wenn nicht
previewRectF.offset(centerX - previewRectF.centerX(), centerY - previewRectF.centerY());
matrix.setRectToRect(textureRectF, previewRectF, Matrix.ScaleToFit.FILL);
float scale = Math.max((float)height / _imageDimension.getHeight(), (float)width / _imageDimension.getWidth());
matrix.postScale(scale, scale,centerX,centerY);
matrix.postRotate(0, centerX, centerY);
}
_textureView.setTransform(matrix);
我正在获取上层代码的 if case。
但是你看(只是竖着看,没有方向变化,一直是水平的)
横向看
您看过 Google 的示例 camera2 应用程序中的 AutoFitTextureView 了吗?
不能特别保证相机设备完全支持设备的显示尺寸,如果不支持,则会选择接近请求尺寸的尺寸。但这可能不会有相同的纵横比。
您需要选择相机设备实际支持的尺寸,然后将您的 TextureView 设置为匹配的纵横比。
我目前正在使用 camera2 API 制作我的 android 应用。我能够制作图像、保存图像、编辑图像等等。但是我的相机总是拉长。
我使用的是 Samsung Galaxy Tab A 和 Samsung Galaxy Note 8,所以不是 16:9 比例。
首先,我只在风景模式下拍照。
我的 textureView 和我的显示器尺寸完全一样。我的预览应该更好,因为我也使用它的大小来保存图像。但是,如果将它设置为与我的显示器相同的尺寸,我也会得到拉伸的图像。
//getting the ratio, correct setting of sizes
if (verh == sechzehnzuneun) {
newSize = new Size(2300, 1350);
} else if (verh == sechzehnzuzehn) {
newSize = new Size(2400, 1500);
} else if (verh == note8) {
newSize = new Size(2792, 1440);
}
//also used for saving
_imageDimension = newSize;
//used for rotating the preview, otherwise i geht some strange portrait camera
Matrix matrix = new Matrix();
int rotation = getWindowManager().getDefaultDisplay().getRotation();
RectF textureRectF = new RectF(0, 0, _textureView.getWidth(), _textureView.getHeight());
RectF previewRectF = new RectF(0, 0, _imageDimension.getHeight(), _imageDimension.getWidth());
float centerX = textureRectF.centerX();
float centerY = textureRectF.centerY();
if (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) {
previewRectF.offset(centerX - previewRectF.centerX(),
centerY - previewRectF.centerY());
matrix.setRectToRect(textureRectF, previewRectF, Matrix.ScaleToFit.FILL);
float scale = Math.max((float) width / _imageDimension.getWidth(),
(float) height / _imageDimension.getHeight());
matrix.postScale(scale, scale, centerX, centerY);
matrix.postRotate(90 * (rotation - 2), centerX, centerY);
} else {
//neu weg wenn nicht
previewRectF.offset(centerX - previewRectF.centerX(), centerY - previewRectF.centerY());
matrix.setRectToRect(textureRectF, previewRectF, Matrix.ScaleToFit.FILL);
float scale = Math.max((float)height / _imageDimension.getHeight(), (float)width / _imageDimension.getWidth());
matrix.postScale(scale, scale,centerX,centerY);
matrix.postRotate(0, centerX, centerY);
}
_textureView.setTransform(matrix);
我正在获取上层代码的 if case。
但是你看(只是竖着看,没有方向变化,一直是水平的)
横向看
您看过 Google 的示例 camera2 应用程序中的 AutoFitTextureView 了吗?
不能特别保证相机设备完全支持设备的显示尺寸,如果不支持,则会选择接近请求尺寸的尺寸。但这可能不会有相同的纵横比。
您需要选择相机设备实际支持的尺寸,然后将您的 TextureView 设置为匹配的纵横比。