最近看到微博头像上传功能很感兴趣,于是就使用canvas写了一个,本文写的不好还请见谅。本程序目前在谷歌浏览器和火狐浏览器测试可用,ie浏览器无法支持。

因为ie的安全机制不允许img使用本地路径,所以若想ie支持本程序,必须先将图片上传,然后给img对象上传后的图片地址。

我在这里没写,是因为暂时没写上传功能的后端代码,并且还不确定有没有更好的解决办法。

如下是新浪的

如下是我做的截取部分

代码:

var canvas = document.getElementById('canvas'),

context = canvas.getContext('d'),

canvas = document.getElementById('canvas_dp'),

context = canvas.getContext('d'),

image = new Image(),//document.getElementById('myimg'),

imageData,

scale,//缩放比例

rubberbandRectangle = {left:,top:,width:,height:},

resize = ;

oldRubberbandRectangle = {};

dragging = false,

extending = false,

mousedown = {};

// Functions.....................................................

function windowToCanvas(canvas, x, y) {

var canvasRectangle = canvas.getBoundingClientRect();

return {

x: x - canvasRectangle.left,

y: y - canvasRectangle.top

};

}

//将截取的图片画在小的canvas中

function captureCanvasPixels() {

context.drawImage(image,rubberbandRectangle.left/scale,rubberbandRectangle.top/scale,rubberbandRectangle.width/scale,rubberbandRectangle.height/scale,,,,);

}

function drawRubberband() {

context.save();

context.beginPath();//开始新的路径

rect(rubberbandRectangle.left,

rubberbandRectangle.top,

rubberbandRectangle.width,

rubberbandRectangle.height);

context.fillStyle='rgba(,,,.)';

addRectanglePath();

context.fill();//填充路径

context.fillStyle='rgba(,,,)';

captureCanvasPixels();//将选取的图像copy到预览canvas中

context.beginPath();

context.strokeStyle = '#';

context.lineWidth = .;

context.arc(rubberbandRectangle.left+rubberbandRectangle.width,rubberbandRectangle.top+rubberbandRectangle.height,,,Math.PI*,true);

context.fill();//填充路径

context.stroke();//填充路径

context.restore();

}

function rect(x, y, w, h, direction){

if(direction){//逆时针

context.moveTo(x, y);

context.lineTo(x, y + h);

context.lineTo(x + w, y + h);

context.lineTo(x + w, y);

}else{//顺时针

context.moveTo(x, y);

context.lineTo(x + w, y);

context.lineTo(x + w, y + h);

context.lineTo(x, y + h);

}

context.closePath();

}

function addRectanglePath(){

rect(,,canvas.width,canvas.height,true);

}

function startDragging(loc){

mousedown.x = loc.x;

mousedown.y = loc.y;

oldRubberbandRectangle.left = rubberbandRectangle.left;

oldRubberbandRectangle.top = rubberbandRectangle.top;

}

