uni-app中uni.createCameraContext相机组件,在华为mate中成像放大

发布于 1周前 作者 caililin 来自 Uni-App

uni-app中uni.createCameraContext相机组件,在华为mate中成像放大

产品分类

uniapp/小程序/微信

开发环境信息

项目 详情
PC开发环境操作系统 Windows
操作系统版本号 版本 23H2(OS 内部版本 22631.4602)
HBuilderX类型 正式
HBuilderX版本号 3.99
第三方开发者工具版本号 1.06.2308310
基础库版本号 3.7.3
项目创建方式 HBuilderX

示例代码

<template>
<view class="out-page">
<camera device-position="front" flash="off" @error="error" class="vid" v-if="vieShow">
</camera>
<cover-image src="../../static/front-camera.png" class="bj"></cover-image>
<cover-image src="../../static/camera-tips.png" class="bj-tit"></cover-image>
<view class="btn" v-if="vieShow">
<view>倒计时</view>
<view @click="takePhoto">拍照</view>
<view>翻转</view>
</view>  
</view>
<view class="blick-bj" v-else>  
    <view>加载中请稍后</view>  
</view>  

</view>
</template>

<script setup>
import {
ref,
onMounted
} from "vue";
let vieShow = ref(false)
let src = ref('')

onMounted(() => {  
    setTimeout(() => {  
        vieShow.value = true  
        console.log('初始化')  
    }, 1000)  
})  

let takePhoto = () => {  

    let ctx = uni.createCameraContext();  
    console.log('实例', ctx)  
    ctx.takePhoto({  
        quality: 'high',  
        success: (res) => {  
            console.log('画面信息', res)  
            let src = res.tempImagePath //获取到的画面信息  
            uni.navigateTo({  
                url: `/pages/lookPhoto/lookPhoto?src=${src}`  
            })  
        },  
        fail: (err) => {  
            console.log('出错了', err)  
        }  
    });  
}
</script>

<style lang="scss">
.out-page {
width: 100%;
height: 100vh;  

    .blick-bj {  
        width: 100%;  
        height: 100vh;  
        background-color: #000000;  
        color: #ffffff;  
        display: flex;  
        align-items: center;  
        justify-content: center;  
        font-size: 20px;  
        font-weight: bold;  
    }  

    .vid {  
        width: 100%;  
        // height: calc(100vh - 400rpx);  
        height: 300px;  
    }  

    .bj {  
        width: 100%;  
        height: calc(100vh - 400rpx);  
        position: fixed;  
        top: 0;  
        left: 0;  
    }  

    .bj-tit {  
        width: 300px;  
        height: 58px;  
        position: fixed;  
        top: 100px;  
        left: 50%;  
        transform: translateX(-50%);  
    }  

    .btn {  
        width: 100%;  
        height: 400rpx;  
        color: #ffffff;  
        background-color: #000000;  
        padding: 60rpx 0;  
        box-sizing: border-box;  
        position: fixed;  
        left: 0;  
        bottom: 0;  
        display: flex;  
        align-items: center;  
        justify-content: space-evenly;  
    }  
}
</style>

操作步骤

进入这个页面调起相机组件,它的成像其他手机没有问题,华为mate系列,成像就会很大,但是在成像页面熄屏再打开,成像就会正常。之后再重新进到这个页面,成像又是大的。

预期结果

成像正常

实际结果

成像过大

bug描述

uni.createCameraContext,为什么在华为mate微信小程序上,成像的大小不同? 其他手机调用这个是正常的,华为mate调用这个成像就会变大,但是熄屏重新打开成像又变成正常的了。


10 回复

是鸿蒙 5.0 吗,还是安卓系统?可能是鸿蒙微信的问题。测试了哪些设备,你同事的设备是否可以付现问题。


鸿蒙4.2.0版本的,目前华为mate系列的旗舰机好像好像都有这个问题,机型我这边没有这么多,同类型的小程序用这些机型都有这个问题

