uniapp+uView 实现自定义水印相机,拍完照片给图片加水印,从相册选择图片加水印功能

这篇具有很好参考价值的文章主要介绍了uniapp+uView 实现自定义水印相机,拍完照片给图片加水印,从相册选择图片加水印功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

uniapp实现拍照加水印,数码相机,uni-appuniapp实现拍照加水印,数码相机,uni-appuniapp实现拍照加水印,数码相机,uni-app

样式图如上所示


页面分为取景框和拍照完成后预览,本功能设计到,公共上传组件,相机也页面,获取定位地址,页面中如何用该上传组件

UI实现
取景界面分为上下两个部分,上部分为camera取景框组件,下部分为操作区域。

取景框组件上的关闭和水印,以及拍完照片后的略缩图展示需要通过cover-view和cover-image来展示。

页面中的引用

 <my-camera :maxCount="5" :name="1" :editUrl="fileList1" @filesSelected="handleFilesSelected"  @upload="handleUpload" />
   import myCamera from '@/components/camera/index.vue'
 components: {
      myCamera,
    },
     data() {
      return {
        fileList1: [],
        
        }
      }
      //删除图片
      handleFilesSelected(index, name) {
        this[`fileList${name}`].splice(index, 1);
      },
      //图片上传
      handleUpload(data) {
        this[`fileList${data.name}`] = data.fileList
      }


结构代码如下:
 

<view class="u-upload">
    <view class="u-list-item u-preview-wrap" v-for="(item, index) in fileList" :key="index" :style="{
			width: 150,
			height: 150
		}">
      <view class="u-delete-icon" @click="deleteItem(index)" :style="{
					background: '#000'
				}">
        <u-icon class="u-icon" name="close" size="10" color="#ffffff"></u-icon>
      </view>
      <image @click="lookImg(index)" class="u-preview-image" :src="item.url"></image>
      <view class="u-upload__status" v-if="item.status === 'uploading'">
        <view class="u-upload__status__icon">
          <u-icon v-if="item.status === 'failed'" name="close-circle" color="#ffffff" size="25" />
          <u-loading-icon size="22" mode="circle" color="#ffffff" v-else />
        </view>
        <text v-if="item.message" class="u-upload__status__message">{{ item.message }}</text>
      </view>
    </view>
    <view style="display: inline-block;" @click="gotoCamera" v-if="fileList.length < maxCount">
      <slot name="addBtn"></slot>
      <view class="u-list-item u-add-wrap" hover-class="u-add-wrap__hover" hover-stay-time="150" :style="{
					width: 150,
					height: 150
				}">
        <u-icon name="camera" size="30"></u-icon>
      </view>
    </view>
    <u-popup :show="show" mode="bottom" @close="close">
      <view style="height: 260rpx;">
        <view class="popup_item" @click="goCamera()">拍照</view>
        <view class="popup_item" @click="goAlbum()">相册</view>
      </view>
    </u-popup>
    <view style="position: absolute;top: -999999px;">
      <view><canvas :style="{ width: w, height: h }" canvas-id="firstCanvas"></canvas></view>
    </view>
  </view>

 样式css

<style scoped lang="scss">
  .u-upload {
    // @include vue-flex;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
  }

  .u-add-tips {
    margin-top: 20rpx;
    line-height: 40rpx;
  }

  .u-delete-icon {
    position: absolute;
    top: 4rpx;
    right: 4rpx;
    z-index: 10;
    background-color: red;
    border-radius: 100rpx;
    width: 32rpx;
    height: 32rpx;
    // @include vue-flex;
    display: flex;
    align-items: center;
    justify-content: center;
  }

  .u-icon {
    // @include vue-flex;
    display: flex;
    align-items: center;
    justify-content: center;
  }

  .u-list-item {
    width: 160rpx;
    height: 160rpx;
    overflow: hidden;
    margin: 10rpx;
    background: rgb(244, 245, 246);
    position: relative;
    border-radius: 10rpx;
    /* #ifndef APP-NVUE */
    display: flex;
    /* #endif */
    align-items: center;
    justify-content: center;
  }

  .u-preview-wrap {
    border: 1px solid rgb(235, 236, 238);
  }

  .u-preview-image {
    display: block;
    width: 100%;
    height: 100%;
    border-radius: 10rpx;
  }

  .popup_item {
    width: 100%;
    height: 130rpx;
    text-align: center;
    line-height: 130rpx;
    border-bottom: 1px solid #eaeef1;
  }

  .u-upload__status {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    background-color: rgba(0, 0, 0, 0.5);
    @include flex(column);
    align-items: center;
    justify-content: center;
  }

  .u-upload__status__icon {
    position: relative;
    z-index: 1;
  }

  .u-upload__status__message {
    font-size: 12px;
    color: #FFFFFF;
    margin-top: 5px;
  }
