js 将多张图片合并成一张图片

news2024/11/25 22:41:44

其实就是将两张图片地址根据canvas组合在一起,我放到项目中因为会存在跨域问题,所以将图片转化成base64,后面还会带随机值,这样可避免图片跨域错误,正常情况下可以直接将图片放到canvas里面。

灵感来源:js 将多张图片合并成一张图片

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>BOM案例 图片放大</title>
    <script src="js/jquery-2.1.0.min.js"></script>

    <link rel="stylesheet" type="text/css" href="./viewer/viewer.css" />
    <script src="./viewer/viewer.js" type="text/javascript" charset="utf-8"></script>
</head>

<body>
    <img id="img1" src="img/1.jpg" width="350" height="700" />
    <img id="img2" src="img/2021.png" width="350" height="700" />
</body>

<script type="text/javascript">
    let img1Src = "";
    let img2Src = "";

    function getAjax(imageURL) {
        $.ajax({
            type: "GET",
            url: imageURL,
            beforeSend: function (xhr) {
                xhr.overrideMimeType('text/plain; charset=x-user-defined');
            },
            success: function (result, textStatus, jqXHR) {
                if (result.length < 1) {
                    alert("The thumbnail doesn't exist");
                    $("#thumbnail").attr("src", "data:image/png;base64,");
                    return
                }

                var binary = "";
                var responseText = jqXHR.responseText;
                var responseTextLen = responseText.length;

                for (i = 0; i < responseTextLen; i++) {
                    binary += String.fromCharCode(responseText.charCodeAt(i) & 255)
                }
                img1Src = "data:image/png;base64," + btoa(binary);
                // $("#thumbnail").attr("src", "data:image/png;base64," + btoa(binary));
            },
            error: function (xhr, textStatus, errorThrown) {
                alert("Error in getting document " + textStatus);
            }
        });
    }

    function getAjax2(imageURL) {
        $.ajax({
            type: "GET",
            url: imageURL,
            beforeSend: function (xhr) {
                xhr.overrideMimeType('text/plain; charset=x-user-defined');
            },
            success: function (result, textStatus, jqXHR) {
                if (result.length < 1) {
                    alert("The thumbnail doesn't exist");
                    $("#thumbnail").attr("src", "data:image/png;base64,");
                    return
                }

                var binary = "";
                var responseText = jqXHR.responseText;
                var responseTextLen = responseText.length;

                for (i = 0; i < responseTextLen; i++) {
                    binary += String.fromCharCode(responseText.charCodeAt(i) & 255)
                }
                img2Src = "data:image/png;base64," + btoa(binary);
                // $("#thumbnail").attr("src", "data:image/png;base64," + btoa(binary));
            },
            error: function (xhr, textStatus, errorThrown) {
                alert("Error in getting document " + textStatus);
            }
        });
    }

    getAjax('https://www.chinamdvr.com:9201/v1/api/mgmt/deviceSetup/attachment/2023-10-31/01_0180fb8afe5f4241a26ef98902038fd1_184410_00.jpg');
    getAjax2('https://www.chinamdvr.com:9201/v1/api/mgmt/deviceSetup/attachment/2023-10-31/01_11f3e7e9412643b39e7a88ed13bcf67b_002216_00.jpg');

    setTimeout(function () {
        drawAndShareImage("我是文字111", "我是文字222", "设备与行驶证合照");
    }, 500)

    // 将两张图片拼在一起
    function drawAndShareImage(li1, li2, title) {
        let fontPosition = 30; // 字体需要在上面,不影响图片信息

        var canvas = document.createElement("canvas");
        canvas.width = 800;
        canvas.height = 800 + fontPosition;

        var context = canvas.getContext("2d");
        context.rect(0, 0, canvas.width, canvas.height);
        context.fillStyle = "#fff";
        context.font = "28px serif";
        context.fill();

        console.log(img1Src.length)
        console.log(img2Src.length)

        if (img1Src.length == 0) {
            console.log("现在的版本没有图片")
            var myImage2 = new Image();
            // 解决跨域问题
            myImage2.setAttribute('crossOrigin', 'anonymous');
            myImage2.src = img2Src;//你自己本地的图片或者在线图片
            myImage2.crossOrigin = 'Anonymous';
            myImage2.onload = function () {

                context.drawImage(myImage2, fontPosition, fontPosition, canvas.width - fontPosition - fontPosition, canvas.height - fontPosition - fontPosition); // 第二张图片的位置  margin-left margin-top width height
                context.fillStyle = '#000';
                context.fillText(li2, canvas.width / 2.5, 25); // 第二个图片的文字信息
                context.fillText(title, canvas.width / 3, canvas.height - 5); // 第三个图片的文字信息

                var base64 = canvas.toDataURL("image/png");//"image/png"这里注意一下
                const imgDom = document.createElement('img');
                imgDom.src = base64;
                imgDom.id = "imgimg";
                imgDom.style.display = "none";
                document.body.appendChild(imgDom);

                var viewer = new Viewer(document.getElementById('imgimg'), {
                    url: 'src'
                });
                $("#imgimg").click();
            }
        } else if (img2Src.length == 0) {
            console.log("历史的版本没有图片")
            var myImage = new Image();
            // 解决跨域问题
            myImage.setAttribute('crossOrigin', 'anonymous');
            myImage.src = img1Src;//你自己本地的图片或者在线图片
            myImage.crossOrigin = 'Anonymous';
            myImage.onload = function () {

                context.drawImage(myImage, fontPosition, fontPosition, canvas.width - fontPosition - fontPosition, canvas.height - fontPosition - fontPosition); // 第二张图片的位置  margin-left margin-top width height
                context.fillStyle = '#000';
                context.fillText(li1, canvas.width / 2.5, 25); // 第二个图片的文字信息
                context.fillText(title, canvas.width / 3, canvas.height - 5); // 第三个图片的文字信息

                var base64 = canvas.toDataURL("image/png");//"image/png"这里注意一下
                const imgDom = document.createElement('img');
                imgDom.src = base64;
                imgDom.id = "imgimg";
                imgDom.style.display = "none";
                document.body.appendChild(imgDom);

                var viewer = new Viewer(document.getElementById('imgimg'), {
                    url: 'src'
                });
                $("#imgimg").click();
            }
        } else {
            console.log("都有图片")
            var myImage = new Image();
            // 解决跨域问题
            myImage.setAttribute('crossOrigin', 'anonymous');
            myImage.src = img1Src;//背景图片你自己本地的图片或者在线图片
            myImage.crossOrigin = 'Anonymous';
            // 两张图片合并成一张代码

            myImage.onload = function () {

                context.drawImage(myImage, 0, fontPosition, (canvas.width / 2) - 5, canvas.height - fontPosition - fontPosition); // 第一张图片的位置  margin-left margin-top width height
                context.fillStyle = '#000';
                context.fillText(li1, canvas.width / 5, 25); // 第一个图片的文字信息
                context.fillText(title, canvas.width / 3, canvas.height - 5); // 第三个图片的文字信息

                var myImage2 = new Image();
                // 解决跨域问题
                myImage2.setAttribute('crossOrigin', 'anonymous');
                myImage2.src = img2Src;//你自己本地的图片或者在线图片
                myImage2.crossOrigin = 'Anonymous';
                myImage2.onload = function () {

                    context.drawImage(myImage2, (canvas.width / 2) + 5, fontPosition, (canvas.width / 2) - 5, canvas.height - fontPosition - fontPosition); // 第二张图片的位置  margin-left margin-top width height
                    context.fillStyle = '#000';
                    context.fillText(li2, canvas.width - canvas.width / 3, 25); // 第二个图片的文字信息
                    context.fillText(title, canvas.width / 3, canvas.height - 5); // 第三个图片的文字信息

                    var base64 = canvas.toDataURL("image/png");//"image/png"这里注意一下
                    const imgDom = document.createElement('img');
                    imgDom.src = base64;
                    imgDom.id = "imgimg" + Math.floor(Math.random() * 60);
                    imgDom.style.display = "none";
                    document.body.appendChild(imgDom);

                    console.log(imgDom.id)

                    var viewer = new Viewer(document.getElementById(imgDom.id), {
                        url: 'src'
                    });
                    $("#" + imgDom.id).click();

                }
            }
        }
    }

    // getImage("https://www.chinamdvr.com:9201/v1/api/mgmt/deviceSetup/attachment/2023-10-31/01_0180fb8afe5f4241a26ef98902038fd1_184410_00.jpg")
    // getImage2("https://www.chinamdvr.com:9201/v1/api/mgmt/deviceSetup/attachment/2023-10-31/01_11f3e7e9412643b39e7a88ed13bcf67b_002216_00.jpg")

    // function getImage(url) {
    //     const xhr = new XMLHttpRequest()
    //     xhr.onload = function () {
    //         const url_blob = URL.createObjectURL(this.response)
    //         const image = new Image()
    //         image.src = url_blob;
    //         img1Src = url_blob;
    //     }
    //     // url 图片的地址
    //     xhr.open('GET', url, true)
    //     xhr.responseType = 'blob'
    //     xhr.send()
    // }

    // function getImage2(url) {
    //     const xhr = new XMLHttpRequest()
    //     xhr.onload = function () {
    //         const url_blob = URL.createObjectURL(this.response)
    //         const image = new Image()
    //         image.src = url_blob;
    //         img2Src = url_blob;
    //     }
    //     // url 图片的地址
    //     xhr.open('GET', url, true)
    //     xhr.responseType = 'blob'
    //     xhr.send()
    // }
    
    // function drawAndShareImage(li1, li2, title) {
    //     let fontPosition = 30; // 字体需要在上面,不影响图片信息

    //     var canvas = document.createElement("canvas");
    //     canvas.width = 800;
    //     canvas.height = 800 + fontPosition;

    //     var context = canvas.getContext("2d");
    //     context.rect(0, 0, canvas.width, canvas.height);
    //     context.fillStyle = "#fff";
    //     context.font = "28px serif";
    //     context.fill();

    //     var myImage = new Image();
    //     // 解决跨域问题
    //     myImage.setAttribute('crossOrigin', 'anonymous');
    //     myImage.src = img1Src;//背景图片你自己本地的图片或者在线图片
    //     myImage.crossOrigin = 'Anonymous';
    //     // 两张图片合并成一张代码

    //     myImage.onload = function () {

    //         context.drawImage(myImage, 0, fontPosition, canvas.width / 2, canvas.height - fontPosition - fontPosition); // 第一张图片的位置  margin-left margin-top width height
    //         context.fillStyle = '#000';
    //         context.fillText(li1, canvas.width / 5, 25); // 第一个图片的文字信息

    //         var myImage2 = new Image();
    //         // 解决跨域问题
    //         myImage2.setAttribute('crossOrigin', 'anonymous');
    //         myImage2.src = img2Src;//你自己本地的图片或者在线图片
    //         myImage2.crossOrigin = 'Anonymous';
    //         myImage2.onload = function () {

    //             context.drawImage(myImage2, (canvas.width / 2) + 1, fontPosition, (canvas.width / 2) - 1, canvas.height - fontPosition - fontPosition); // 第二张图片的位置  margin-left margin-top width height
    //             context.fillStyle = '#000';
    //             context.fillText(li2, canvas.width - canvas.width / 3, 25); // 第二个图片的文字信息
    //             context.fillText(title, canvas.width / 3, canvas.height - 5); // 第三个图片的文字信息

    //             var base64 = canvas.toDataURL("image/png");//"image/png"这里注意一下
    //             const imgDom = document.createElement('img');
    //             imgDom.src = base64;
    //             imgDom.id = "imgimg";
    //             imgDom.style.display = "none";
    //             document.body.appendChild(imgDom);

    //             var viewer = new Viewer(document.getElementById('imgimg'), {
    //                 url: 'src'
    //             });
    //             $("#imgimg").click();

    //         }
    //     }
    // }


    // function getBase64Image (src) {
    //     return new Promise(resolve => {
    //         const img = new Image()
    //         img.crossOrigin = ''
    //         img.src = src
    //         img.onload = function () {
    //             const canvas = document.createElement('canvas')
    //             canvas.width = img.width
    //             canvas.height = img.height
    //             const ctx = canvas.getContext('2d')
    //             ctx?.drawImage(img, 0, 0, img.width, img.height)
    //             const ext = img.src.substring(img.src.lastIndexOf('.') + 1).toLowerCase()
    //             const dataURL = canvas.toDataURL('image/' + ext)
    //             console.log(dataURL)
    //             $("#img1").attr("src", dataURL)
    //             resolve(dataURL)
    //         }
    //     })
    // }
    // getBase64Image("https://www.chinamdvr.com:9201/v1/api/mgmt/deviceSetup/attachment/2023-10-31/01_0180fb8afe5f4241a26ef98902038fd1_184410_00.jpg")

    

    // 将两张图片拼在一起
    // function drawAndShareImage(img1, img2) {

    //     var canvas = document.createElement("canvas");
    //     canvas.width = 700;
    //     canvas.height = 700;

    //     var context = canvas.getContext("2d");
    //     context.rect(0, 0, 350, 350);
    //     context.fillStyle = "#fff";
    //     context.fill();

    //     var myImage = new Image();
    //     myImage.src = img1;//背景图片你自己本地的图片或者在线图片
    //     myImage.crossOrigin = 'Anonymous';
    //     // 两张图片合并成一张代码

    //     myImage.onload = function () {

    //         context.drawImage(myImage, 0, 0, 350, 350); // 第一张图片的位置  margin-left margin-top width height
    //         context.font = "20px";
    //         context.fillText("我是文字", 150, 150); // 第一个图片的文字信息

    //         var myImage2 = new Image();
    //         myImage2.src = img2;//你自己本地的图片或者在线图片
    //         myImage2.crossOrigin = 'Anonymous';
    //         myImage2.onload = function () {

    //             context.drawImage(myImage2, 350, 0, 350, 350); // 第一张图片的位置  margin-left margin-top width height
    //             context.font = "20px";
    //             context.fillText("我是文字", 450, 150); // 第二个图片的文字信息

    //             var base64 = canvas.toDataURL("image/png");//"image/png"这里注意一下
    //             const imgDom = document.createElement('img');
    //             imgDom.src = base64;
    //             document.body.appendChild(imgDom);

    //             return base64
    //         }

    //     }

    // }