这边是我测试的源码,你们这边可以用mate机型尝试一下 <template> <view class="out-page"> <camera device-position=“front” flash=“off” @error=“error” class=“vid” v-if=“vieShow”> </camera> <cover-image src="../../static/front-camera.png" class="bj"></cover-image> <cover-image src="../../static/camera-tips.png" class="bj-tit"></cover-image> <view class="btn" v-if="vieShow"> <view>倒计时</view> <view @click=“takePhoto”>拍照</view> <view>翻转</view> </view>

<script setup> import { ref, onMounted } from "vue"; let vieShow = ref(false) let src = ref('')
</script>
<style lang="scss"> .out-page { width: 100%; height: 100vh;

你好,我测试了你提供的 demo,看着功能正常。你把这段代码改成原生小程序写法,测试 mate 是否正常,如果还是有问题,到微信开发者社区反馈一下。

在uni-app中使用uni.createCameraContext相机组件时,如果遇到在华为Mate系列手机中成像放大的问题,可能是由于相机的预览尺寸和画布尺寸不匹配导致的。为了解决这个问题,你可以通过调整相机的预览尺寸和画布尺寸来确保它们保持一致,从而避免成像放大或缩小的问题。

以下是一个示例代码,展示了如何在uni-app中设置相机的预览尺寸,并调整画布以适应预览尺寸,从而避免成像放大问题:

<template>
  <view class="container">
    <camera
      id="myCamera"
      device-position="back"
      flash="off"
      style="width: 100%; height: 100%;"
    ></camera>
    <canvas
      canvas-id="myCanvas"
      style="width: 100%; height: 100%;"
    ></canvas>
  </view>
</template>

<script>
export default {
  mounted() {
    this.initCamera();
  },
  methods: {
    initCamera() {
      const ctx = uni.createCameraContext();
      
      // 获取系统信息,包括屏幕宽度和高度
      uni.getSystemInfo({
        success: (res) => {
          const { windowWidth, windowHeight } = res;

          // 设置相机预览尺寸(这里以屏幕宽度和高度为例,可以根据需要调整)
          ctx.setCamera({
            position: 'back',
            flash: 'off',
            mode: 'normal',
            deviceOrientation: 'portrait',
            previewSize: `${windowWidth}x${windowHeight}`, // 预览尺寸
          });

          // 可以在这里添加拍照或录像的功能
          // ctx.takePhoto({...});
          // ctx.startRecord({...});
        },
      });

      // 监听相机帧数据,用于在画布上绘制预览画面(可选)
      ctx.onCameraFrame((frame) => {
        const { width, height, data } = frame.data;
        const ctxCanvas = uni.createCanvasContext('myCanvas');
        
        // 绘制预览画面到画布上(这里只是简单示例,可能需要根据实际情况调整绘制逻辑)
        const imageData = new Uint8ClampedArray(data);
        const canvasWidth = uni.createSelectorQuery().select('#myCanvas').boundingClientRect().width;
        const canvasHeight = uni.createSelectorQuery().select('#myCanvas').boundingClientRect().height;

        // 将图像数据绘制到画布上,注意调整宽高比
        ctxCanvas.putImageData(
          new ImageData(imageData, width, height),
          0,
          0,
          canvasWidth,
          canvasHeight
        );
        ctxCanvas.draw();
      });
    },
  },
};
</script>

<style>
.container {
  width: 100%;
  height: 100%;
}
</style>

在这个示例中,我们通过uni.getSystemInfo获取系统信息,并设置相机的预览尺寸为屏幕的宽度和高度。然后,我们使用onCameraFrame监听相机的帧数据,并在画布上绘制预览画面。注意,这里的绘制逻辑可能需要根据实际情况进行调整,以确保图像在画布上正确显示。

请注意,这个示例代码只是提供了一个基本的框架,你可能需要根据自己的需求进一步调整和优化。

回到顶部