首页 > 其他分享 >uniapp APP端全局组件-水印

uniapp APP端全局组件-水印

时间:2024-05-27 16:47:29浏览次数:22  
标签:uniapp const APP ctx 水印 height width uni

一、水印核心代码

<template>
  <view
    class="watermark-box"
    :style="{backgroundImage:`url(${waterMarkImgSrc})`,backgroundSize:`auto ${height}px`}"
  >
    <canvas
      id="watermark"
      class="watermark"
      canvas-id="watermark"
    />
  </view>
</template>

<script>
// 字体大小
const fontSize = 14;
// 倾斜角:建议取(0,90),该区间的sin及cos为正值,省去三角函数取绝对值的计算
const rotateRad = 30 * Math.PI / 180;
const cosRad = Math.cos(rotateRad);
const sinRad = Math.sin(rotateRad);

export default {
  name: 'WaterMark',
  data() {
    return {
      waterMarkImgSrc: '',
      width: '',
      height: ''
    };
  },
  mounted() {
    this.init();
  },
  methods: {
    // 水印初始化
    init() {
      const {filePath,width,height} = JSON.parse(uni.getStorageSync('watermarkImg') || '{}');
      // 获取文件路径,读取文件。成功则使用缓存图片,失败或缓存不存在则生成水印
      if(filePath) {
        const path = plus.io.convertLocalFileSystemURL(filePath);
        uni.getImageInfo({
          src: path,
          success: () => {
            this.waterMarkImgSrc = 'file://' + path;
            this.width = width;
            this.height = height;
          },
          fail: ()=>{
            this.systemSetWaterMark();
          }
        });
      }else{
        this.systemSetWaterMark();
      }
    },
    // 水印文字
    getStr() {
      return '水印';
    },
    // 生成系统水印
    systemSetWaterMark() {
      // #ifdef APP-PLUS
      const watermarkStr = this.getStr();
      const ctx = uni.createCanvasContext('watermark');
      // 单个水印宽、高
      const {width: fontRealWidth} = ctx.measureText(watermarkStr);
      const fontWidth = parseInt(fontRealWidth * 2);
      const fontHeight = parseInt(fontSize * 2.5);
      // 水印倾斜后的宽度、高度
      this.width = Math.ceil(fontWidth * cosRad + fontHeight * sinRad);
      this.height = Math.ceil(fontHeight * cosRad + fontWidth * sinRad);
      // 设置画布的长宽
      ctx.width = this.width;
      ctx.height = this.height;
      // 透明度
      ctx.setGlobalAlpha(0.3);
      // 字体大小
      ctx.setFontSize(fontSize);
      // 设置填充绘画的颜色、渐变或者模式
      ctx.setFillStyle('#c8c8c8');
      // 中心偏移(由左上角改为中心
      ctx.translate(this.width / 2, this.height / 2);
      // 设置旋转角度:带负号为逆时针
      ctx.rotate(-rotateRad);
      // 设置文本内容的当前对齐方式
      ctx.textAlign = 'center';
      // 设置在绘制文本时使用的当前文本基线
      ctx.textBaseline = 'Middle';
      // 在画布上绘制填色的文本(输出的文本,开始绘制文本的X坐标位置,开始绘制文本的Y坐标位置)
      ctx.fillText(watermarkStr,0,0);
      ctx.draw(true,() => {
        // 绘制完成后生成图片,缓存相对图片路径及图片宽高
        uni.canvasToTempFilePath({
          canvasId: 'watermark',
          width: this.width,
          height: this.height,
          quality: 1,
          fileType: 'png',
          success: (res) =>{
            const path = plus.io.convertLocalFileSystemURL(res.tempFilePath);
            const data = {
              filePath: res.tempFilePath,// 相对路径
              width: this.width,
              height: this.height
            };
            uni.setStorageSync('watermarkImg',JSON.stringify(data));  
            this.waterMarkImgSrc = 'file://' + path;  
          }
        });
      });
      // #endif
    }
  }
};
</script>

<style lang='scss' scoped>
.watermark-box{
  overflow: hidden;
  width: 100%;
  height: 100vh;
  pointer-events: none;
  position: fixed;
  top: 30px;
  z-index: 9999;
  left: 0;
  top: 0;
  background-repeat: repeat;
}
.watermark{
  z-index: -1;
}
</style>

二、配置全局自定义组件

水印组件路径:

pages.json中配置easycom

