diff --git a/entry/src/main/cpp/camera_manager.cpp b/entry/src/main/cpp/camera_manager.cpp index 6a01822eff875746eaea07110cf89fd75344944f..180b6ef89c2a66341de1f941d2c796aad9bfebfd 100644 --- a/entry/src/main/cpp/camera_manager.cpp +++ b/entry/src/main/cpp/camera_manager.cpp @@ -16,11 +16,14 @@ #include "hilog/log.h" #include "camera_manager.h" +#undef LOG_TAG +#define LOG_TAG "Camera" + namespace OHOS_CAMERA_SAMPLE { std::mutex NDKCamera::mtx_; -NDKCamera::NDKCamera(char *str, uint32_t focusMode, uint32_t cameraDeviceIndex) - : previewSurfaceId_(str), cameras_(nullptr), focusMode_(focusMode), cameraDeviceIndex_(cameraDeviceIndex), +NDKCamera::NDKCamera(char *str, uint32_t focusMode, uint32_t cameraDeviceIndex, double ratioXC) + : ratioXC_(ratioXC), previewSurfaceId_(str), cameras_(nullptr), focusMode_(focusMode), cameraDeviceIndex_(cameraDeviceIndex), cameraOutputCapability_(nullptr), cameraInput_(nullptr), captureSession_(nullptr), size_(0), isCameraMuted_(nullptr), profile_(nullptr), photoSurfaceId_(nullptr), previewOutput_(nullptr), photoOutput_(nullptr), metaDataObjectType_(nullptr), metadataOutput_(nullptr), isExposureModeSupported_(false), @@ -352,9 +355,16 @@ Camera_ErrorCode NDKCamera::GetSupportedOutputCapability(void) { } Camera_ErrorCode NDKCamera::CreatePreviewOutput(void) { - cameraOutputCapability_->previewProfiles[0]->size.width = 640; - cameraOutputCapability_->previewProfiles[0]->size.height = 480; - profile_ = cameraOutputCapability_->previewProfiles[0]; + double ratioNow = 0; + for (int i = 0; ipreviewProfilesSize - 1; i++){ + double ratio = double(cameraOutputCapability_->previewProfiles[i]->size.width) / + cameraOutputCapability_->previewProfiles[i]->size.height; + if (abs(ratio - ratioXC_) <= abs(ratioNow - ratioXC_)) { + profile_ = cameraOutputCapability_->previewProfiles[i]; + ratioNow = ratio; + } + } + if (profile_ == nullptr) { OH_LOG_ERROR(LOG_APP, "Get previewProfiles failed."); return CAMERA_INVALID_ARGUMENT; @@ -368,7 +378,16 @@ Camera_ErrorCode NDKCamera::CreatePreviewOutput(void) { } Camera_ErrorCode NDKCamera::CreatePhotoOutput(char *photoSurfaceId) { - profile_ = cameraOutputCapability_->photoProfiles[0]; + double ratioNow = 0; + for (int i = 0; iphotoProfilesSize - 1; i++){ + double ratio = double(cameraOutputCapability_->photoProfiles[i]->size.width) / + cameraOutputCapability_->photoProfiles[i]->size.height; + if (abs(ratio - ratioXC_) <= abs(ratioNow - ratioXC_)) { + profile_ = cameraOutputCapability_->photoProfiles[i]; + ratioNow = ratio; + } + } + if (profile_ == nullptr) { OH_LOG_ERROR(LOG_APP, "Get photoProfiles failed."); return CAMERA_INVALID_ARGUMENT; @@ -385,9 +404,15 @@ Camera_ErrorCode NDKCamera::CreatePhotoOutput(char *photoSurfaceId) { } Camera_ErrorCode NDKCamera::CreateVideoOutput(char *videoId) { - cameraOutputCapability_->videoProfiles[0]->size.width = 640; - cameraOutputCapability_->videoProfiles[0]->size.height = 480; - videoProfile_ = cameraOutputCapability_->videoProfiles[0]; + double ratioNow = 0; + for (int i = 0; ivideoProfilesSize - 1; i++){ + double ratio = double(cameraOutputCapability_->videoProfiles[i]->size.width) / + cameraOutputCapability_->videoProfiles[i]->size.height; + if (abs(ratio - ratioXC_) <= abs(ratioNow - ratioXC_)) { + videoProfile_ = cameraOutputCapability_->videoProfiles[i]; + ratioNow = ratio; + } + } if (videoProfile_ == nullptr) { OH_LOG_ERROR(LOG_APP, "Get videoProfiles failed."); @@ -648,9 +673,16 @@ Camera_ErrorCode NDKCamera::IsFocusPoint(float x, float y) { } int32_t NDKCamera::GetVideoFrameWidth(void) { - cameraOutputCapability_->videoProfiles[0]->size.width = 640; - cameraOutputCapability_->videoProfiles[0]->size.height = 480; - videoProfile_ = cameraOutputCapability_->videoProfiles[0]; + double ratioNow = 0; + for (int i = 0; ivideoProfilesSize - 1; i++){ + double ratio = double(cameraOutputCapability_->videoProfiles[i]->size.width) / + cameraOutputCapability_->videoProfiles[i]->size.height; + if (abs(ratio - ratioXC_) <= abs(ratioNow - ratioXC_)) { + videoProfile_ = cameraOutputCapability_->videoProfiles[i]; + ratioNow = ratio; + } + } + if (videoProfile_ == nullptr) { OH_LOG_ERROR(LOG_APP, "Get videoProfiles failed."); return CAMERA_INVALID_ARGUMENT; @@ -659,9 +691,16 @@ int32_t NDKCamera::GetVideoFrameWidth(void) { } int32_t NDKCamera::GetVideoFrameHeight(void) { - cameraOutputCapability_->videoProfiles[0]->size.width = 640; - cameraOutputCapability_->videoProfiles[0]->size.height = 480; - videoProfile_ = cameraOutputCapability_->videoProfiles[0]; + double ratioNow = 0; + for (int i = 0; ivideoProfilesSize - 1; i++){ + double ratio = double(cameraOutputCapability_->videoProfiles[i]->size.width) / + cameraOutputCapability_->videoProfiles[i]->size.height; + if (abs(ratio - ratioXC_) <= abs(ratioNow - ratioXC_)) { + videoProfile_ = cameraOutputCapability_->videoProfiles[i]; + ratioNow = ratio; + } + } + if (videoProfile_ == nullptr) { OH_LOG_ERROR(LOG_APP, "Get videoProfiles failed."); return CAMERA_INVALID_ARGUMENT; diff --git a/entry/src/main/cpp/camera_manager.h b/entry/src/main/cpp/camera_manager.h index 39be7260f0ff297745b433e673eb6bc1da6ced42..902d1332d82f18373e755bf522a9dd82b681ba24 100644 --- a/entry/src/main/cpp/camera_manager.h +++ b/entry/src/main/cpp/camera_manager.h @@ -30,8 +30,9 @@ namespace OHOS_CAMERA_SAMPLE { class NDKCamera { public: ~NDKCamera(); - NDKCamera(char *str, uint32_t focusMode, uint32_t cameraDeviceIndex); + NDKCamera(char *str, uint32_t focusMode, uint32_t cameraDeviceIndex, double ratioXC); + double ratioXC_; Camera_ErrorCode CreateCameraInput(void); Camera_ErrorCode CameraInputOpen(void); Camera_ErrorCode CameraInputClose(void); diff --git a/entry/src/main/cpp/main.cpp b/entry/src/main/cpp/main.cpp index e54a883f0ce6cd1f174ca0bad4b32e271dac2ff1..20e0ee3f5b4c0f5b89b3a51acf14ddbc49c2f9d3 100644 --- a/entry/src/main/cpp/main.cpp +++ b/entry/src/main/cpp/main.cpp @@ -95,8 +95,8 @@ static napi_value IsVideoStabilizationModeSupported(napi_env env, napi_callback_ static napi_value InitCamera(napi_env env, napi_callback_info info) { OH_LOG_INFO(LOG_APP, "InitCamera Start"); - size_t argc = 3; - napi_value args[3] = {nullptr}; + size_t argc = 4; + napi_value args[4] = {nullptr}; napi_value result; size_t typeLen = 0; char *surfaceId = nullptr; @@ -115,6 +115,9 @@ static napi_value InitCamera(napi_env env, napi_callback_info info) { uint32_t cameraDeviceIndex; napi_get_value_uint32(env, args[ARGS_TWO], &cameraDeviceIndex); + + double ratioXC; + napi_get_value_double(env, args[3], &ratioXC); OH_LOG_INFO(LOG_APP, "InitCamera focusMode : %{public}d", focusMode); OH_LOG_INFO(LOG_APP, "InitCamera surfaceId : %{public}s", surfaceId); @@ -125,7 +128,7 @@ static napi_value InitCamera(napi_env env, napi_callback_info info) { delete ndkCamera_; ndkCamera_ = nullptr; } - ndkCamera_ = new NDKCamera(surfaceId, focusMode, cameraDeviceIndex); + ndkCamera_ = new NDKCamera(surfaceId, focusMode, cameraDeviceIndex, ratioXC); OH_LOG_INFO(LOG_APP, "InitCamera End"); napi_create_int32(env, argc, &result); return result; diff --git a/entry/src/main/cpp/types/libentry/Index.d.ts b/entry/src/main/cpp/types/libentry/Index.d.ts index 030701b0f1adcdae8ed4365509428292a2944d02..30e8e8eac8daa8b005e15c48dcfeeb2f76d6111e 100644 --- a/entry/src/main/cpp/types/libentry/Index.d.ts +++ b/entry/src/main/cpp/types/libentry/Index.d.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -export const initCamera:(surfaceId: string, focusMode: number, cameraDeviceIndex: number) => number; +export const initCamera: (surfaceId: string, focusMode: number, cameraDeviceIndex: number, ratio: number) => number; export const startPhotoOrVideo: (modeFlag: string, videoId: string, photoId: string) => number; export const videoOutputStart: () => number; export const setZoomRatio: (a: number) => number; diff --git a/entry/src/main/ets/pages/Index.ets b/entry/src/main/ets/pages/Index.ets index 23bfa07d1bae681d6ecbdf1134f794dc1e48af00..040713a1ef552039bfa01f4a1a8db850f4cbda7e 100644 --- a/entry/src/main/ets/pages/Index.ets +++ b/entry/src/main/ets/pages/Index.ets @@ -56,9 +56,10 @@ struct Index { @State xComponentHeight: number = 450; // Reference line. @State referenceLineBol: boolean = false; + @State onShow: boolean = false; @StorageLink('defaultAspectRatio') @Watch('initXComponentSize') defaultAspectRatio: number = Constants.MIN_ASPECT_RATIO; - @State onShow: boolean = false; + @StorageLink('ratioXC') ratioXC: number = 0.0; // Thumbnails @StorageLink('thumbnail') thumbnail: image.PixelMap | undefined | string = ''; // XComponentController. @@ -100,6 +101,11 @@ struct Index { DisplayCalculator.calcSurfaceDisplaySize(this.screenWidth, this.screenHeight, this.defaultAspectRatio); this.xComponentWidth = defaultSize.width; this.xComponentHeight = defaultSize.height; + if (defaultSize.width > defaultSize.height) { + this.ratioXC = defaultSize.width / defaultSize.height; + } else { + this.ratioXC = defaultSize.height / defaultSize.width; + } } async aboutToDisAppear() { @@ -149,7 +155,7 @@ struct Index { Logger.info(TAG, `onPageShow App`); if (this.surfaceId && this.onShow) { Logger.error(TAG, `initCamera start`); - cameraDemo.initCamera(this.surfaceId, this.settingDataObj.focusMode, this.cameraDeviceIndex); + cameraDemo.initCamera(this.surfaceId, this.settingDataObj.focusMode, this.cameraDeviceIndex, this.ratioXC); Logger.error(TAG, `initCamera end`); } this.getThumbnail(); @@ -170,7 +176,7 @@ struct Index { this.surfaceId = this.mXComponentController.getXComponentSurfaceId(); Logger.info(TAG, `onLoad surfaceId: ${this.surfaceId}`); Logger.info(TAG, `initCamera start`); - cameraDemo.initCamera(this.surfaceId, this.settingDataObj.focusMode, this.cameraDeviceIndex); + cameraDemo.initCamera(this.surfaceId, this.settingDataObj.focusMode, this.cameraDeviceIndex, this.ratioXC); Logger.info(TAG, `initCamera end`); }) .backgroundColor(Color.Black) diff --git a/entry/src/main/ets/views/ModeSwitchPage.ets b/entry/src/main/ets/views/ModeSwitchPage.ets index 29c614b3ff2d5ee98826f1096382fd179c4acf4f..4e085aee9315ae4a421ade50e92cef3adb43ba82 100644 --- a/entry/src/main/ets/views/ModeSwitchPage.ets +++ b/entry/src/main/ets/views/ModeSwitchPage.ets @@ -67,6 +67,7 @@ export struct ModeSwitchPage { @State modelBagCol: string = Constants.PHOTO; // Choose camera or capture @State @Watch('onChangeIsModeBol') isModeBol: boolean = true; + @StorageLink('ratioXC') ratioXC: number = 0.0; // Thumbnails @StorageLink('thumbnail') thumbnail: image.PixelMap | undefined | string = ''; private tag: string = 'sample modeSwitchPage:'; @@ -325,7 +326,7 @@ export struct ModeSwitchPage { .fontColor(Color.White) .onClick(() => { cameraDemo.releaseSession() - cameraDemo.initCamera(this.surfaceId, this.settingDataObj.focusMode, this.cameraDeviceIndex) + cameraDemo.initCamera(this.surfaceId, this.settingDataObj.focusMode, this.cameraDeviceIndex, this.ratioXC) this.modelBagCol = Constants.PHOTO }) }.position({ x: Constants.PHOTO_X_POSITION, y: Constants.Y_POSITION }) @@ -338,7 +339,7 @@ export struct ModeSwitchPage { .fontColor(Color.White) .onClick(() => { cameraDemo.releaseSession() - cameraDemo.initCamera(this.surfaceId, this.settingDataObj.focusMode, this.cameraDeviceIndex) + cameraDemo.initCamera(this.surfaceId, this.settingDataObj.focusMode, this.cameraDeviceIndex, this.ratioXC) this.modelBagCol = Constants.VIDEO }) }.position({ x: Constants.VIDEO_X_POSITION, y: Constants.Y_POSITION }) @@ -414,7 +415,7 @@ export struct ModeSwitchPage { // Clear configuration. cameraDemo.releaseSession(); // Start preview. - cameraDemo.initCamera(this.surfaceId, this.settingDataObj.focusMode, this.cameraDeviceIndex); + cameraDemo.initCamera(this.surfaceId, this.settingDataObj.focusMode, this.cameraDeviceIndex, this.ratioXC); }) } }.position({ x: Constants.SWITCH_X_POSITION, y: Constants.ICON_Y_POSITION })