function updateRubberbandRectangle(loc){

var left = oldRubberbandRectangle.left + loc.x-mousedown.x;

var top = oldRubberbandRectangle.top + loc.y - mousedown.y;

rubberbandRectangle.left = (left

rubberbandRectangle.top = (top < ) ? : top;

if(rubberbandRectangle.left + rubberbandRectangle.width > image.width * scale)rubberbandRectangle.left = image.width * scale - rubberbandRectangle.width;

if(rubberbandRectangle.top + rubberbandRectangle.height > image.height * scale)rubberbandRectangle.top = image.height * scale - rubberbandRectangle.height;

drawRubberband();

}

function startExtendSelection(loc){

mousedown.x = loc.x;

mousedown.y = loc.y;

oldRubberbandRectangle.width = rubberbandRectangle.width;

oldRubberbandRectangle.height = rubberbandRectangle.height;

}

function extendSelection(loc){

var width = parseInt(oldRubberbandRectangle.width) + parseInt(loc.x)-parseInt(mousedown.x);

var height = parseInt(parseInt(oldRubberbandRectangle.height) * parseInt(width)/parseInt(oldRubberbandRectangle.width));

rubberbandRectangle.width = width;

rubberbandRectangle.height = height;

drawRubberband();

}

function clearRubberbandRectangle(){

context.clearRect(, , canvas.width, canvas.height);

context.putImageData(imageData, ,);

}

// Event handlers...............................................

canvas.onmousedown = function(e){

e.preventDefault();

var loc = windowToCanvas(canvas, e.clientX, e.clientY);

if(rubberbandRectangle.left < loc.x && rubberbandRectangle.top < loc.y && (rubberbandRectangle.left + rubberbandRectangle.width) > loc.x && (rubberbandRectangle.top + rubberbandRectangle.height) > loc.y){

dragging = true;

startDragging(loc);

}else if((rubberbandRectangle.left + rubberbandRectangle.width - ) < loc.x && (rubberbandRectangle.top + rubberbandRectangle.height - ) < loc.y && (rubberbandRectangle.left + rubberbandRectangle.width +) > loc.x && (rubberbandRectangle.top + rubberbandRectangle.height + ) > loc.y){

extending = true;

startExtendSelection(loc);

}

}

canvas.onmousemove = function (e) {

e.preventDefault();

var loc = windowToCanvas(canvas, e.clientX, e.clientY);

if(rubberbandRectangle.left < loc.x && rubberbandRectangle.top < loc.y && (rubberbandRectangle.left + rubberbandRectangle.width) > loc.x && (rubberbandRectangle.top + rubberbandRectangle.height) > loc.y){

canvas.style.cursor='move';

}else if((rubberbandRectangle.left + rubberbandRectangle.width - ) < loc.x && (rubberbandRectangle.top + rubberbandRectangle.height - ) < loc.y && (rubberbandRectangle.left + rubberbandRectangle.width +) > loc.x && (rubberbandRectangle.top + rubberbandRectangle.height + ) > loc.y){

canvas.style.cursor='nw-resize';

}else{

canvas.style.cursor='';

}

if (dragging) {

clearRubberbandRectangle();

updateRubberbandRectangle(loc);

}

if(extending){

canvas.style.cursor='nw-resize';

clearRubberbandRectangle();

extendSelection(loc);

}

}

canvas.onmouseup = function(e){

e.preventDefault();

dragging = false;

extending = false;

}

// Initialization..............................................

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

myfileInput.οnchange=function(){

setImage(myfileInput);

};

function setImage(fileObj){

if (fileObj.files && fileObj.files[]) {

//火狐下,谷歌下都是支持的

image.src = window.URL.createObjectURL(fileObj.files[]);

} else {

alert('对不起,您的浏览器不支持');

}

}

image.src = '';

image.onload = function () {

console.log(image);

var w,h;

//计算图片缩放比例

if(image.width>canvas.width){

console.log();

w = canvas.width;

h = canvas.width*image.height/image.width

}else if(image.height>canvas.height){

console.log();

h = canvas.height;

w = canvas.height*image.width/mage.height

}else if(image.width/image.height >= canvas.width/canvas.height){

console.log();

w = canvas.width;

h = canvas.width*image.height/image.width;

}else if(image.width/image.height < canvas.width/canvas.height){

console.log();

w = canvas.height*image.width/image.height

h = canvas.height;

}

scale = w/image.width;

context.clearRect(,,canvas.width,canvas.height);

context.drawImage(image, , ,w, h);

console.log( w+':'+h+'###'+canvas.width+':'+canvas.height);

imageData= context.getImageData(, , canvas.width, canvas.height);

drawRubberband();

};

html

CarlZhang

以上代码很简单吧,附有注释,有不同见解的朋友,欢迎给我留言,共同交流学习进步。欲了解更多有关canvas头像截取上传问题,请持续关注本站,本站每天都有新的内容更新。

html头像裁剪仿微信,使用canvas实现仿新浪微博头像截取上传功能相关推荐

  1. 新浪微博 头像上传 php,使用canvas实现仿新浪微博头像截取上传功能_javascript技巧...

    最近看到微博头像上传功能很感兴趣,于是就使用canvas写了一个,本文写的不好还请见谅.本程序目前在谷歌浏览器和火狐浏览器测试可用,ie浏览器无法支持. 因为ie的安全机制不允许img使用本地路径,所 ...

  2. android com.mylhyl,Android 高仿微信朋友圈拍照上传功能

    模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy! 1. photopicker的使用 这是一个支持选择多张图片,点击图片放大,图片之间 ...

  3. android 微信高仿,Android 高仿微信朋友圈拍照上传功能

    模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy! 1. PhotoPicker的使用 这是一个支持选择多张图片,点击图片放大,图片之间 ...

  4. Android仿微信发送语音消息动态提示,支持上滑取消发送

    Android仿微信发送语音消息动态提示,支持上滑取消发送 先来几张图说明一下,简单直接: 是不是看了图片就秒懂 了. 下面来分析代码实现,直接撸代码. 主页面 AudioSendActivity.j ...

  5. html上传图片裁剪,基于HTML5+JS实现本地图片裁剪并上传功能

    基于HTML5+JS实现本地图片裁剪并上传功能 2019-01-07 编程之家 https://www.jb51.cc 编程之家收集整理的这篇文章主要介绍了基于HTML5+JS实现本地图片裁剪并上传功 ...

  6. 【Bootstrap-插件使用】Jcrop+fileinput组合实现头像上传功能

    作者:Dreawer 链接:https://zhuanlan.zhihu.com/p/24465742 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者:梦游的龙 ...

  7. [Bootstrap-插件使用]Jcrop+fileinput组合实现头像上传功能

    很久没有更新博客了,再不写点东西都烂了. 这次更新一个小内容,是两个插件的组合使用,实现头像上传功能. 业务需求: 头像上传功能,要对上传的文件进行剪切,且保证头像到服务器时必须是正方形的. 优化&l ...

  8. CANVAS运用-对图片的压缩上传(仅针对移动浏览器)

    最近在移动端设计头像上传功能时,原本是以<input type="file">直接通过formData上传,然而实际使用情况是:对于过大的图片(高像素手机所拍摄的照片等 ...

  9. php的注册头像上传,用Ajax实现注册与头像上传功能

    这次给大家带来用Ajax实现注册与头像上传功能,Ajax实现注册与头像上传功能的注意事项有哪些,下面就是实战案例,一起来看一下. 在初次接触ajax后,我们做了一个crm训练的项目,大多数小组都有注册 ...

最新文章

  1. java连接kafka api_Kafka-JavaAPI(Producer And Consumer)
  2. Esp32-CAM(ESP32带camera)使用说明
  3. java + selenium 种WebElement 定位到父元素 跟子元素
  4. apache.camel_使用Apache Camel 2.14的轻松REST端点
  5. T-SQL 之 执行顺序
  6. 计算机绘图理论试题库,CAD理论试卷及答案「最新」
  7. python能不能自动写代码_微软最强 Python 自动化工具开源了!不用写一行代码!...
  8. 谷歌插件IDM下载MODIS数据
  9. python 实现 n 次方_python实现pow函数(求n次幂,求n次方)
  10. 转载:王垠·程序员的心理疾病
  11. win7计算机属性里面的图标变白,Win7系统桌面图标白边如何解决
  12. PhotoShop,CSS 文字间距 与像素之间的换算
  13. 弹簧振子运动方程推导
  14. JSP 和 JavaBean 来实现一个简易计算器
  15. 部分大数据平台运维题及答案
  16. 什么是 Batch normalization
  17. 万字长文综述:文本增强技术的研究进展及应用实践
  18. GitHub 忘记SSH密钥
  19. 解决js脚本加载失败的问题
  20. MYSQL——为现有字段添加自增属性

热门文章

  1. 海兰一体计算机配置,海兰一体机进入bios 海兰一体机主板bios
  2. 腾讯是如何挑战360安全卫士霸主地位
  3. ubuntu下使用360随身wifi
  4. OFD、PDF电子发票同时打开预览
  5. MySQL调试--explain命令详解
  6. 爬虫Scrapy框架学习(三)-爬取苏宁图书信息案例
  7. 网络安全工程师薪资到底怎么样?
  8. 服务器vrrp协议,VRRP协议、Keepalived
  9. linux shell学习
  10. Gradle for Android 第一篇( 从 Gradle 和 AS 开始 )