</script>

</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1219579.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022年蓝桥杯STEMA 计算思维组模拟练习试卷8(U10 级,约小学 3-4 年级)

1、北京冬奥会经历 17&#xff08; &#xff09;&#xff0c;中国体育代表团收获的金牌数和奖牌数均创历史新高 A、年 B、月 C、天 D、小时 答案&#xff1a;C 2、下面图形的周长是多少 m A、8 B、10 C、15 D、20 答案&#xff1a;D 3、小马虎在练习竖式计算&#xff0…

如何提升软件测试效率?本文为你揭示秘密

在软件开发中&#xff0c;测试是至关重要的一个环节。它能帮助我们发现并修复问题&#xff0c;从而确保我们提供的软件具有高质量。然而&#xff0c;测试过程往往费时费力。那么&#xff0c;有没有方法可以提升我们的软件测试效率呢&#xff1f;答案是肯定的。下面&#xff0c;…

前端uniapp列表下拉到底部加载下一页列表【下拉加载页面/带源码/实战】

目录 一. 图片1.2. 二.list.vue三.uni-load-more.vue最后 一. 图片 1. 2. 二.list.vue <template><view><!--列表--><scroll-view scroll-y"true" class"scroll-Y" :style"height: scrollviewHigh px;" lower-threshol…

