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

其实就是将两张图片地址根据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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot-配置文件properties/yml分析+tomcat最大连接数及最大并发数

SpringBoot配置文件 yaml 中的数据是有序的&#xff0c;properties 中的数据是无序的&#xff0c;在一些需要路径匹配的配置中&#xff0c;顺序就显得尤为重要&#xff08;例如在 Spring Cloud Zuul 中的配置&#xff09;&#xff0c;此时一般采用 yaml。 Properties ①、位…

@各大高校|亚洲诚信TrustAsia接入CARSI,四大福利活动重磅来袭!

亚洲诚信TrustAsia EduPKI在CARSI平台正式上线&#xff0c;为广大CARSI成员校师生提供SSL证书和专业的技术服务支持&#xff0c;守卫高校安全&#xff01; 伴随着人工智能、大数据、物联网等新一代数字化技术的迅猛发展&#xff0c;教育信息化2.0和智慧校园建设得到快速推进。但…

日志存档及解析

网络中的每个设备都会生成大量日志数据&#xff0c;日志数据包含有关网络中发生的所有活动的关键信息&#xff0c;存储所有这些数据并对其进行管理对组织来说是一项挑战&#xff0c;因此&#xff0c;这些日志文件被压缩并存储在效率较低的存储介质中&#xff0c;无法轻松检索。…

将Agent技术的灵活性引入RPA,清华等发布自动化智能体ProAgent

近日&#xff0c;来自清华大学的研究人员联合面壁智能、中国人民大学、MIT、CMU 等机构共同发布了新一代流程自动化范式 “智能体流程自动化” Agentic Process Automation&#xff08;APA&#xff09;&#xff0c;结合大模型智能体帮助人类进行工作流构建&#xff0c;并让智能…

ZBrush 2024(三维数字雕刻软件)

ZBrush是一款Mac数字雕刻软件&#xff0c;它具有以下功能&#xff1a; 雕刻工具&#xff1a;ZBrush的雕刻工具非常强大&#xff0c;可以让用户在3D模型上进行雕刻&#xff0c;就像使用传统雕塑工具一样。高精度模型创建&#xff1a;ZBrush可以创建高精度的3D模型&#xff0c;适…

美创科技与南京大数据安全技术有限公司达成战略合作

近日&#xff0c;美创科技与南京大数据安全技术有限公司正式签署战略合作协议&#xff0c;优势力量共享、共拓共创共赢。 美创科技CEO柳遵梁、副总裁罗亮亮、副总裁王利强&#xff0c;南京大数据安全技术有限公司总经理潘杰、市场总监刘莉莎、销售总监王皓月、技术总监薛松等出…

基于STC12C5A60S2系列1T 8051单片的IIC总线器件数模芯片PCF8591实现模数转换应用

基于STC12C5A60S2系列1T 8051单片的IIC总线器件数模芯片PCF8591实现模数转换应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍IIC总线器件模数芯片PCF8591介绍通过I…

【Linux】Ubuntu16.04下安装python高版本--源码安装

Ubuntu16.04下完美安装python高版本及对应版本的pip 方法一:直接用命令安装python3.6&#xff08;但我没安装成功&#xff09; 好像是因为Ubuntu16.04的软件仓库&#xff08;源&#xff09;中python的最高版本就是python3.5&#xff0c;所以无法直接用apt来安装 #方法一 sudo…

在 el-table 中嵌入 el-checkbox el-input el-upload 多组件,实现复杂业务场景

由于业务场景的复杂性&#xff0c;需实现&#xff1a;在 el-table 表格中 嵌入 el-checkbox 多选框 及 el-input 输入框 及 el-upload 上传组件 &#xff0c;先附上实现效果图。 从图片可以看出其实就是一个规格可以带有多个属性的规格表&#xff0c;实现此效果需涉及到的知识点…

Flutter NestedScrollView 、SliverAppBar全解析,悬浮菜单的应用

