更新记录

6.1.5(2026-09-30)

Android端:

  • 修正视频水印 OpenGL 坐标缩放,避免宽高被放大约 2 倍。
  • 统一照片、视频水印的等比缩放和 FILL_CENTER 裁剪映射。
  • 修正照片 EXIF、传感器旋转、前置镜像处理,避免竖拍照片保存为横屏或被重复旋转。
  • 方向判断改为依据 PreviewView 实际宽高,兼容横屏自然方向平板设备。
  • 修正水印 Bitmap 在照片方向不一致时的旋转和资源释放。
  • isNeedRecordModule=0 时不申请录音权限、不启用音频轨道;为 1 时保留有声录像校验。
  • 补强录像失败、生命周期恢复和临时文件处理。
  • 优化焦距

6.1.2(2026-09-20)

修复Android端鸿蒙机型拍照后宽度拉伸问题

6.1.1(2026-09-14)

android端:

  • 优化焦距问题; ios端:
  • 修复手动停止与最大时长触发的重复完成回调,避免重复导出、重复保存和重复前端事件。
  • 修复 isSave2Album == NO 时仍请求相册权限、仍写入相册的问题。
  • 沙盒拍照不再强制要求相册权限。
  • 修复删除第一个历史录像时的 -1 下标崩溃。
  • 录像开始时预生成水印快照,降低短视频无水印概率。
  • 修复日期格式 YYYY 导致跨年显示错误,改为 yyyy。
  • 增加录制结束防重入保护。
查看更多

平台兼容性

Android Android CPU类型 iOS
适用版本区间:6.0 - 12.0 armeabi-v7a:未测试,arm64-v8a:未测试,x86:未测试 适用版本区间:11 - 16

原生插件通用使用流程:

  1. 购买插件,选择该插件绑定的项目。
  2. 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
  3. 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
  4. 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
  5. 开发完毕后正式云打包

付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios

注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择


water-mark-camera

本插件由上海栾青网络科技有限公司出品,是一款功能强大的自定义相机插件,将根据开发者需求和建议长久持续维护,可以高度自定义相机界面;丰富的API功能(拍照、录像、切换摄像头、闪光灯控制、文字水印、图片水印、标签水印等多种水印配置、自动对焦、手动对焦、镜头缩放功能),详情可参阅示例工程。如有未满足的功能亦可联系我们进行功能升级优化、功能定制开发

可官网联系添加作者索取 体验apk

【体验apk下载】点击链接下载

在自定义相机这块我们还有多个历史版本

最新 Android+IOS+纯血鸿蒙系统的UTS标准组件 | Android+IOS的增强版插件 | Android+IOS的基础版插件 | Android低版本系统专用 | UTS兼容版插件 |

如果水印要求比较低可以使用基础版插件,价格更优惠。

2025.12.15 大版本更新

全面升级Android端插件使用的Camera版本到CameraX,实现自动横竖屏切换,图片水印、视频水印性能极大提升,并且更加稳定

特色和优势

1、支持vue2、vue3

2、全市场唯一可以实现动态视频水印的功能,所有水印均可设置为动态显示,能够实现动态时间水印,可适用于监控录制、会议记录等需要实时时间日期的场景要求

3、更加自由灵动的水印配置,可添加多个图片logo水印(可设置边框、圆角、位置等风格样式),可自由配置文字水印内容、字号、字体颜色、边框、单行背景、圆角、位置、图标等等风格

4、功能强大,集合了拍照、录像于一体,原生代码高性能运行,可设置存储到相册/沙盒

5、使用简单,插件主页点击试用即可将插件加入项目中,然后通过打自定义基座运行即可进行插件的测验,或者直接找作者索取包含自定义基座的demo项目(因uni插件市场不运行上传包含基座的示例)

6、价格实惠,在本插件进入uni插件市场之前,原生自定义相机插件价格昂贵,高达上千元;本插件上架插件市场后,将价格打压下来,并通过基础版、增强版两个核心版本来满足不同价位需求。

极简模式在页面使用插件 (示例页面:/pages/index/camera/camera2)

    <water-mark-camera
        ref="cameraObj" 
        @onTakePhotoSuccess="onTakePhotoSuccess" // 拍照成功回调(可以获得照片路径)
        @onRecordSuccess="onRecordSuccess" // 录像成功回调(可以获得视频路径)
        @onReceiveInfo="onReceiveInfo"  // 日志信息回调
        >
    </water-mark-camera>

