离线合成联想到的--canvas合成水印

前段时间做了功能模块:用户设置自定义勋章;

实现方式:前端把用户设置的昵称传到后台,后台根据不同用户等级,使用离线合成技术合成不同的勋章返回到前端;

方案算是实现了,但是有点坑就是,后台的离线合成没有每次百分之百成功,且生成的图片模糊,现在暂不说这个;

在实现上述功能模块的时候联想到之前有用canvas对图片添加水印的demo,不禁翻出来看一看,也算是回顾一下知识吧。

效果:

大概思路就是,获取一张图片,用canvas绘制一次之后,再在绘制的图片上绘制上水印文字,注意在本地获得的图片要转成64base形式《Base64编码原理与应用》。;

//html
<input type="file" id="uploadFile">
<label for="uploadFile" class="upload-btn">选择图片</label>
<p>图片预览</p>
<img src=""  class="readImg">

//js
var maxFilesize = 1024*1024; //文件最大不能超过100k
  var watermark = ‘hello world‘;
  var uploadFileEle = document.getElementById(‘uploadFile‘);
  var readImg = document.querySelector(‘.readImg‘);;
  var canvesSize = 300;

  uploadFileEle.addEventListener(‘change‘,function(event){
    var reader  = new FileReader();
    var file = event.target.files[0] || event.dataTransfer.files[0];

    if(file.size > maxFilesize){
      alert(‘上传的图片不能大于1M‘);
      return;
    }

    //base64编码
    if (file) {
      reader.readAsDataURL(file);
    }

    reader.addEventListener("load", function () {
      //readImg.src = reader.result;
      //合成水印
      compoundImg(reader.result);
    }, false);
  },false);

  //合成水印
  function compoundImg(url){
    var canvas = document.createElement(‘canvas‘);
    canvas.width = canvesSize;
    canvas.height = canvesSize;
    var context = canvas.getContext(‘2d‘);

    var uploadImg = new Image();
    uploadImg.src = url;
    uploadImg.onload = function(){
      //绘制上传的图片
      context.drawImage(uploadImg,0,0,canvesSize,canvesSize,0,0,canvesSize,canvesSize);

      //绘制文字水印
      context.rotate(-15*Math.PI/180);
      context.font = "40px Arial";
      context.fillStyle = "rgba(17, 17, 17, .6)";
      context.textBaseline = ‘Middle‘;

      context.fillText(watermark, canvesSize/8, canvesSize/2);

      var imgUrl = canvas.toDataURL(‘image/png‘);
      readImg.src = imgUrl;
    }
  }

  

如果采用前端添加水印,别人完全可以绕过你的水印逻辑,盗用你的资源。

原文地址:https://www.cnblogs.com/leaf930814/p/8497183.html

时间: 2024-10-02 08:04:37

离线合成联想到的--canvas合成水印的相关文章

&lt;canvas合成海报&gt;所遇问题及解决方案总结

最近做了一个用canvas合成海报图片的移动端项目,由于一点canvas基础都没有,所以去网上搜了一位前辈的demo,但是开发过程中遇到了很多问题,现将所遇问题及解决方法总结如下: 1.移动端canvas项目适配全屏问题 问题描述:由于canvas的width和height只能设置px值,不支持rem单位,所以想在移动设备屏幕分辨率繁杂的情况下达到canvas铺满全屏的效果很困难. 解决方法:通过js获取到手机屏幕的clientWidth值,赋给canvas,以此来达到适配全屏的效果: var

xBuild APK差分与合成,Zip差分与合成,自动打包

在游戏开发中,为满足用户需求,产品运营需求,改动的特别多,升级是件极其频繁的事情(没办法,一切以用户为中心),如果一个游戏APP又同时是个集合类型的(内置多个游戏),做完这个游戏只有一个感觉:再也不会爱了... 我们的游戏是用Lua写的,所以Android客户端分为: Apk升级(细分为1.完整升级;2.增量升级;3.第三方升级): Lua升级(细分为1.大厅升级;2各个游戏升级),同时Lua的游戏采用的是热更新机制: 同时涉及 各个游戏->大厅->Apk的依赖关系,难度较大,代码逻辑实现相对

canvas合成图片 圣诞节新技能戴帽

<!doctype html><html><head><meta charset="utf-8"><title>Html5 Canvas 实现图片合成</title><link rel="stylesheet" href="public.css"><style>img{ border:solid 1px #ddd;}</style><

canvas 合成图片

copy网上的代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <style> *{ margin:0; padding:0; } .center{ text-align: center; } </style> </head> <body> <div class="cente

Canvas合成图像 比较简单 看代码和demo

<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <style> *{ margin:0; padding:0; } .center{ text-align: center; } </style> </head> <body> <div class="center">

php图文合成文字居中(png图片合成)

header('Content-type:text/html;charset=utf-8'); /** * png图文合成 by wangzhaobo * @param string $pic_path 图片目录 * @param array $text 文字 * @param array $font_file 路径 * @param array $font_size 文字大小 * @param array $font_pos_y 文字距离图片高度 * @return string 合成图片的名

html5 canvas画布上合成

source-over 默认.在目标图像上显示源图像. source-atop 在目标图像顶部显示源图像.源图像位于目标图像之外的部分是不可见的. source-in 在目标图像中显示源图像.只有目标图像内的源图像部分会显示,目标图像是透明的. source-out 在目标图像之外显示源图像.只会显示目标图像之外源图像部分,目标图像是透明的. destination-over 在源图像上方显示目标图像. destination-atop 在源图像顶部显示目标图像.源图像之外的目标图像部分不会被显

合成(composite)模式

合成模式属于对象的结构模式,有时又叫做“部分——整体”模式.合成模式将对象组织到树结构中,可以用来描述整体与部分的关系.合成模式可以使客户端将单纯元素与复合元素同等看待. 合成模式 合成模式把部分和整体的关系用树结构表示出来.合成模式使得客户端把一个个单独的成分对象和由它们复合而成的合成对象同等看待.比如,一个文件系统就是一个典型的合成模式系统.下图是常见的计算机XP文件系统的一部分. 从上图可以看出,文件系统是一个树结构,树上长有节点.树的节点有两种,一种是树枝节点,即目录,有内部树结构,在图

合成模式

AWT中就有合成模式的例子,如下图所示: 可以看出Button和Checkbox为叶子节点,Container为树枝节点,而且Container可以包含其他的Component对象,如Button等. Container中有操作聚集的方法,而Component则没有这样的方法,也就是说AWT中使用的是安全式的合成模式,这是使用合成模式的两种方法之一. 下面情形应该考虑使用合成模式: 1.需要描述对象整体和部分的等级关系. 2.客户端会忽略叶子节点和树枝节点的区别,平等地使用叶子节点和树枝节点.