{
	"easycom": {
		"autoscan": false,
		"custom": {
			"^u-(.*)": "@/uni_modules/uview-ui/components/u-$1/u-$1.vue",
			"^uni-(.*)": "@dcloudio/uni-ui/lib/uni-$1/uni-$1.vue",
			"^g-(.*)": "@/pages/components/$1/index.vue"
		}
	},
	"pages": []
}

使用
<g-watermark />

标签:uniapp,const,APP,ctx,水印,height,width,uni
From: https://www.cnblogs.com/yiping5/p/18215896

相关文章

  • 一例APP绕过root检测解密
    一例APP绕过root检测解密前言最近在分析一款app时遇见了root检测,数据包加密,花了时间简单研究了一下,记录下学习的过程。 抛出问题打开app发现提示检测到设备为root设备,闪退。能看到提示,推测应该是java层的检测。拖进jadx发现是加固的。通过frida绕过检测java层常见......
  • app上架国内应用商城合规检测、隐私合规检测
    1.工具准备camile代码(python)gitclonehttps://github.com/zhengjim/camille.git模拟器(夜神模拟器/Mumu模拟器)mumu模擬器:127.0.0.1:7555夜神模擬器:127.0.0.1:62001FridaFirda是一款易用的跨平Hook工具,Java层到Native层的Hook无所不能,是一种动态的插桩工......
  • 使用.Net Core开发WPF App系列教程( 八、WPF中的常用控件(下))
    使用.NetCore开发WPFApp系列教程一、.NetCore和WPF介绍二、在VisualStudio2019中创建.NetCoreWPF工程三、与.NetFramework的区别四、WPF中的XAML五、WPF中的布局六、WPF中的常用控件(上)七、WPF中的常用控件(中)八、WPF中的常用控件(下)其它、实现多语言切换的几种方......
  • appKey&appSecret 加密验签算法
    加密方式请求参数依次从a-z排列然后拼接后加入加密app_secret然后MD5加密即可得到签名字符串PHP示例privatestaticfunctiongenerateSign($params,$appSecret){ksort($params);$str='';foreach($paramsas$key=>$value){......
  • mybatis- [04] mapper文件详解
      Mybatis的Mapper文件(通常是以.xml为扩展名的文件)主要用于定义SQL语句和它们与Java接口方法之间的映射关系。以下是Mapper文件中一些常用的配置元素和属性。 一、mapper文件配置详解(1)namespace:定义Mapper接口对应的唯一命名空间,用于区分不同的Mapper。(常以UserMapper类的......
  • 探索Solana链上DApp开发:高性能区块链生态的新机遇
    Solana是一个新兴的区块链平台,致力于为DApp(去中心化应用程序)开发者提供高性能、低成本的解决方案。Solana的独特之处在于其创新性的共识机制和高吞吐量的网络,使得开发者可以构建高度可扩展的DApp,并为用户提供无与伦比的体验。以下是一份简要介绍,让您可以快速了解Solana链......
  • 轻松赚取零花钱,这些神器APP让你告别广告烦恼!
    在快节奏的现代生活中,很多人都希望能够在闲暇之余轻松赚取一些零花钱。然而,很多所谓的赚钱软件却充斥着大量的广告,让人不胜其烦。今天,我就为大家介绍9款不用看广告就能赚零花钱的软件,其中包括备受好评的“千行赏金”,让你在享受赚钱乐趣的同时,远离广告的打扰!一、千行赏金——你......
  • android studio 实现web网站变成app小程序
    MainActivity.javapackagecom.example.myapplication;importandroid.os.Bundle;importandroid.webkit.WebView;importandroid.webkit.WebViewClient;importandroidx.appcompat.app.AppCompatActivity;publicclassMainActivityextendsAppCompatActivity{......
  • MahApps.Metro的MVVM模式解析(二) 主题功能
    MahApps.Metro的MVVM模式解析(二)主题功能MahApps.Metro是一个开源的WPF框架,旨在为WPF应用程序提供现代和漂亮的用户界面。在MahApps.Metro中提供了切换主题的功能。经过多日的筛选和分析,在本文来理清它的脉络。1主题功能演示主题列表:白天主题效果:夜晚主题效果:2软件架构......
  • 【Spring】SpringMVC中@RequestMapping 详解
    1、简介在SpringMVC中,@RequestMapping是一个非常重要的注解,它用于映射web请求(如HTTP请求)到特定的处理器方法或处理器类。2、基本用法@RequestMapping可以标注在方法或类上。当标注在类上时,它提供了初步的请求映射信息,如请求路径的前缀。当标注在方法上时,它提供了具体的......