人狠话不多,先看看图,是不是你需要的效果(文章最后有最终效果),样子有点点那个啥,将就着看一下就是了(图片来自网络):

测试代码如下

<!doctype html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title><script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
</head>
<body><div class="img-boxs">图片一<img crossOrigin="Anonymous" src="http://cdn2.jianshu.io/assets/default_avatar/8-a356878e44b45ab268a3b0bbaaadeeb7.jpg" width="300"   class="merging" alt="">图片二<img crossOrigin="Anonymous" src="https://t12.baidu.com/it/u=1341260975,315835678&fm=76" width="100" class="merging" alt=""><p>canvas拼接</p><canvas id="canvas"></canvas></div><button id="btn-merge">拼接</button><button id="save">保存</button>
</body>
<script>$(function () {var l_src = '';var $imgs = $('.img-boxs .merging'),$btnMerge = $('#btn-merge'),srcs = [],arr_img_w = [],arr_img_h = [],imgs_num = $imgs.length,loaded_img = 0;var loading = function () {console.log(imgs_num);for (let i = 0; i < imgs_num; i++) {try{if (!$($imgs[i])) {throw 'loading函数参数$imgs['+i+']不能为空';}srcs[i] = $($imgs[i]).attr("src");let _image = new Image();_image.onload = function(){arr_img_w[i] = (_image.width);arr_img_h[i] = (_image.height);};_image.src = srcs[i];//保存图片的原始宽高//不论图片加载完成还是失败都执行该函数$(_image).on('load error', function () {loadImage();});} catch (err) {alert("err");printError(err);}}function loadImage () {if (imgs_num === loaded_img) {return false;}loaded_img = Math.min(imgs_num, ++loaded_img);}};loading();$btnMerge.on('click', function () {mergeImages();});$("#save").on('click', function () {if(l_src){var dlLink = document.createElement('a');dlLink.download = "文件名.png";dlLink.href = l_src;dlLink.click();}else{alert("请先生成文件")}});function mergeImages () {try {if (loaded_img!==imgs_num && 2!==imgs_num) {throw '图片未加载完成或图片的数目不为2';return false;}var canvas = document.querySelector("#canvas"),temp_w = 0,temp_h = 0,ctx = {};canvas.width = getMaxofArray(arr_img_w);canvas.height = getMaxofArray(arr_img_h);console.log("width",arr_img_w,arr_img_h,canvas.width,canvas.height);ctx = canvas.getContext('2d');for (let i = 0; i < imgs_num; i++) {temp_w = arr_img_w[i];temp_h = arr_img_h[i];if (i == (imgs_num-1)) {console.log("...",canvas.width,temp_w);ctx.drawImage($imgs[i], 0, 0, temp_w, temp_h, canvas.width-temp_w, canvas.height-temp_h, temp_w, temp_h);} else {ctx.drawImage($imgs[i], 0,0,canvas.width,canvas.height,0,0,canvas.width,canvas.height);}}l_src = canvas.toDataURL('image/png');} catch (err) {printError(err);}}function getMaxofArray (elems) {try {if (!Array.isArray(elems)) {throw 'getMaxofArray函数的参数必须是数组';}} catch (err) {printError(err);}return Math.max.apply(null, elems);}function printError (msg) {console.log('error message:', msg);}});
</script>
</html>

注意点:

crossOrigin属性必须在src之前

图片加载完成的先后顺序不一定,所以代码中没有使用push,而是

_image.onload = function(){arr_img_w[i] = (_image.width);arr_img_h[i] = (_image.height);
};

以上的代码还存在一个问题,如果需要自动生成,而不是点击的话,需要判断图片是否加载完成

完整代码如下

<!doctype html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>蜀创助贷</title><script src="./js/jquery.min.js"></script><link rel="stylesheet" href="css/style.css">
</head>
<body>
<div class="box" id="outer"><img src="./img/bg.png" id="merge" width="100%" alt=""><div class="alert none" id="centerBox"><img src="#" id="head" width="200" alt="头像"><h3>长按保存头像</h3></div>
</div>
</body>
<script>$(function () {let $_REQUEST = new Object, aParams = document.location.search.substr(1).split("&");for (let i = 0; i < aParams.length; i++) {let aParam = aParams[i].split("=");$_REQUEST[aParam[0]] = aParam[1]}let srcs=["./img/bg.png","./img/logo.png",$_REQUEST["img"]];let imgDom=[];let arr_img_w=[];let arr_img_h=[];$("#outer").on('click', function () {let canvas2 = document.createElement("canvas");let ctx = {};canvas2.width = 1000;canvas2.height = 1000;ctx = canvas2.getContext('2d');ctx.drawImage(imgDom[2], 0,0,1000,1000);ctx.drawImage(imgDom[1], 0,0,1000,1000);let l_src = canvas2.toDataURL('image/png');$("#head").attr('src', l_src);$("#centerBox").toggleClass("none")});$("#btn-merge").on('click', function () {mergeImages();});
//        var loading = function () {
//            for (let i = 0; i < srcs.length; i++) {
//                try{
//                    let _image = new Image();
//                    _image.onload = function(){
//                        arr_img_w[i] = (_image.width);
//                        arr_img_h[i] = (_image.height);
//                    };
//                    _image.crossOrigin = "Anonymous";
//                    _image.src = srcs[i];
//                    imgDom.push(_image);
//
//                } catch (err) {
//                    alert("err");
//                }
//            }
//        };
//
//        function getMaxofArray (elems) {
//            try {
//                if (!Array.isArray(elems)) {
//                    throw 'getMaxofArray函数的参数必须是数组';
//                }
//            } catch (err) {
//                alert(err)
//            }
//            return Math.max.apply(null, elems);
//        }function mergeImages () {try {let canvas = document.createElement("canvas");let temp_w = 0;let temp_h = 0;let ctx = {};canvas.width = 640;canvas.height = 1008;ctx = canvas.getContext('2d');ctx.drawImage(imgDom[0], 0,0,640,1008,0,0,640,1008);ctx.drawImage(imgDom[2], 0,0,arr_img_w[2],arr_img_w[2],185,505,290,290);ctx.drawImage(imgDom[1], 0,0,arr_img_w[1],arr_img_h[1],180,500,300,300);let l_src = canvas.toDataURL('image/png');$("#merge").attr('src', l_src);} catch (err) {alert(err)}}function loadImg(url,i, cb) {let _image = new Image();_image.onload = function(){arr_img_w[i] = (_image.width);arr_img_h[i] = (_image.height);imgDom[i] = _image;cb();};_image.crossOrigin = "Anonymous";_image.src = srcs[i];}function loadImages(urlArr, afterAllLoadedFunc) {var count = urlArr.length;var loadedCount = 0;for (var i = count - 1; i >= 0; i--) {loadImg(urlArr[i],i, function () {loadedCount ++;if (count === loadedCount) {afterAllLoadedFunc();}});}}loadImages(srcs, function () {mergeImages()});})
</script>
</html>

看效果图

拼接前的图片:加上自己的头像

js使用canvas拼接图片相关推荐

  1. canvas拼接图片

    参考地址 canvas拼接图片 效果 横向拼接 纵向拼接 代码 html <!DOCTYPE html> <html lang="en"> <head ...

  2. html验证码图片,js+h5 canvas实现图片验证码

    本文实例为大家分享了js+h5 canvas实现图片验证码的具体代码,供大家参考,具体内容如下 实现效果 一.使用技术 原生js技术+html5 canvas画图 利用Math.random()函数随 ...

  3. js脚本替换拼接图片路径

    #js脚本,拼接图片路径 ##替换拼接页面中图片路径: -$(function () { $('img').each(function () { var imgpath = $(this).attr( ...

  4. vue canvas拼接图片(纵向)

    vue 图片竖向拼接组件代码 底部有demo <template><div><div><inputtype="file"id=" ...

  5. react canvas拼接图片(纵向)

    react 拼接图片代码 底部有demo import React from "react"; import "./App.css";function App( ...

  6. JS实现Canvas中图片淡出效果_艾孜尔江撰

    <!DOCTYPE html> <html><head><meta charset="UTF-8"><title>实现C ...

  7. 利用js结合canvas给图片打马赛克

    效果演示 什么是canvas? <canvas> 元素用于图形的绘制,只是图形容器. 元素本身并没有绘制能力,您必须使用js脚本来绘制图形. getContext() 方法可返回一个对象, ...

  8. js 利用canvas转换图片格式并下载图片

    1.利用canvas转换格式 思路很简单,就是在canvas上drawImage,然后再把canvas转换成想要的图片格式 convertImageToCanvas = (image) => { ...

  9. JS利用Canvas实现图片等比例裁剪、压缩

    最近在做一个政务类的移动端H5项目,用户体量达百万级别,有一个模块中有上传图片反馈的功能,由于各个手机产商拍照的像素值的都不一样,后台去浏览这个图片的时候就出现大小不一的情况,另外有些图片并不需要上传 ...

最新文章

  1. Java之父接受Evrone专访:您需要的软件可靠性越高,静态类型语言的帮助就越大...
  2. idea中链接mysql查询_在Idea中编写Java程序连接查询Sqlite数据库
  3. fastjson 输出null值字段
  4. IDEA创建.properties文件
  5. python3.x教程_Python3.x基础教程1
  6. 摩根IT实习经验谈及其他
  7. Linux下安装配置git
  8. 读取文件内容返回ListString类型
  9. windows下测试flask的例子tuorial报错flask KeyError: 'DATABASE'
  10. vs2019创建c语言,Visual Studio 2019安装、测试创建c语言项目(图文教程)
  11. docker学习之ssh连接
  12. matlab绘制雷达图
  13. 河南省第三届金盾信安杯网络安全大赛部分wp
  14. VMware Funsion 8.5.1破解版
  15. 一则两年前的可怕预言:2013年中国经济危机将爆发!
  16. 解读全部二十三种设计模式(附测试代码)
  17. 终于找到使用Sql Server Management Studio导致蓝屏的罪魁祸首了
  18. 二、IAR for ARM中STM32项目创建及其启动文件分析
  19. PCB电路板元件目标检测数据集(YOLO标签,1400张,9类目标)
  20. Deepin 系统使用记录:1. 修改启动项

热门文章

  1. 根据谐音自动转换英文名的网站~如何起一个流行、有意义的英文名?你的英文名有什么内在意义吗?
  2. Python转Oracle LOBs(CLOB/BLOB) 为String字符串
  3. 夸克浏览器有没有linux,我手机上唯一的浏览器——夸克浏览器
  4. 一个公司的管理之五:招聘的总结
  5. java 界面线性布局_Android UI基本测验:线性布局
  6. Excel表格如何换行,Leo老师来教你!
  7. 影视解说短视频制作教程:关于如何写文案和配音的详解
  8. win10计算机添加到桌面,win10系统我的电脑添加到桌面的操作方法
  9. 如何做一个微信公众号文章批量导出的下载器
  10. win11蓝屏提示nvlddmkmsys怎么解决 win11蓝屏错误代码nvlddmkmsys怎么修复