怎么用领英开发客户?分享领英开发客户的方法和技巧

对于绝大多数外贸业务员来说&#xff0c;领英(LinkedIn)是一个非常重要且有效的客户开发渠道。在领英这个平台&#xff0c;如果你掌握了开发客户的方法&#xff0c;那么营销推广产品或服务的终极目标就有很大可能的实现&#xff01;其实真正上手并不难&#xff0c;因为平台内有…

07.智慧商城——商品详情页、加入购物车、拦截器封装token

01. 商品详情 - 静态布局 静态结构 和 样式 <template><div class"prodetail"><van-nav-bar fixed title"商品详情页" left-arrow click-left"$router.go(-1)" /><van-swipe :autoplay"3000" change"onCha…

Python在函数中使用列表作为默认参数

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 在学习中遇到的Python的一个坑&#xff0c;那就是使用列表作为默认参数。 我们知道&#xff0c;在Python中&#xff0c;列表&#xff08;list&#xff09;是可变…

融云五大场景化能力,全面赋能金融行业数智化转型

在高知识密度与大数据处理双向奔赴&#xff0c;「金融大模型」如何推动行业进化&#xff1f;一文中&#xff0c;我们分享了大模型在金融行业的赋能实践和未来场景。关注【融云 RongCloud】&#xff0c;了解协同办公平台更多干货。 其中&#xff0c;融云作为通信服务商&#xf…

