From b628e3d129050d073d9b0485c79915d85130315d Mon Sep 17 00:00:00 2001 From: gummie4444 Date: Mon, 7 Sep 2020 21:23:47 +0000 Subject: [PATCH] Attempt to increase the quality of android images --- CHANGELOG.md | 9 +++++++ .../io/flutter/plugins/camera/Camera.java | 25 +++++++++++++++++-- .../flutter/plugins/camera/CameraUtils.java | 13 ++++++++-- 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee84d9e..eb6f071 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +## 0.6.3 +Make quality of pictures in android better + +## 0.6.2 +Fix minor android bug that camera was crashing + +## 0.6.1 +Fix bug that was making builds on iOS fields + ## 0.6.0 Add flash, auto exposure, zoom and auto focus support for IOS and Android diff --git a/android/src/main/java/io/flutter/plugins/camera/Camera.java b/android/src/main/java/io/flutter/plugins/camera/Camera.java index 8c048af..58e1dc1 100644 --- a/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -1,6 +1,7 @@ package io.flutter.plugins.camera; import static android.view.OrientationEventListener.ORIENTATION_UNKNOWN; +import static io.flutter.plugins.camera.CameraUtils.computeBestCaptureSize; import static io.flutter.plugins.camera.CameraUtils.computeBestPreviewSize; import android.annotation.SuppressLint; @@ -176,8 +177,14 @@ public void onOrientationChanged(int i) { recordingProfile = CameraUtils.getBestAvailableCamcorderProfileForResolutionPreset(cameraName, preset); - captureSize = new Size(recordingProfile.videoFrameWidth, recordingProfile.videoFrameHeight); - previewSize = computeBestPreviewSize(cameraName, preset); + + + StreamConfigurationMap map = mCameraCharacteristics.get( + CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); + //TODO get the image best not the video + Size size = computeBestCaptureSize(map); + captureSize = size; // new Size(recordingProfile.videoFrameWidth, recordingProfile.videoFrameHeight); + previewSize = size; // computeBestPreviewSize(cameraName, preset); } private void setBestAERange(CameraCharacteristics characteristics) { @@ -232,6 +239,7 @@ private void preparePictureImageReader() { if (pictureImageReader != null) { pictureImageReader.close(); } + //TODO make sure this is the biggest image pictureImageReader = ImageReader.newInstance( captureSize.getWidth(), captureSize.getHeight(), ImageFormat.JPEG, 2); @@ -533,6 +541,9 @@ public void captureStillPicture(String filePath, @NonNull final Result result) { cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); captureBuilder.addTarget(pictureImageReader.getSurface()); + //try increasing the quality of the image + captureBuilder.set(CaptureRequest.JPEG_QUALITY, (byte)90); + captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, mPreviewRequestBuilder.get(CaptureRequest.CONTROL_AF_MODE)); @@ -566,6 +577,9 @@ public void captureStillPicture(String filePath, @NonNull final Result result) { captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getMediaOrientation()); + //TODOD should this be here + captureBuilder.set(CaptureRequest.SCALER_CROP_REGION, mPreviewRequestBuilder.get(CaptureRequest.SCALER_CROP_REGION)); + mCaptureSession.capture( captureBuilder.build(), new CameraCaptureSession.CaptureCallback() { @@ -652,6 +666,11 @@ public void onConfigured(@NonNull CameraCaptureSession session) { } mPreviewRequestBuilder.set( CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); + + //TODO set the request quality + mPreviewRequestBuilder.set( + CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); + mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), mCaptureCallback, null); @@ -890,6 +909,8 @@ public void resumeVideoRecording(@NonNull final Result result) { } public void startPreview() throws CameraAccessException { + if (pictureImageReader == null || pictureImageReader.getSurface() == null) return; + createCaptureSession(CameraDevice.TEMPLATE_PREVIEW, pictureImageReader.getSurface()); } diff --git a/android/src/main/java/io/flutter/plugins/camera/CameraUtils.java b/android/src/main/java/io/flutter/plugins/camera/CameraUtils.java index a7bb3b7..dd12d18 100644 --- a/android/src/main/java/io/flutter/plugins/camera/CameraUtils.java +++ b/android/src/main/java/io/flutter/plugins/camera/CameraUtils.java @@ -9,8 +9,9 @@ import android.hardware.camera2.CameraMetadata; import android.hardware.camera2.params.StreamConfigurationMap; import android.media.CamcorderProfile; +import android.util.Log; import android.util.Size; -import io.flutter.plugins.camera.Camera.ResolutionPreset; + import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -19,6 +20,8 @@ import java.util.List; import java.util.Map; +import io.flutter.plugins.camera.Camera.ResolutionPreset; + /** Provides various utilities for camera. */ public final class CameraUtils { @@ -36,11 +39,17 @@ static Size computeBestPreviewSize(String cameraName, ResolutionPreset preset) { static Size computeBestCaptureSize(StreamConfigurationMap streamConfigurationMap) { // For still image captures, we use the largest available size. + + Size[] outputSizes = streamConfigurationMap.getOutputSizes(ImageFormat.JPEG); + + //TODO think about aspect ratios return Collections.max( - Arrays.asList(streamConfigurationMap.getOutputSizes(ImageFormat.JPEG)), + Arrays.asList(outputSizes), new CompareSizesByArea()); } + + public static List> getAvailableCameras(Activity activity) throws CameraAccessException { CameraManager cameraManager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE);