diff --git a/camera/src/main/java/com/cjt2325/cameralibrary/CameraInterface.java b/camera/src/main/java/com/cjt2325/cameralibrary/CameraInterface.java index 1a488f48da9ff81d8cf14dfc78f9b5488cb953f5..382feeb286c8f26b84d75f947c1f667884026b82 100644 --- a/camera/src/main/java/com/cjt2325/cameralibrary/CameraInterface.java +++ b/camera/src/main/java/com/cjt2325/cameralibrary/CameraInterface.java @@ -47,6 +47,7 @@ import ohos.sensor.listener.ICategoryMotionDataCallback; import java.io.File; import java.io.IOException; import java.util.List; +import java.util.Optional; /** * Camera Interface @@ -395,7 +396,12 @@ public class CameraInterface { LogUtil.error(TAG, "there is no camera"); return; } - changeCamera(SELECTED_CAMERA); + Optional surfaceOps = machine.getView().getSurfaceProvider().getSurfaceOps(); + SurfaceOps ops = null; + if (surfaceOps.isPresent()) { + ops = surfaceOps.get(); + } + changeCamera(SELECTED_CAMERA, ops); } catch (Exception var3) { if (this.mErrorListener != null) { @@ -408,9 +414,10 @@ public class CameraInterface { /** * 相机前后切换 * - * @param cameraTag int + * @param cameraTag int + * @param surfaceOps SurfaceOps */ - private void changeCamera(int cameraTag) { + private void changeCamera(int cameraTag, SurfaceOps surfaceOps) { String[] cameraIds = mCameraKit.getCameraIds(); if (cameraIds == null || cameraIds.length <= 0) { if (mErrorListener != null) { @@ -421,10 +428,57 @@ public class CameraInterface { } boolean isBack = cameraTag == CAMERA_BACK_POSITION; mCameraId = cameraIds.length > 1 && isBack ? cameraIds[0] : cameraIds[1]; + if (surfaceOps != null) { + int screenWidth = ScreenUtils.getScreenWidth(mCameraStateCallback.getMachine().getContext()); + int screenHeight = ScreenUtils.getScreenHeight(mCameraStateCallback.getMachine().getContext()); + Size size = getOptimalSize(mCameraKit, mCameraId, screenWidth, screenHeight); + if (size != null) { + surfaceOps.setFixedSize(size.width, size.height); + } + } mCameraKit.createCamera(mCameraId, mCameraStateCallback, mCameraHandler); LogUtil.error(LogUtil.DEFAULT_TAG, "open camera success"); } + /** + * getOptimalSize + * + * @param cameraKit CameraKit + * @param cameraId String + * @param screenWidth int + * @param screenHeight int + * @return Size + */ + private Size getOptimalSize(CameraKit cameraKit, String cameraId, int screenWidth, int screenHeight) { + List sizes = cameraKit.getCameraAbility(cameraId).getSupportedSizes(ImageFormat.YUV420_888); + final double ASPECT_TOLERANCE = 0.1; + //竖屏screenHeight/screenWidth 横屏 screenWidth/screenHeight + double targetRatio = (double) screenHeight / screenWidth; + Size optimalSize = null; + double minDiff = Double.MAX_VALUE; + int target = screenWidth; + for (Size size : sizes) { + double ratio = (double) size.width / size.height; + if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) { + continue; + } + if (Math.abs(size.height - target) < minDiff) { + optimalSize = size; + minDiff = Math.abs(size.height - target); + } + } + if (optimalSize == null) { + minDiff = Double.MAX_VALUE; + for (Size size : sizes) { + if (Math.abs(size.height - target) < minDiff) { + optimalSize = size; + minDiff = Math.abs(size.height - target); + } + } + } + return optimalSize; + } + /** * switch Camera * diff --git a/camera/src/main/java/com/cjt2325/cameralibrary/JCameraView.java b/camera/src/main/java/com/cjt2325/cameralibrary/JCameraView.java index 133cb81e6a174c21de9a90b054403dca7c4fb52a..4f04188f7ff03c18fbf3be07f0ea8e0fab20b875 100644 --- a/camera/src/main/java/com/cjt2325/cameralibrary/JCameraView.java +++ b/camera/src/main/java/com/cjt2325/cameralibrary/JCameraView.java @@ -604,11 +604,11 @@ public class JCameraView extends StackLayout @Override public void showPicture(PixelMap bitmap, boolean isVertical) { - if (isVertical) { - mPhoto.setScaleMode(Image.ScaleMode.STRETCH); - } else { - mPhoto.setScaleMode(Image.ScaleMode.ZOOM_CENTER); - } +// if (isVertical) { +// mPhoto.setScaleMode(Image.ScaleMode.STRETCH); +// } else { +// mPhoto.setScaleMode(Image.ScaleMode.ZOOM_CENTER); +// } mCaptureBitmap = bitmap; mPhoto.setPixelMap(bitmap); mPhoto.setVisibility(VISIBLE); diff --git a/camera/src/main/java/com/cjt2325/cameralibrary/listener/IImageArrivalListenerImpl.java b/camera/src/main/java/com/cjt2325/cameralibrary/listener/IImageArrivalListenerImpl.java index 5f280135747db6f5de4c8f3dc9e3872881206b5c..0032c864436f8dc15ef4dd24a2e02b36ae7e474e 100644 --- a/camera/src/main/java/com/cjt2325/cameralibrary/listener/IImageArrivalListenerImpl.java +++ b/camera/src/main/java/com/cjt2325/cameralibrary/listener/IImageArrivalListenerImpl.java @@ -19,6 +19,7 @@ import com.cjt2325.cameralibrary.JCameraView; import com.cjt2325.cameralibrary.state.CameraMachine; import com.cjt2325.cameralibrary.util.LogUtil; +import com.cjt2325.cameralibrary.util.ScreenUtils; import ohos.eventhandler.EventHandler; import ohos.eventhandler.EventRunner; import ohos.media.image.Image; @@ -26,6 +27,7 @@ import ohos.media.image.ImageReceiver; import ohos.media.image.ImageSource; import ohos.media.image.PixelMap; import ohos.media.image.common.ImageFormat; +import ohos.media.image.common.Size; /** * IImageArrivalListener Impl @@ -64,6 +66,34 @@ public class IImageArrivalListenerImpl implements ImageReceiver.IImageArrivalLis takePictureError("ImageReceiver ImageSource null"); return; } + + float maxWidth = ScreenUtils.getScreenWidth(mMachine.getContext()); + float maxHeight = ScreenUtils.getScreenHeight(mMachine.getContext()); + + Size size = source.getImageInfo().size; + int actualHeight = size.height; + int actualWidth = size.width; + float imgRatio = (float) actualWidth / actualHeight; + float maxRatio = maxWidth / maxHeight; + if (actualHeight > maxHeight || actualWidth > maxWidth) { + if (imgRatio < maxRatio) { + imgRatio = maxHeight / actualHeight; + actualWidth = (int) (imgRatio * actualWidth); + actualHeight = (int) maxHeight; + } else if (imgRatio > maxRatio) { + imgRatio = maxWidth / actualWidth; + actualHeight = (int) (imgRatio * actualHeight); + actualWidth = (int) maxWidth; + } else { + actualHeight = (int) maxHeight; + actualWidth = (int) maxWidth; + } + } + + ImageSource.DecodingOptions options = new ImageSource.DecodingOptions(); + options.sampleSize = calculateInSampleSize(size, actualWidth, actualHeight); + options.desiredSize = new Size(actualWidth, actualHeight); + PixelMap pixelMap = source.createPixelmap(null); if (pixelMap == null) { takePictureError("ImageReceiver pixelMap null"); @@ -78,6 +108,25 @@ public class IImageArrivalListenerImpl implements ImageReceiver.IImageArrivalLis }); } + /** + * @param size Size + * @param reqWidth int + * @param reqHeight int + * @return int + */ + private int calculateInSampleSize(Size size, int reqWidth, int reqHeight) { + int height = size.height; + int width = size.width; + int inSampleSize = 1; + + if (height > reqHeight || width > reqWidth) { + int halfHeight = height / 2; + for (int halfWidth = width / 2; halfHeight / inSampleSize >= reqHeight && halfWidth / inSampleSize >= reqWidth; inSampleSize *= 2) { + } + } + return inSampleSize; + } + private void takePictureError(String error) { LogUtil.error(LogUtil.DEFAULT_TAG, "takePictureError:" + error); new EventHandler(EventRunner.getMainEventRunner())