已适配视网膜屏的通用水印实现方案
本文由 小茗同学 发表于 2019-03-06 浏览(3432)
最后修改 2022-01-10 标签: canvas 模糊 水印

如题

默认情况下,canvas在视网膜屏幕下写出的字体会有模糊问题,本方法已适配,完整代码如下:

/**
 * 生产水印,并返回水印URL地址,已适配视网膜屏幕下字体模糊问题
 * @param {*} text 水印文字
 * @param {*} el 要设置水印的目标元素,默认 document.body
 * @param {*} config 配置项
 * @returns {String} 水印URL地址
 */
function makeWatermark(text, el, config) {
	// 所有支持的配置项
	var defaultConfig = {
		width: 260,
		height: 200,
		font: '14px Microsoft Yahei',
		color: '#ddd',
		opacity: 0.5,
		rotate: -30,
		x: 0,
		y: 0,
	};
	// base64转blob
	function dataURLtoBlob(dataurl) {
		var arr = dataurl.split(','),
			mime = arr[0].match(/:(.*?);/)[1],
			bstr = atob(arr[1]),
			len = bstr.length,
			u8arr = new Uint8Array(len);
		while (len--) u8arr[len] = bstr.charCodeAt(len);
		return new Blob([u8arr], {type: mime});
	}
	const ratio = window.devicePixelRatio || 1;
	config = Object.assign({}, defaultConfig, config);
	const { width, height, font, color, opacity, rotate, x } = config;
	const y = config.y || (width - 50) * ratio;
	el = el || window.document.body;
	const canvas = document.createElement('canvas');
	canvas.width = width * ratio;
	canvas.height = height * ratio;
	const ctx = canvas.getContext('2d');
	ctx.font = font.replace(/(\d+)px/g, (m, $1) => $1 * ratio + 'px');
	ctx.fillStyle = color;
	ctx.globalAlpha = opacity;
	// ctx.translate(ctx.width / 2, ctx.height / 2);
	ctx.rotate(rotate * Math.PI / 180);
	ctx.fillText(text, x, y);
	var base64 = canvas.toDataURL('image/png');
	var blob = dataURLtoBlob(base64);
	var url = URL.createObjectURL(blob);
	el.style.backgroundImage = `url(${url})`;
	el.style.backgroundSize = `${width}px ${height}px`;
	return url;
}
makeWatermark('小茗同学很帅!');

最简单使用:makeWatermark('小茗同学'),效果:

公告

多看书,多总结,少写代码!

欢迎访问小茗同学的博客!
您是本站第访客位访客!

这里所有博客都是我自己平时的学习笔记,错误和疏漏在所难免,欢迎大家评论中指正!

本站所有文章均可以随意转载,但需保留署名和原文链接,谢谢!

即日起,本站已启用全新域名 http://haoji.me(好记么)

站外链接

我的博客园
我的GitHub

标签

javascript(72) android(21) linux(19) css(13) plugin(13) java(12) 插件(11) windows(10) vscode(10) 安装(10) html(10) webview(9) reactnative(9) css3(9) nodejs(9) 区别(9) chrome(9) git(8) mysql(8) 下载(8) nginx(8) tomcat(8) 端口(7) 更多

随机推荐

  1. 清理DNS缓存(4538)
  2. HTML缓存设置(9866)
  3. 从什么时候开始流行2个空格缩进了!真想骂人!(5228)
  4. 大整数的加减法运算(JavaScript版)(7570)
  5. WCP知识库系统部署和使用总结(17134)
  6. CSS选择器的权重(3701)
  7. 经典老问题,CSS水平垂直居中的若干实现方式(4823)
  8. 关于IP地址定位的那些事儿(8519)
  9. 【重要通知】即日起,本站开始启用全新域名 haoji.me (好记么)!(4664)
  10. VSCode插件开发全攻略(一)概览(78921)

最新发表

  1. 纯CSS修改adm表单星号位置(183)
  2. 详谈DNS解析过程(206)
  3. 汉字转svg(340)
  4. 判断网页是否在微信中打开的一个坑(273)
  5. nunjucks语法简单总结(287)
  6. LightProxy/whistle 使用总结(463)
  7. 为iframe正名,你可能并不需要微前端(353)
  8. mockjs-fetch:加2行代码让你的mock.js支持fetch(348)
  9. 如何实现一个通用ajax拦截器(259)
  10. 浅析Egg路由的反向解析(346)

精品推荐

  1. 【干货】Chrome插件(扩展)开发全攻略(168326)
  2. VSCode插件开发全攻略(一)概览(78897)
  3. 【干货】JS版汉字与拼音互转终极方案,附简单的JS拼音输入法(31771)
  4. HTTPS从认识到线上实战全记录(12811)
  5. Lucene5.5.4入门以及基于Lucene实现博客搜索功能(12505)
  6. 分享自己写的JS版日期格式化和解析工具类,绝对好用!(7955)
  7. JavaScript常见原生DOM操作API总结(7747)
  8. ReactNative与NativeScript对比报告(6476)

统计信息

文章总数:488 篇
上线天数:2981 天
评论留言:1510 条

PHP网站源码惠州seo西乡外贸网站设计南山关键词按天计费坂田英文网站建设坑梓网站优化排名横岗seo网站优化大芬阿里店铺托管石岩百度网站优化爱联网站设计模板福永百搜词包吉祥百姓网标王南联百搜词包龙岗SEO按天收费平湖建网站大鹏英文网站建设西乡SEO按天收费龙岗网站开发惠州seo优化南澳百度关键词包年推广木棉湾网站搜索优化民治SEO按效果付费大鹏百姓网标王推广松岗网站建设大浪企业网站改版南澳建网站横岗百度网站优化排名惠州seo网站优化同乐网站优化推广双龙网站制作南山百度竞价歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化