|    微信会话框

细心的前端们会发现如果你在微信里发一张和你当前背景一样的图片,那么微信的会给这张图片加边框,并且,右边的小三角是根据图片的位置截取的。很多前端会用backgroud或者clip-path来画,这样画出来的没法设置小边框。 所以需要我们“万能”的canvas!canvas!canvas!

示例图1

|    JS全部代码

我们分为两步:首先抠出圆角和会话角的边框,第二步根据需求压缩处理你的图片大小

需要的知识点:1:canvas画路径抠图;2:用图片填充你的抠出来的部分

最后效果是:在原图上抠出了你要的路径并且!还带边框哦!

总体流程:本机选择一张图 在页面上显示为我们想要的效果:

HTML:粘贴不过来很心塞。。。就截图吧

JS:

你先去试一试,然后来看讲解,毕竟要是用不了,岂不是很心塞。

var inputele = document.getElementById('inputele');

var reader = new FileReader(),

img = new Image();

var canvas = document.getElementById('canvasImg');

var ctx = canvas.getContext('2d');

reader.onload = function(e) {// 文件base64,可以看看结果

img.src = e.target.result;

};

inputele.addEventListener('change', function (e) {

var file = e.target.files[0];

if(file.size>=10000000){

window.alert("图片太大,请重新选择");

return;

}

if(file.size<=0){

window.alert("图片为0kb,请重新选择")

return;

}

reader.readAsDataURL(file);

});

if(canvas.getContext){

//获取对应的CanvasRenderingContext2D对象(画笔)

var ctx = canvas.getContext("2d");

var w1 = '';

var h1 = '';

CanvasRenderingContext2D.prototype.roundRect = function (x, y, w, h, r) {

if (w < 2 * r) r = w / 2;

if (h < 2 * r) r = h / 2;

this.beginPath();

this.moveTo(x+r, y);

this.arcTo(x+w, y, x+w, y+h, r);

ctx.lineTo(w, 13);

ctx.lineTo(w1, 19);

ctx.lineTo(w, 25);

this.arcTo(x+w, y+h, x,  y+h, r);

this.arcTo(x, y+h, x, y, r);

this.arcTo(x, y, x+w, y, r);

this.closePath();

this.clip();

ctx.drawImage(img, 0, 0,w1,h1);

ctx.restore();

return this;

}

// base64地址图片加载完毕后

img.onerror = function () {

alert("文件不是一个正确的图片")

return;

}

img.onload = function () {

var w = this.width, h = this.height;

var width = w, height = h;

var size = 400;

//生成一个画布,对画布的大小根据图片的大小计算

if (w >= h && w > size) { //宽 > 高

width = size;

height = size / w * h;

} else if (w < h && h > size) {

height = size;

width = size / h * w;

}

//计算的画布的大小

w1 = width;  h1 = height;

ctx.canvas.width = w1;  ctx.canvas.height= h1;

ctx.lineWidth = 1;

ctx.strokeStyle = '#F00';//用红色比较明显啦

ctx.roundRect(0,0,width-5,height-1,6).stroke();

//画完之后的画布就是压缩完之后的图片 canvas ;

//缩略图canvas转为二进制的数据用于上传

canvas.toBlob(function (blob) {

//这里填你的ajax上传步骤

});

};

};

|   以下是效果图两张

效果图1

效果图2

|    步骤详解

先来说画这个框框:来张优秀的步骤图对应每一步的代码:

优秀的步骤图

this.beginPath();

第一步画上和上右圆角的线  :this.moveTo(x+r, y);this.arcTo(x+w, y, x+w, y+h, r);

第二步画右边的小三角:ctx.lineTo(w, 13);ctx.lineTo(w1, 19);ctx.lineTo(w, 25);

第三步画右以及右下圆角的线:this.arcTo(x+w, y+h, x,  y+h, r);

第三步画下以及左下圆角的线:this.arcTo(x, y+h, x, y, r);

第三步画左以及左上圆角的线:this.arcTo(x, y, x+w, y, r);

画完了:this.closePath();

抠图!:this.clip();

然后就抠出了自己想要的图形,然后用你的图片填充就ok啦。

填充之前按照我们最爱的UI给的尺寸等比例放大缩小

if (w >= h && w > size) { //宽 > 高

width = size;

height = size / w * h;

} else if (w < h && h > size) {

height = size;

width = size / h * w;

}

填充就用我们的canvas的API  drawImage

ctx.drawImage(img, 0, 0,w1,h1);不论你的原图是多少像素,都会实现按照w1,h1的大小重绘,所以你右键下载一下对比之前原图的大小就会发现!!压缩了图片!!!所以顺便学习了压缩图片,很棒棒吧~~~

优秀的对比图

有用的话留言告诉大家~~~

ok啦~~~有什么问题留言解决