插件使用注意事项

插件主页点击【试用】或直接购买,之后会让您选择项目并绑定包名,这样项目中就有插件的配置了,然后需要云打包或打包自定义基座,运行自定义基座来测验功能,或者打包发布

manifest.json 中 App常用其他设置 minSdkVersion设置为23或以上

(注意:原生插件必须要在nvue的页面,nvue和vue基本功能一直,只是存在一些差异,比如css的用法等)

调用开放的API接口(拍照、录像、闪光灯开关、前后摄像头镜像切换、水印logo设置),插件本身为满足用户的不同UI设计,仅提供预览+开放API,不在原生界面上添加多余UI。

插件实现高度自由的界面自定义,用户可自行在预览界面上叠加放置其他按钮或文字(具体可参照demo项目),使用cover-view , cover-image(具体可在uniapp官网查看这两个标签的说明)覆盖到原生插件上。

插播广告 ...

本司提供了一些API服务轻语API,包含二维码在线生成/地理编码解析/文字生成语音/语言转文字/获取美图壁纸/企业工商信息查询/等等
本司官网上海栾青网络科技有限公司

API 请求方法简要说明

插件方法 说明 默认值 是否必须
takePhoto() 执行拍照 无 非
startRecord() 开始录像 无 非
stopRecord() 停止录像 无 非
openFront() 打开前置摄像头 无 非
openBack() 打开后置摄像头 无 非
openFlash() 打开闪光灯,传参详见下方 无 非
closeFlash() 关闭闪光灯 无 非
setTextWaterMark({}) 文本水印配置 无 非
setImageWaterMark([]) 图片水印配置 无 非
setTagWaterMark([]) 下一版本预告功能:标签水印配置 无 非
addOrientationListener(func) function(res)=>{},监听屏幕方向 无 非
setZoomLevel() 设置缩放,最小值1 无 非
getZoomLevel 获取当前缩放值 无 非

请求方法参数说明

方法名 参数类型 参数说明
openFlash string on/auto/torch 闪光灯:开/自动/手电筒(手电筒常亮模式可能有些机型不适应)
setTextWaterMark object 内容较多详见下方 #文字水印配置参数#
setImageWaterMark list 内容较多详见下方 #图片水印配置参数#
addOrientationListener function 回调函数,{"orientation": "Vertical"} Landscape 横屏 / Vertical 竖屏,示例见下方 #获取横竖屏回调监听#
setZoomLevel Number 缩放值

API 参数简要说明

插件参数 说明 默认值 是否必须
defaultCamera 初始化的默认摄像头,'0'后置 '1'前置,默认后置 '0' 非
isSave2Album 是否保存到相册,"0"否(存入沙盒) "1"是(存入相册),默认保存到相册 "1" 非
isAutoRotate 是否自动根据陀螺仪旋转水印,"0"否 "1"是 "1" 非
isAbleLandscape 横屏拍照是否自动校正到正向,"0"否 "1"是,默认是 "1" 非
bitRate Android端 比特率倍数,默认10,值越大视频越清晰,文件也越大,反之同理 10 非
frameRate Android端 帧率,默认30,亦即每秒钟处理30帧,帧率越高越清晰,文件越大 30 非
iframeInterval Android端 关键帧间隔,默认1,值越小越清晰 1 非
isNeedRecordModule Android独有,设置是否需要录像模块,设置为0则不会额外申请录音权限 1 非
quality Android独有,设置照片分辨率 low medium high higher must 'high' 非

API 回调方法监听简要说明

回调函数 说明 默认值 是否必须
@onTakePhotoSuccess 接收拍照成功的通知,以及保存照片的路径 无 非
@onRecordSuccess 接收录像成功的通知,以及保存视频的路径 无 非
@onReceiveInfo 接收反馈的一些异常报错等日志信息 无 非
@on Click CallBack 接收水印点击事件,code:点击的水印类型 1/文字水印 2/图片水印(message是图片水印的索引id字符串),md语法会过滤onClick,只能加空格了 无 非