开放式耳机和骨传导耳机有什么区别?哪款值得入手?

开放式耳机和骨传导耳机最大的区别就是佩戴方式不同和传声方式不同&#xff0c;相比之下骨传导耳机更值得入手一些。但其实骨传导耳机也是开放式耳机&#xff0c;下面先了解下开放式耳机都有哪几种。 一、开放式耳机分哪几种&#xff1f; 开放式耳机分为气传导和骨传导。这两种…

这样跟国外客户说可能更好

所说最近的一些沟通感受&#xff0c;不知道大家有没有这样的感觉&#xff0c;每当客户说让价格便宜点的时候&#xff0c;我们习惯性的去问定量&#xff0c;如果客户的定量的确也增加不上来&#xff0c;我们可能会直接回复“sorry, we can not ..." 其实本身这句话并没有毛…

PVP2 ProVideoPlayer 2.1.6(PVP2多屏幕演示投放软件)

PVP2 ProVideoPlayer2是一款视频播放和管理软件&#xff0c;旨在帮助用户实现多屏幕视频播放和内容管理。它被广泛应用于演出、活动、会议等场合&#xff0c;可以同时播放多个视频、图像和音频文件&#xff0c;并提供强大的控制和管理功能。 PVP2 ProVideoPlayer2具有直观的用…

