From 6da76a6c9bb4adab979b51a55e9ab4260e835e20 Mon Sep 17 00:00:00 2001 From: yxk2026 <10178404+yxk2026@user.noreply.gitee.com> Date: Sat, 9 Aug 2025 18:26:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8E=E7=BD=AE=E6=91=84=E5=83=8F=E5=A4=B4?= =?UTF-8?q?=E6=8B=8D=E6=91=84=E7=85=A7=E7=89=87=E4=B8=8D=E6=B8=85=E6=99=B0?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- entry/src/main/cpp/camera_manager.cpp | 69 +++++++++++++++----- entry/src/main/cpp/camera_manager.h | 3 +- entry/src/main/cpp/main.cpp | 9 ++- entry/src/main/cpp/types/libentry/Index.d.ts | 2 +- entry/src/main/ets/pages/Index.ets | 12 +++- entry/src/main/ets/views/ModeSwitchPage.ets | 7 +- 6 files changed, 76 insertions(+), 26 deletions(-) diff --git a/entry/src/main/cpp/camera_manager.cpp b/entry/src/main/cpp/camera_manager.cpp index 6a01822..180b6ef 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 39be726..902d133 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 e54a883..20e0ee3 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 030701b..30e8e8e 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 23bfa07..040713a 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 29c614b..4e085ae 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 }) -- Gitee