获取横竖屏回调监听

    this.$refs.cameraObj.addOrientationListener(res=>{
        console.error("监听到横竖屏变化:", (res.orientation === 'Landscape' ? '横屏':'竖屏'));
    })

文字水印配置参数

{
    // 水印内容风格设置
    title:"日常考勤" ,  // 水印块视图内容的标题
    width:  200,  // 宽度  px
    borderWidth: 5,  // 边框粗细 px

    // 商标小图标
    icon:{
        base64:"xxxxxxxx",
        width: 40,
        height: 40,
        position: 'left'  // 位置   left | right   设定在标题的左边还是右边
        iconCorner: 15, // 圆角值
        iconCornerLeftTop: 1, // 左上角圆是否显示  0|不显示  1|显示
        iconCornerLeftBottom: 1, // 左下角圆是否显示  0|不显示  1|显示
        iconCornerRightTop: 1, // 右上角圆是否显示  0|不显示  1|显示
        iconCornerRightBottom: 1, // 右下角圆是否显示  0|不显示  1|显示
        iconAlpha: 50, // 图标透明度
    }   

    // 水印位置风格设置
    positionHorizontal:"left",  // 水印水平方向位置 left | center | right
    positionVertical:"bottom", // 水印垂直方向位置 top | center | bottom
    offsetLeft: 0 , // 默认0,水印距离左边的偏移量(单位px)
    offsetRight: 0 , // 默认0,水印距离右边的偏移量(单位px)
    offsetTop: 0, // 默认0,水印距离顶部的偏移量(单位px)
    offsetBottom: 0, // 默认0,水印距离底部的偏移量(单位px)
    background: "#ee89ee", // 水印面板背景色, 如果要无背景色可不传此参数
    borderColor: "#eeddee",  // 边框颜色 
    corner: 15, // 圆角值
    cornerLeftTop: 1, // 左上角圆是否显示  0|不显示  1|显示
    cornerLeftBottom: 1, // 左下角圆是否显示  0|不显示  1|显示
    cornerRightTop: 1, // 右上角圆是否显示  0|不显示  1|显示
    cornerRightBottom: 1, // 右下角圆是否显示  0|不显示  1|显示

    alpha :  50, // 透明度 百分比

    // 标题内容风格设置
    titleFontSize:  16,  // 标题文字的字号 
    titleBold: 0, // 标题文本是否加粗
    titleColor: "#eeff00", // 标题文本颜色
    titleBackground: "#3f89ec" ,  // 标题文本的背景色
    titleAlign: 'center' , // 标题对齐方式 left right center
    titleAlpha: 25 , // 标题背景透明度

    content:[   //  [必传] 自定义数据,如无数据传空数组 [ ] ,不可传null或其他空类型,所有子项均可设置风格,此处举例第一项。
        {
            key: "经度",   // 如果为非空数组,此项[必传] 
            value:"122.52734°",   // 如果为非空数组,此项[必传] 
            color: "#ff33ee" , // 文本颜色  默认: #333333
            background:"#34rf32",   // 文本背景色  默认 #ffffff
            fontSize: 14,   // 文本字号  默认: 13
            alpha: 70, // 透明度  默认:0 不透明
            bold:  0 , //  文本是否加粗 1加粗  0常规, 默认0
            align: 'left' ,  // 文本对齐方式 left right center   默认:left
        },  
           {key: "纬度", value:"32.22434°"},
           {key: "地址", value:"新世纪大厦"},
           {key: "姓名", value:"XXX"}
       ]
   }

图片水印配置(可以同时配置多个)

[
    {
        base64:"xxxxxxxx",   // [必传] 图片内容
        width: 200,  // [必传] 图片宽度 单位px
        height: 200 , // [必传] 图片高度 单位px
        borderWidth: 4,  // 边框粗细 px
        positionHorizontal:"",  // 水印水平方向位置 left | center | right
        positionVertical:"", // 水印垂直方向位置 top | center | bottom
        borderColor: "#eeddee",  // 边框颜色 
        corner: 15, // 圆角值
        cornerLeftTop: 1, // 左上角圆是否显示  0|不显示  1|显示
        cornerLeftBottom: 1, // 左下角圆是否显示  0|不显示  1|显示
        cornerRightTop: 1, // 右上角圆是否显示  0|不显示  1|显示
        cornerRightBottom: 1, // 右下角圆是否显示  0|不显示  1|显示
        alpha :  20, // 透明度 百分比  0-100  0不透明 100全透明
        borderAlpha:  0,  // 透明度 百分比  0-100  0不透明 100全透明
        offsetLeft: 0 , // 默认0,水印距离左边的偏移量(单位px)
        offsetRight: 0 , // 默认0,水印距离右边的偏移量(单位px)
        offsetTop: 0, // 默认0,水印距离顶部的偏移量(单位px)
        offsetBottom: 0, // 默认0,水印距离底部的偏移量(单位px)
    }
]