</style>

公共上传组件数据的绑定

 import {
    props
  } from '../../uni_modules/uview-ui/libs/mixin/mixin';
  import getCurrentLngAndLat from "@/utils/getAddressLocation.js"
  export default {
    name: "myCamera",
    props: {
      maxCount: {
        type: Number,
        default: 1
      },
      name: {
        type: String,
        required: true
      },
      editUrl: {
        type: Array,
        default: () => {
          []
        }
      },
      type: {
        type: String,
        default: () => 'order'
      },
      customStyle: {
        type: Object,
        default: () => {}
      }
    },
    data() {
      return {
        fileList: [],
        show: false,
        w: '',
        h: '',
        nowTime: '', //日期
        nowTime2: '', //时间
        nowWeek: '', // 周几
        address: '', //当前地址信息
      }
    },

公共组件部分js实现:分为拍照与相册中上传,包括删除图片,预览图片,保存图片到相册

 watch: {
      editUrl: {
        immediate: true,
        handler(newVal, oldVal) {
          if (this.editUrl[0]?.url === '' || this.editUrl[0]?.url === null) {
            this.fileList = [];
          } else {
            this.fileList = this.editUrl
          }
        }
      }
    },
    methods: {
      goCamera() {
        uni.$u.route(`/pages/camera/camera?name=${this.name}`);
        this.close();
      },
      async goAlbum() {
        this.close();
        this.getTime();
        const res1 = await getCurrentLngAndLat();
        this.address = res1.currentSignAddress;
        const res = await this.chooseFile();
        this.afterRead(res)
      },
      //选择图片
      chooseFile() {
        return new Promise((resolve, reject) => {
          uni.chooseImage({
            count: this.maxCount ? this.maxCount : 1, //默认9
            sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
            sourceType: ['album'], //从相册选择
            success: res => resolve(this.formatImage(res)),
          });
        })
      },
      //处理图片
      formatImage(res) {
        return res.tempFiles.map(item => ({
          ...this.pickExclude(item, ['path']),
          type: 'image',
          url: item.path,
          thumb: item.path,
          size: item.size,
        }))
      },
      pickExclude(obj, keys) {
        // 某些情况下,type可能会为
        if (!['[object Object]', '[object File]'].includes(Object.prototype.toString.call(obj))) {
          return {}
        }
        return Object.keys(obj).reduce((prev, key) => {
          if (!keys.includes(key)) {
            prev[key] = obj[key]
          }
          return prev
        }, {})
      },
      close() {
        this.show = false;
      },
      // 跳转到拍照页面
      gotoCamera() {
        this.show = true;
      },
      async afterRead(file) {
        const lists = [].concat(file);
        const fileListLen = this.fileList.length;
        for (let i = 0; i < lists.length; i++) {
          const item = lists[i];
          let waterUrl = await this.addWatermark(item.url);
          this.fileList.push({
            ...item,
            status: "uploading",
            message: "上传中"
          });
          try {
            const result = await this.uploadFilePromise(waterUrl);
            const uploadedItem = Object.assign({}, item, {
              status: "success",
              message: "",
              url: result
            });
            this.fileList.splice(fileListLen + i, 1, uploadedItem);
          } catch (error) {
            const failedItem = Object.assign({}, item, {
              status: "fail",
              message: "上传失败"
            });
            this.fileList.splice(fileListLen + i, 1, failedItem);
          }
        }
        this.$emit("upload", {
          name: this.name,
          fileList: this.fileList
        });
      },
      //上传图片
      uploadFilePromise(url) {
        let host = "";
        // #ifndef H5
        let envVs = uni.getAccountInfoSync().miniProgram.envVersion;
        if (envVs === 'release') {
          host = uni.getStorageSync('normal_url')
        } else if (envVs === 'trial') {
          host = uni.getStorageSync('exp_url')
        } else if (envVs === 'develop') {
          host = uni.getStorageSync('test_url')
        }
        // #endif
        return new Promise((resolve, reject) => {
          uni.uploadFile({
            url: host + '上传图片接口的url', // 仅为示例,非真实的接口地址
            filePath: url,
            name: 'file',
            formData: {
              type: 'order',
              lat: 23.129163,
              lng: 113.264435
            },
            header: {
              Authorization: 'Bearer ' + uni.getStorageSync('token')
            },
            success: (res) => {
              setTimeout(() => {
                let arr = JSON.parse(res.data)
                resolve(arr.data?.url)
              }, 1000)
            },
          })
        })
      },
      // 删除图片
      deleteItem(index) {
        let that = this;
        uni.showModal({
          title: '提示',
          content: '您确定要删除此张照片吗?',
          success: async (res) => {
            if (res.confirm) {
              this.$emit("filesSelected", index, this.name);
            }
          }
        });
      },
      //查看图片
      lookImg(index) {
        let photoList = this.editUrl.map(item => {
          return item.url;
        });
        // 预览图片
        uni.previewImage({
          current: index,
          urls: photoList,
        });
      },
      //添加水印
      async addWatermark(img) {
        var that = this
        let res1 = await new Promise((resolve, reject) => {
          uni.getImageInfo({
            src: img,
            success: (res) => {
              that.w = res.width / 3 + 'px';
              that.h = res.height / 3.01 + 'px';
              let ctx = uni.createCanvasContext('firstCanvas', this); /** 创建画布 */
              //将图片src放到cancas内,宽高为图片大小
              ctx.drawImage(img, 0, 0, res.width / 3, res.height / 3);
              // ctx.setFontSize(18);
              ctx.setFontSize(Math.floor(res.width * 0.04));
              ctx.setFillStyle('#fff');
              ctx.setTextAlign('center');
              let textToWidth = (res.width / 3) * 0.5;
              let textToHeight = (res.height / 3) * 0.86;
              ctx.fillText(that.nowTime2, textToWidth, textToHeight);
              ctx.setFontSize(Math.floor(res.width * 0.015));
              let textToHeight2 = (res.height / 3) * 0.91;
              ctx.fillText(that.nowTime + ' ' + that.nowWeek, textToWidth, textToHeight2);
              ctx.setFontSize(Math.floor(res.width * 0.01));
              let textToHeight3 = (res.height / 3) * 0.95;
              ctx.fillText(' 📍 ' + that.address, textToWidth, textToHeight3);
              ctx.draw(false, () => {
                // 将画布转化为图片
                uni.canvasToTempFilePath({
                  canvasId: 'firstCanvas',
                  success: (res) => {
                    resolve(res.tempFilePath);
                  },
                  fail: (err) => {
                    reject(err);
                  }
                }, this);
              });
            }
          });
        });
        return (res1);
      },
       //获取时间
      getTime: function() {
        var weekarr = new Array("日", "一", "二", "三", "四", "五", "六");
        var date = new Date(),
          year = date.getFullYear(),
          month = date.getMonth() + 1,
          day = date.getDate(),
          hour = date.getHours() < 10 ? "0" + date.getHours() : date.getHours(),
          minute = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes(),
          second = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();
        month >= 1 && month <= 9 ? (month = "0" + month) : "";
        day >= 0 && day <= 9 ? (day = "0" + day) : "";
        var timer = year + '-' + month + '-' + day;
        var timer3 = hour + ':' + minute + ':' + second;
        var timer2 = hour + ':' + minute
        this.nowTime = timer;
        this.nowTime2 = timer2;
        this.nowTime3 = timer3;
        this.nowWeek = '星期' + weekarr[date.getDay()];
      },

    }
  

相机页面的全部代码:(相机页面给图片加水印与选择图片加水印可以抽离出一个公共的方法,时间紧任务重我就没。。。)

<template>
  <view>
    <camera :device-position="device" :flash="flash" @error="error"
      :style="{ width: '100%',position: 'relative', height: getHeight + 'px' }">
      <cover-view class="topBox">
        <cover-view class="topItem">{{nowWeek}}</cover-view>
        <cover-view class="topItem">{{nowTime +' '+nowTime2}}</cover-view>
        <cover-view class="topItem">{{address}}</cover-view>
      </cover-view>
      <cover-image @click="xzBtn" class="xzImg" src="https://cdn.zhoukaiwen.com/xz.png"></cover-image>
      <cover-view class="cameraBtn" @click="takePhoto">
        <cover-view class="cameraBtn2"></cover-view>
      </cover-view>
    </camera>
    <view style="position: absolute;top: -999999px;">
      <view><canvas :style="{ width: w, height: h }" canvas-id="firstCanvas"></canvas></view>
    </view>
  </view>
</template>

<script>
  import getCurrentLngAndLat from "@/utils/getAddressLocation.js"
  export default {
    data() {
      return {
        getHeight: '200',
        device: 'back', //前置或后置摄像头,值为front, back
        flash: 'off', //闪光灯,值为auto, on, off
        nowTime: '', //日期
        nowTime2: '', //时间
        nowWeek: '', // 周几
        address: '', //当前地址信息
        city: '',
        district: '',
        name: '',
        imgList: [],
        imgListData: '',
        rreportShow: false, //选择照片备注内容弹窗
        src: '',
        w: '',
        h: ''
      }
    },
    async onLoad(options) {
      const that = this;
      uni.getSystemInfo({
        success: function(res) {
          that.getHeight = res.windowHeight;
        }
      });
      this.getTime();
      const res = await getCurrentLngAndLat();
      this.address = res.currentSignAddress;
      this.name = +options.name
    },
    methods: {
      xzBtn() {
        if (this.device == 'front') {
          this.device = 'back'
        } else {
          this.device = 'front'
        }
      },
      // 点击拍照
      takePhoto() {
        var that = this;
        if (this.imgList.length < 3) {
          const ctx = uni.createCameraContext();
          ctx.takePhoto({
            quality: 'high',
            success: (ress) => {
              var tempImagePath = ress.tempImagePath;
              // 获取图片信息
              uni.getImageInfo({
                src: ress.tempImagePath,
                success: res => {
                  that.w = res.width / 3 + 'px';
                  that.h = res.height / 3.01 + 'px';
                  let ctx = uni.createCanvasContext('firstCanvas'); /** 创建画布 */
                  //将图片src放到cancas内,宽高为图片大小
                  ctx.drawImage(ress.tempImagePath, 0, 0, res.width / 3, res.height / 3);
                  ctx.setFontSize(18);
                  ctx.setFillStyle('#FFFFFF');
                  ctx.setTextAlign('center');
                  // 		// ctx.rotate(30 * Math.PI / 180);//0.03
                  let textToWidth = (res.width / 3) * 0.5;
                  let textToHeight = (res.height / 3) * 0.9;
                  ctx.fillText(that.nowTime2, textToWidth, textToHeight);
                  ctx.setFontSize(12);
                  let textToHeight2 = (res.height / 3) * 0.94;
                  ctx.fillText(that.nowTime + ' ' + that.nowWeek, textToWidth, textToHeight2);
                  ctx.setFontSize(7);
                  let textToHeight3 = (res.height / 3) * 0.98;
                  ctx.fillText(' 📍 ' + that.address, textToWidth, textToHeight3);
                  ctx.draw(false, () => {
                    setTimeout(() => {
                      uni.canvasToTempFilePath({
                        canvasId: 'firstCanvas',
                        success: async (res1) => {
                          tempImagePath = res1.tempFilePath;
                          const result = await this.uploadFilePromise(tempImagePath, {
                            lat: 23.129163,
                            lng: 113.264435
                          })
                          let pages = getCurrentPages();
                          let prevPage = pages[pages.length - 2];
                          // 将数据返回上一个页面
                          prevPage.$vm[`fileList${this.name}`].push({
                            url: result
                          })
                          // setTimeout(() => {
                          uni.navigateBack();
                          // }, 500)
                        }
                      });
                    }, 500);
                  });
                }
              });
            },
            fail: (err) => {
              console.log(err, 'errhhhhhhhhhhhh')
            }
          });
        } else {
          uni.showToast({
            title: '最大上传3张照片',
            duration: 2000,
            icon: 'none'
          });
        }
      },
      uploadFilePromise(url, lngLat) {
        // 初始化请求配置项
        let host = "";
        // #ifndef H5
        let envVs = uni.getAccountInfoSync().miniProgram.envVersion;
        if (envVs === 'release') {
          host = uni.getStorageSync('normal_url')
        } else if (envVs === 'trial') {
          host = uni.getStorageSync('exp_url')
        } else if (envVs === 'develop') {
          host = uni.getStorageSync('test_url')
        }
        // #endif
        return new Promise((resolve, reject) => {
          uni.showLoading({
            title: '上传中'
          });
          uni.uploadFile({
            url: host + '上传图片接口url', // 仅为示例,非真实的接口地址
            filePath: url,
            name: 'file',
            formData: {
              type: 'order',
              lat: lngLat.lat,
              lng: lngLat.lng,
            },
            header: {
              Authorization: 'Bearer ' + uni.getStorageSync('token')
            },
            success: (res) => {
              // setTimeout(() => {
              let arr = JSON.parse(res.data)
              if (res.data.code == 0) {
                uni.$showMsg(res.data.message, 'none')
                uni.hideLoading();
              } else {
                uni.hideLoading();
                uni.$showMsg('上传成功', 'none')
                resolve(arr.data?.url)
              }
              // }, 1000)
            },
          })
        })
      },

      getTime: function() {
        var weekarr = new Array("日", "一", "二", "三", "四", "五", "六");
        var date = new Date(),
          year = date.getFullYear(),
          month = date.getMonth() + 1,
          day = date.getDate(),
          hour = date.getHours() < 10 ? "0" + date.getHours() : date.getHours(),
          minute = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes(),
          second = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();
        month >= 1 && month <= 9 ? (month = "0" + month) : "";
        day >= 0 && day <= 9 ? (day = "0" + day) : "";
        var timer = year + '-' + month + '-' + day;
        var timer3 = hour + ':' + minute + ':' + second;
        var timer2 = hour + ':' + minute
        this.nowTime = timer;
        this.nowTime2 = timer2;
        this.nowTime3 = timer3;
        this.nowWeek = '星期' + weekarr[date.getDay()];
      },
      error(e) {
        console.log(e.detail);
      },
    }
  }
</script>

<style lang="scss">
  .topBox {
    width: 750rpx;
    box-sizing: border-box;
    // padding-bottom: 200rpx;
    // padding-left: 30rpx;
    color: #EEEEEE;
    font-size: 34rpx;
    position: absolute;
    bottom: 20%;
    /* 设置小盒子距离大盒子底部的距离为0 */
    left: 50%;
    /* 设置小盒子距离大盒子左侧的距离为50%,即水平居中 */
    transform: translateX(-50%);
    text-align: center;

    /* 通过transform将小盒子水平居中 */
    .topItem {
      width: 100%;
      white-space: pre-wrap;
      margin-bottom: 15rpx;
    }
  }

  .xzImg {
    width: 52rpx;
    height: auto;
    position: absolute;
    right: 44rpx;
    bottom: 160rpx;
  }


  .cameraBtn {
    width: 120rpx;
    height: 120rpx;
    line-height: 120rpx;
    border: 6rpx #FFFFFF solid;
    border-radius: 50%;
    padding: 8rpx;
    position: absolute;
    left: calc(50% - 60rpx);
    bottom: 120rpx;
  }

  .cameraBtn2 {
    width: 100%;
    height: 100%;
    border-radius: 50%;
    background-color: #FFFFFF;
    text-align: center;
    color: #007AFF;
  }
</style>

获取当前地址的方法(getLocation接口记得在微信公众平台申请一下)

// 获取当前经纬度
const getCurrentLngAndLat = () => {
  return new Promise((resolve, reject) => {
    uni.getLocation({
      type: 'wgs84',
      success: res => {
        let lng = res.longitude.toString()
        let lat = res.latitude.toString()
        uni.request({
          method: 'GET',
          url: `https://apis.map.qq.com/ws/geocoder/v1/?location=${lat},${lng}&key=你的key`,
          success: address => {
            const { standard_address } = address.data.result.formatted_addresses
            resolve({
              lng,
              lat,
              currentSignAddress: standard_address
            })
          },
          fail: errAddress => {
            reject({ message: errAddress.message })
          }
        })
      },
      fail: err => {
        getCurrentAddress()
      }
    })
  })
}
// 授权地理位置
const getCurrentAddress = () => {
  uni.authorize({
    scope: 'scope.userLocation',
    success() {
      getCurrentLngAndLat()
    },
    fail(err) {
      uni.showModal({
        title: '请您授权地理位置',
        content: '如需正常使用此小程序打卡功能,请您按确定并在设置页面授权地理位置授权',
        confirmText: '确定',
        success: res => {
          if (res.confirm) {
            uni.openSetting({
              success: function(res) {
                if (res.authSetting['scope.userLocation']) {
                  uni.showToast({
                    title: '授权成功',
                    icon: 'none'
                  })
                  getCurrentLngAndLat()
                } else {
                  // 不允许
                  uni.showToast({
                    title: '授权失败',
                    icon: 'none'
                  })
                }
              },
              fail: err => {
                console.log('err:', err)
              }
            })
          } else { //取消
            uni.showToast({
              title: '取消授权',
              icon: 'none'
            })
          }
        },
        fail: err => {
          console.log('err:', err)
        }
      })
    }
  })
}


export default getCurrentLngAndLat

代码参考:uniapp自定义水印相机_vue+uniapp 拍照+水印-CSDN博客 文章来源地址https://www.toymoban.com/news/detail-850836.html

到了这里,关于uniapp+uView 实现自定义水印相机,拍完照片给图片加水印,从相册选择图片加水印功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp+uView2.0实现自定义动态tabbar

         1.需求说明      2.实现原理说明      3.实现过程          3.1集成uView2.0          3.2 自定义tabbar          3.3 vuex定义tabbar共享信息          3.4 tabbar显示个数控制      要求不同时间显示不同的tabbar.点击不同的tabbar跳转到不同的页面,能随时实现tabb

    2023年04月18日
    浏览(42)
  • uniapp+uview2.0+vuex实现自定义tabbar组件

    效果图 1.在components文件夹中新建MyTabbar组件 2.组件代码 3.父组件 4.创建store目录,下面创建index.js文件

    2024年02月04日
    浏览(54)
  • uniapp实现上传图片添加日期和地点水印,修复多张图片同时上传,显示相同图片问题

    整体实现流程:首先调用 uni.chooseImage 方法,配置count、sizeType、sourceType参数,分别代表选择的图片个数、original 原图,compressed 压缩图,默认二者都有、是从相册还是拍照。 然后在成功的回调中拿到上传的所有图片并存储。然后就是添加水印,调用 uni-getImageInfo 拿图片信息,

    2024年02月12日
    浏览(63)
  • uniapp 水印/相机/授权位置、相机、相册权限

    自定义相机水印 授权     // 手动授权【摄像头】     function getAuth() {         // 获取摄像头权限         uni.getSetting({             success(res) {                 console.log(\\\"auth res\\\", res);                 const authSetting = res.authSetting;                 if (auth

    2024年02月02日
    浏览(43)
  • 图片添加水印,仿照水印相机样式,定位时间备注等

    开发思路1、将每个元素添加分别单独到背景图片上,调整位置和透明度 开发思路2、将水印信息先整合为一张水印图片,再将水印图片添加到背景图片,调整位置和透明度 因为考虑到不同图片尺寸大小等问题,元素内容又多,根据思路1,定位问题太麻烦,而且还因调整大小

    2024年02月20日
    浏览(42)
  • uniapp实现自定义相机

    于是开启了我的解决之路 利用 livePusher 实现 拓展性挺强的,可以实现自定义水印、身份证拍摄、人像拍摄等 这里我简单实现一个相机功能主要用于解决闪退 Tip:这里需要创建nvue文件哦~ 创建 camera.nvue 这里用了一些图片作为图标布局画面美观,例如返回图标,拍摄图标 在点击

    2024年02月09日
    浏览(30)
  • uniapp + uview —— 上传图片

    index.vue 接口、请求头部 方法

    2024年02月12日
    浏览(38)
  • uniapp+uView自定义底部tabBer

    HBuilderX和微信开发工具联合开发小程序 一,安装uView2 1.uView安装 2.查看官方文档uView配置  二, 1.现在pages文件新建四个vue页面 2.在pages.json配置导航栏,因为要在微信开发者工具运行,要配置custom

    2024年02月08日
    浏览(44)
  • uniapp实现自定义上传图片

    在正式自定义上传前我们先将静态页面搭建好。 样式代码: 通过uniapp的uni.chooseImage从本地相册选择图片或使用相机拍照。 在data中定义一个响应式数据来接收我们选择的图片,然后通过v-for渲染到我们的页面,达到缩略图的效果。 代码: 效果: 最初我们定义了只能选择九张

    2024年02月12日
    浏览(30)
  • 【uniapp】uview1.x使用upload上传图片

    和2.x不同的是,要用 action 来配置后端上传图片的接口地址; 再来一些配置项的命名有所不同,一般1.x的命名用 - ,2.x的命名使用小驼峰; 1.x 的上传会自带删除时的提示框,2.x 没有; 重要的几个配置项有: picList 初始化为一个空数组,是用来保存图片的列表 baseUrl 为后端上

    2024年02月07日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包