android+实现微信对话框样式,实现微信对话框的图片样式以及图片边框相关推荐

  1. Android高效率实现弹出带动画效果的对话框,仿照微信对话框效果

    转载请注明出处: http://blog.csdn.net/jakeyangchina/article/details/53423453 看到很多app页面里都有弹出对话框效果,今天使用PopupWi ...

  2. Android Activity 滑动返回。支持微信滑动返回样式、横屏滑动返回、全屏滑动返回

    BGASwipeBackLayout-Android 项目地址:bingoogolapple/BGASwipeBackLayout-Android  简介:Android Activity 滑动返回. ...

  3. Android 验证码和密码输入框,能自定义输入框个数和样式(连体,下划线和方形框) 类似微信支付宝的密码输入框等

    MNPasswordEditText 项目地址:maning0303/MNPasswordEditText  简介: Android 验证码和密码输入框,能自定义输入框个数和样式(连体,下划线和方形框 ...

  4. 微信小程序 简单自定义对话框

    前言 课堂学了点基础,就写了点东西,不严谨,权当记录一下. 演示效果 大都是绝对布局 没点击"修改个人资料"显示对话框时 点击"修改个人资料"后,显示自定义对话 ...

  5. Android挂逼修炼之行---微信摇骰子和猜拳作弊器原理解析

    一.前言 在之前的一篇文章中我们已经详细介绍了Android中Hook工作的一款神器Xposed工具:Xposed框架原理解析和使用案例分析 在那一篇文章中我们介绍了如何安装Xposed框架,以及如何 ...

  6. Android”挂逼”修炼之行—微信摇骰子和猜拳作弊器原理解析

    .猜想假设 本文就借助之前的Xposed框架来介绍如何编写微信的一个外挂功能,这个功能就是微信摇色子和剪刀石头布的作弊器,我们用过微信这个功能都知道,是一个比较常用的功能,因为在一个群聊中会很无聊就来 ...

  7. Android挂逼修炼之行---微信摇骰子和猜拳作弊器原理解析 (转载)

    该文章是我觉得当中的逆向方式以及使用工具的方式非常值得学习,转载只为记录下来,若侵则删. 一.前言 在之前的一篇文章中我们已经详细介绍了Android中Hook工作的一款神器Xposed工具:Xpos ...

  8. Android挂逼修炼之行---微信即刻视频下载插件开发原理详解

    一.前言分析 微信在7.0版本发布之后,我们可以看到有很大的改变,首先是UI上的变化,其次就是即刻视频,因为2018年是短视频火爆的一年,有抖音的强悍吸粉,连微信也开始担心社交地位以及用户的时间被强占 ...

  9. 微信小程序中wxml和wxss的样式说明,彻底搞定布局排版

    对于css不熟悉的Android程序员来说,开发微信小程序面临的一个比较困难的问题就是界面的排版了.微信小程序的排版就跟wxml和wxss有关了,它们两者相当于android的布局文件,其中wxml指 ...

  10. wxml修改样式_微信小程序wxml和wxss样式

    对于css不熟悉的Android程序员来说,开发微信小程序面临的一个比较困难的问题就是界面的排版了.微信小程序的排版就跟wxml和wxss有关了,它们两者相当于android的布局文件,其中wxml指 ...

最新文章

  1. Lua string库整理
  2. MySQL数据库基础(三)数据的导入导出、管理表记录、匹配条件
  3. FPGA浮点数定点化
  4. shell将命令执行的结果赋值给 变量
  5. python 一句话校验软件 hash值
  6. asp 下拉框二级联动
  7. jquery中的 $(function(){})
  8. activemq控制发送频率_发送activemq
  9. 今天的一切准备就绪的局域网聊天
  10. 外媒:特斯拉申请新商标 寻求进入餐饮业
  11. Controller接口控制器(2)
  12. 配置不成功_在windows下配置sendmail服务器
  13. 数字信号处理实验(六)—— 心电信号处理 IIR FIR滤波综合题(下篇)
  14. WPF 视频教程+笔记
  15. 手机输入法带拼音声调_五笔已经淘汰,拼音到达瓶颈,百度重拳出击,全新输入方式来袭!...
  16. Angular 依赖注入框架里 useExisting 和 useClass 的使用场景
  17. 储存卡数据怎么恢复?教你几招解决
  18. ajax 与form 表单连用 success不执行bug解决
  19. iframe框架下的子父级页面监控页面关闭事件
  20. ai领域职业规划_我如何抛弃我的咨询职业并进入技术领域

热门文章

  1. 剑指offe JZ18 删除链表的节点
  2. 最短路算法详解(Dijkstra/SPFA/Floyd)
  3. 基于vue前端聊天插件_基于Vue聊天的实现
  4. 创客教育的起源和内涵的基本理念
  5. 想在社会上混 就记住这20句
  6. 教你DIY中文增强版Geexbox,且安装为硬盘版
  7. ipad使用计算机的图片大全,三种方式备份 iPad 照片
  8. 谷歌发现利用零日漏洞的攻击、黑客通过漏洞入侵红十字会|2月17日全球网络安全热点
  9. Spring Security 退出登录(7)
  10. INFO Starting development server...98% after emitting CopyPlugin ERROR Failed to compile with