在我们开发过程中经常会使用到悬浮菜单的使用&#xff0c;当我们滑动到指定位置后&#xff0c;菜单会自动悬浮。 实现效果如下&#xff08;左为滑动前、右为滑动后&#xff09;&#xff1a; 上述便是通过NestedScrollView 、SliverAppBar实现的效果&#xff0c;通过两个控件我…

二层、三层交换机之间到底有什么区别?

简单地说 二层交换机&#xff0c;没有充当三层网关角色的能力&#xff08;Capability&#xff09;。三层交换机&#xff0c;首先也是二层交换机。但是&#xff0c;它有一个额外的能力&#xff08;Capability&#xff09;&#xff0c;软件配置一下&#xff0c;可以充当三层网关…

新加坡金融科技节,IMF呼吁加快CBDCs数币的框架

CBDCS,那CBDC是什么呢&#xff1f; 中央银行数字货币 CBDC&#xff08;英文&#xff1a;Central Bank Digital Currency&#xff09;&#xff0c;指的是数字版本的国家货币. 我们现在经常听到的数字人民币&#xff0c;也就是中国的CBDC. 在传统与创新的交汇处&#xff0c;一种…

Python自动化测试之request库(五)

在做接口测试的过程中&#xff0c;我们经常会遇到参数关联&#xff0c;也就是我们经常所说的上一个接口返回是下一个接口的请求。 参数关联 在应用业务接口中&#xff0c;完成一个业务功能时&#xff0c;有时候一个接口可能不满足业务的整个流程逻辑&#xff0c;需要多个接口…

Linux线程创建,退出,等待

目录​​​​​​​ 一 为什么使用线程 1.1概念 1.2使用线程的理由 二 线程的创建&#xff0c;退出&#xff0c;等待 2.1 线程创建 2.2 线程退出 2.3.线程等待 2.4. 线程ID获取及比较 一 为什么使用线程 1.1概念 概念&#xff1a;"进程——资源分配的最小单位&…

拼多多商家私信群发脚本,按键精灵版工具,源码分享

也是用按键精灵写的&#xff0c;实现的功能就是通过图色识别拼多多商品列表然后逐个对商家客服进行私信&#xff0c;私信内容可以在脚本里面提前配置好&#xff0c;代码怎么部署&#xff1f;回答&#xff1a;粘贴到你的按键精灵就行了&#xff0c;因为代码完全开源。 UI界面&a…

uni-app 使用vscode开发uni-app

安装插件 uni-create-view 用于快速创建页面 配置插件 创建页面 输入页面名称&#xff0c;空格&#xff0c;顶部导航的标题&#xff0c;回车 自动生成页面并在pages.json中注册了路由 pages\login\login.vue <template><div class"login">login</d…

数字化医学影像管理系统PACS源码

PACS系统&#xff0c;意为影像归档和通信系统。它是应用在医院影像科室的系统&#xff0c;主要的任务就是把日常产生的各种医学影像&#xff08;包括核磁&#xff0c;CT&#xff0c;超声&#xff0c;各种X光机&#xff0c;各种红外仪、显微仪等设备产生的图像&#xff09;通过各…

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

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

SOLIDWORKS参数化设计之主参数设置

SOLIDWORKS参数化设计是通过主参数来驱动整个模型的变化&#xff0c;因此确定主参数是很重要的部分。主参数可以是数值&#xff0c;也可以是条件&#xff0c;可以手动输入&#xff0c;也可以做成下拉列表。今天我们就来看看主参数的下拉列表是如何做到的。 SolidKits.AutoWork…

2023-11-17 LeetCode每日一题(最大和查询)

2023-11-17每日一题 一、题目编号 2736. 最大和查询二、题目链接 点击跳转到题目位置 三、题目描述 给你两个长度为 n 、下标从 0 开始的整数数组 nums1 和 nums2 &#xff0c;另给你一个下标从 1 开始的二维数组 queries &#xff0c;其中 queries[i] [xi, yi] 。 对于…