我試圖顯示在imageview上從onPreviewCallback收到的幀。首先,幀的方向與實時預覽不同,其次它看起來小於實際的實時預覽,這裏是我的代碼。預覽尺寸爲1024 x 768:onPreviewCallback幀比實際幀小
cameraConfigUtil.cameraInstance.setOneShotPreviewCallback(new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(byte[] originalData, Camera camera) {
Mat srcMat = new Mat(camera.getParameters().getPreviewSize().height, camera.getParameters().getPreviewSize().width, CvType.CV_8UC1);
srcMat.put(0, 0, originalData);
Bitmap bitmap = Bitmap.createBitmap(camera.getParameters().getPreviewSize().width, camera.getParameters().getPreviewSize().height, Bitmap.Config.ARGB_8888);
Utils.matToBitmap(srcMat, bitmap);
cameraPreviewImage.setVisibility(View.VISIBLE);
cameraPreviewImage.setImageBitmap(bitmap);
}
});
設置的攝像機參數:
if (!isCameraParametersSet) {
MIN_FRAME_WIDTH = 1024;
MIN_FRAME_HEIGHT = 768;
if (android.os.Build.VERSION.SDK_INT >= 14) {
setFocus(cameraParameters, false);
} else {
setFocus(cameraParameters, true);
}
WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = manager.getDefaultDisplay();
Point theScreenResolution = new Point();
theScreenResolution.set(display.getHeight(), display.getWidth());
SizePair picturePreviewSizePair = selectSizePair(cameraInstance, MIN_FRAME_WIDTH, MIN_FRAME_HEIGHT);
cameraParameters.setPreviewSize(picturePreviewSizePair.mPreview.getWidth(), picturePreviewSizePair.mPreview.getHeight());
cameraParameters.setPictureSize(picturePreviewSizePair.mPicture.getWidth(), picturePreviewSizePair.mPicture.getHeight());
getTargetPictureSize();
if (cameraParameters.getSupportedPictureFormats().contains(ImageFormat.JPEG)) {
cameraParameters.setPictureFormat(ImageFormat.JPEG);
}
cameraParameters.setWhiteBalance(Camera.Parameters.WHITE_BALANCE_AUTO);
isCameraParametersSet = true;
}
return cameraParameters;
這裏是我的解決代碼:
private static SizePair selectSizePair(Camera camera, int desiredWidth, int desiredHeight) {
List<SizePair> validPreviewSizes = generateValidPreviewSizeList(camera);
SizePair selectedPair = null;
int minDiff = Integer.MAX_VALUE;
for (SizePair sizePair : validPreviewSizes) {
Size size = sizePair.previewSize();
int diff = Math.abs(size.getWidth() - desiredWidth) +
Math.abs(size.getHeight() - desiredHeight);
if (diff < minDiff) {
selectedPair = sizePair;
minDiff = diff;
}
}
return selectedPair;
}
private static List<SizePair> generateValidPreviewSizeList(Camera camera) {
Camera.Parameters parameters = camera.getParameters();
List<android.hardware.Camera.Size> supportedPreviewSizes =
parameters.getSupportedPreviewSizes();
List<android.hardware.Camera.Size> supportedPictureSizes =
parameters.getSupportedPictureSizes();
List<SizePair> validPreviewSizes = new ArrayList<>();
for (android.hardware.Camera.Size previewSize : supportedPreviewSizes) {
float previewAspectRatio = (float) previewSize.width/(float) previewSize.height;
for (android.hardware.Camera.Size pictureSize : supportedPictureSizes) {
float pictureAspectRatio = (float) pictureSize.width/(float) pictureSize.height;
if (Math.abs(previewAspectRatio - pictureAspectRatio) < ASPECT_RATIO_TOLERANCE) {
validPreviewSizes.add(new SizePair(previewSize, pictureSize));
break;
}
}
}
如何設置此分辨率? – Vyacheslav
用代碼更新了我的問題 –