我开始使用Camera2 Api而不是弃用的Camera Api,但我遇到了问题。 我用
设置了一个ImageReaderImageReader.newInstance(100, 130, ImageFormat.YUV_420_888, 2);
但是当我在onImageAvailable中记录图像尺寸时:
Image img = null;
img = imageReader.acquireLatestImage();
if(img != null){
Log.d("Dimen3", Integer.toString(img.getHeight()) + " " + img.getWidth());}
它说:
08-24 18:25:43.115 28363-28363/com.example.ale.camera2prova D/Dimen3: 144 176
为什么要更改尺寸?
答案 0 :(得分:0)
如果我正确理解您的问题,您就会问为什么不能为ImageReader图像使用任意尺寸。答案就是他们设计ImageReader的方式。 ImageReader可能正在选择最接近您请求大小的预定义大小。要避免这种情况,请从预定义列表中选择一个大小。我写了一个小例程,它获取大小列表并选择最小的一个等于或大于屏幕大小:
private Size selectImageSize() {
CameraCharacteristics cameraCharacteristics = null;
try {
cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId);
} catch (CameraAccessException e) {
return null;
}
StreamConfigurationMap streamConfigurationMap = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
if (streamConfigurationMap == null) {
return null;
}
jpegSizes = streamConfigurationMap.getOutputSizes(ImageFormat.JPEG);
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int screenLength = size.x;
if (screenLength < size.y) {
screenLength = size.y;
}
int index = 0;
int finalIndex = 0;
int finalJpegLength = Integer.MAX_VALUE;
for (Size jpegSize : jpegSizes) {
int jpegLength = jpegSize.getWidth();
if (jpegLength < jpegSize.getHeight()) {
jpegLength = jpegSize.getHeight();
}
if (jpegLength >= screenLength) {
if (jpegLength < finalJpegLength) {
finalJpegLength = jpegLength;
finalIndex = index;
}
}
index++;
}
Size returnSize = new Size(jpegSizes[finalIndex].getWidth(), jpegSizes[finalIndex].getHeight());
return returnSize;
}
我正在尝试获得等于或大于屏幕尺寸的最小图像尺寸,因为使用它可以提供最快的速度,同时提供将填满设备屏幕的图像。
答案 1 :(得分:0)
您只需在imageReader中设置手机支持的可用尺寸即可。你可以用这种方法知道它:
public static Size[] previewSizes;
public static Size[] videoSizes;
public static Size[] pictureSizes;
StreamConfigurationMap map = cameraCharacteristics.get( CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
previewSizes = map.getOutputSizes(SurfaceTexture.class);
videoSizes = map.getOutputSizes(MediaRecorder.class);
pictureSizes = map.getOutputSizes(ImageFormat.JPEG);
您可以在imageReader中设置pictureSizes调用的结果(同样,根据我们所讨论的ImageReader的格式,某些设备将支持YUV或JPEG格式的某些尺寸,但不支持RAW)。
此外,您无法配置特定尺寸的多个ImageReader,如果您在具有如此多模式的相机应用程序中工作,这应该是一个问题。您可以在下一个链接中阅读更多相关信息: https://developer.android.com/reference/android/hardware/camera2/CameraDevice.html
希望它能帮到你!