使用express连接MySQL数据库编写基础的增、删、改、查、分页等接口

使用express连接MySQL数据库编写基础的增、删、改、查、分页接口 安装express-generator生成器 cnpm install -g express-generator通过生成器创建项目 express peifang-server切换至serverAPI目录 cd peifang-server下载所需依赖 cnpm install 运行项目 npm start访问项…

uniapp 手动调用form表单submit事件

背景&#xff1a; UI把提交的按钮弄成了图片&#xff0c;之前的button不能用了。 <button form-type"submit">搜索</button> 实现&#xff1a; html&#xff1a; 通过 this.$refs.fd 获取到form的vue对象。手动调用里面的_onSubmit()方法。 methods:…

掌握苏宁API,一键获取商品详情,解锁无尽商业可能

苏宁的API接口可以用于获取商品详情。以下是一个示例的API接口&#xff0c;通过商品ID获取商品详情&#xff1a; https://open.suning.com/api/content/product/getById?productId商品ID&appKey你的应用密钥&sign你的签名&formatjson 在上面的接口中&#xff0c…

无人智能货柜:引领便捷购物新体验

无人智能货柜&#xff1a;引领便捷购物新体验 无人智能货柜利用人工智能技术&#xff0c;将传统货架与电子商务相结合&#xff0c;形成智能销售终端。其采用先拿货后付款的购物模式&#xff0c;用户只需扫码、拿货、关门三个简洁流畅的步骤&#xff0c;极大地提升了消费者的购物…

文心一言 VS 讯飞星火 VS chatgpt (137)-- 算法导论11.3 3题

三、用go语言&#xff0c;考虑除法散列法的另一种版本&#xff0c;其中 h(k) k mod m&#xff0c;m 2 p − 1 2^p-1 2p−1&#xff0c;k为按基数 2 p 2^p 2p 表示的字符串。试证明:如果串可由串 y 通过其自身的字符置换排列导出&#xff0c;则x和y具有相同的散列值。给出一个…

Python基础入门---conda 如何管理依赖包以及复制相同环境的

文章目录 创建虚拟环境:创建虚拟环境并指定Python版本:安装依赖包:从环境导出依赖包清单:从依赖包清单创建环境:复制环境:移植环境:在Conda中,你可以使用conda create命令来创建和管理虚拟环境,而使用conda install命令来安装和管理依赖包。以下是一些基本的命令和步骤…

工业镜头中的远心镜头与普通镜头的光路

普通镜头&#xff1a; 主光线与镜头光轴有角度&#xff0c;工件上下移动时&#xff0c;像的大小有变化。 FOV&#xff1e;镜头前端直径。 物方远心镜头&#xff1a; 物方主光线平行于光轴&#xff0c;物距发生改变时&#xff0c;像高不会发生改变&#xff0c;测得的物体尺寸大…

技术实践|高斯集群服务器双缺省网关故障分析

导语&#xff1a;当前国产化数据库使用范围越来越广泛&#xff0c;在GaussDB数据库的使用过程中难免会遇到一些问题&#xff0c;有的问题是由于在安装过程中没有注意细节而产生的&#xff0c;多数隐患问题都是在特定场景下才会暴露出来&#xff0c;且暴露的时间未知&#xff0c…

MessageSourceUtil读取资源文件

在处理返回值提示的时候&#xff0c;需要根据local返回中文或者英文&#xff0c;因此要使用到国际化内容 操作 1&#xff0c;新建资源文件 在src/main/resources源文件夹下创建一个i18n的子目录&#xff0c; 然后创建中文和英文对应properties文件&#xff0c;然后输入自己的…

如何定位判断是前端的bug还是后端bug?

前言 随着开发软件趋向于大型化复杂化&#xff0c;软件测试逐渐成为一个专业&#xff0c;需要运用专门的方法和手段&#xff0c;需要专门人才来管理。但是外面的小道消息总是在传&#xff1a;软件测试就只是找bug的&#xff01;这个我可就不同意了~ 软件测试员是找bug&#x…