标签水印配置(可以同时配置多个,android端还可用html标签控制风格,比如font字体颜色等,这是html标签文字)

[
    {
        text: " 这是一个标签 ", // 必传 标签标题
        textColor: "#ffffff",  // 文字颜色  默认#000000
        textAlign: 'center' , // left  right  center  默认center
        fontSize: 13,  // 字号  默认 14
        x: getAdaptiveValue(50), // 位置坐标 x   默认0
        y: getAdaptiveValue(20), // 位置坐标 y   默认0
        bgColor: "#E00300",  // 背景颜色  默认无
        alpha: 25, // 透明度  默认不透明
        bold: 1, // 0正常  1|加粗   默认不加粗
        radius: 4, // 圆角值   默认0
        borderWidth: 2,  //边框粗细   默认0 
        borderColor: "#007AFF"  // 边框颜色 默认无
    },
    {
      text: "这是一个蓝底白字标签"+(new Date().getTime()), // 必传 标签标题
      textColor: "#ffffff",  // 文字颜色  默认#000000
      textAlign: 'center' , // left  right  center
      fontSize: 15,
      x: getAdaptiveValue(40), // 位置坐标 x   默认0
      y: getAdaptiveValue(200), // 位置坐标 y   默认0
      bgColor: "#007AFF",  // 背景颜色  默认无
      alpha: 50, // 透明度  默认不透明
      bold: 1, // 0正常  1|加粗   默认不加粗
      radius: 12, // 圆角值   默认0
      borderWidth: 2,  //边框粗细   默认0 
      borderColor: "#999999"  // 边框颜色 默认无
    },
]

回调方法参数说明

参数类型 参数说明
object 格式:{detail:{code:2003, message:'摄像头未授权', videoPath:'......',imagePath:'.......',isSave2Album: true, direction:'normal'}},videoPath(视频保存路径),imagePath(图片保存路径,direction(照片方向))

插件使用示例:

    <!-- 相机原生插件 START -->
    <water-mark-camera
        ref="cameraObj" 
        isSave2Album="1"
        isAutoRotate="1"
        isAbleLandscape="1"
        class="camera_view"
        @onTakePhotoSuccess="onTakePhotoSuccess"
        @onRecordSuccess="onRecordSuccess"
        @onRecordFail="onRecordFail" 
        @onReceiveInfo="onReceiveInfo"
        >
    </water-mark-camera>
    <!-- 相机原生插件 END -->

    .camera_view{
        z-index: 100;
        width: 750rpx;
        height: 1330rpx;
    }

vue3可在项目根目录新建一个 vite.config.js 文件,内容如下

import {      
    defineConfig      
} from 'vite'      
import uni from '@dcloudio/vite-plugin-uni'  
const CUSTOM_TAG = ['water-mark-camera']//把自定义原生组件的名字写入到这里面  
export default defineConfig({      
    plugins: [      
        uni({      
            vueOptions: {      
                template: {      
                    compilerOptions: {  
                        isCustomElement: tag => CUSTOM_TAG.includes(tag)//这样就可以让编译器知道哪些是自定义组件  
                    }      
                }      
            }      
        })      
    ]      
})
对于需要上传的开发者,可在拍照/录像完成后在回调方法里得到照片/视频的保存路径,然后调用上传接口上传即可

上海栾青网络科技有限公司

15921627041 (同微信)

隐私、权限声明

1. 本插件需要申请的系统权限列表:

"android.permission.CAMERA", "android.permission.RECORD_AUDIO", "android.permission.WRITE_EXTERNAL_STORAGE",

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无