前端实现两张图片合成,图片换背景,简单p图程序

news2024/9/23 11:22:10

前言

最近在自己做一个图文工具网站,图片背景替换功能,后台通过opencv的AI算法抠出了图片主元素,现在需要把抠出来的元素换一个背景色,或者合成到一张背景图片中,如何操作呢?
在这里插入图片描述
在这里插入图片描述

实现方式Demo

我考虑的是使用Canvas的绘图功能,建立一个Canvas对象,先将背景图片绘制上去,然后在把图片绘制上去。我的项目中是直接绘制颜色纯色的颜色块,不过原理是一样的。
代码Demo如下:

<!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>图片合成-demo</title>
  </head>
  <body>
    <div>
      <img id="cute_cat" src="./image.png" alt="猫猫"  crossorigin="anonymous"/>
      <img id="bgImg" src="./bg.jpg" alt="背景"  crossorigin="anonymous"/>
      <img id="cute_cat_bgImg" alt="合成图片"  crossorigin="anonymous"/>
    </div>
    <button onclick="drawPosterImage()">测试图片合成</button>
  </body>
</html>
<script>
  const qrcodeHTML = document.getElementById("cute_cat");
  const posterHTML = document.getElementById("bgImg");

  /**
   * 获取图片
   * @param imageHTML{HTMLElement} 对应的图片Html
   * @return {Promise<unknown>}
   */
  function readImage(imageHTML,resolve) {
    // return new Promise(resolve => {
    const Image1 = new Image();
    Image1.src = imageHTML.getAttribute("src");

    return new Promise((resolve) => {
      Image1.onload = function () {
        resolve(Image1);
      };
    });
  }

  const drawPosterImage = async function () {
    const canvas = document.createElement("canvas");
    // 海报模板的宽高
    const posterW = (canvas.width = posterHTML.offsetWidth);
    const posterH = (canvas.height = posterHTML.offsetHeight);
    posterHTML.clientHeight;

    // 获取了一个 2D 渲染上下文,用于在 canvas 元素上进行绘图操作。
    const context = canvas.getContext("2d");
    // 使用 rect() 方法绘制一个矩形
    context.rect(0, 0, canvas.width, canvas.height);
    // 设置了矩形的填充颜色为白色
    context.fillStyle = "#fff";
    // 使用fill()方法填充矩形,将矩形以指定的颜色进行填充
    context.fill();

    // 获取#poster图片
    const image2 = await readImage(posterHTML);
    context.drawImage(image2, 0, 0, posterW, posterH);
    // 获取#qrcode图片
    const image1 = await readImage(qrcodeHTML);
    context.drawImage(image1, 0, 0, qrcodeHTML.width, qrcodeHTML.height); // qrcode定位,根据需求修改

    // 获取canvas base64的图片流
    const base64 = canvas.toDataURL("image/png");
    document.getElementById("cute_cat_bgImg").setAttribute("src", base64);
  };
</script>

合成前:
在这里插入图片描述
合成后:
在这里插入图片描述
是不是很nice

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

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

相关文章

linux系统使用 docker 来部署运行 mysql5.7 并配置 docker-compose-mysql.yml 文件

Docker是一个开源的容器化平台&#xff0c;旨在简化应用程序的创建、部署和管理。它基于OS-level虚拟化技术&#xff0c;通过将应用程序和其依赖项打包到一个称为容器的标准化单元中&#xff0c;使得应用程序可以在任何环境中快速、可靠地运行。 Docker的优势有以下几个方面&a…

【解决问题】linux系统运行程序可以打印信息到屏幕,重定向到一个文件,文件中没有信息

在Linux系统中运行程序时&#xff0c;如果你发现程序打印的信息无法通过重定向写入到文件中&#xff0c;那么很可能是因为程序将信息打印到了标准错误流&#xff08;stderr&#xff09;&#xff0c;而不是标准输出流&#xff08;stdout&#xff09;。重定向操作通常只对标准输出…

20240826 每日AI必读资讯

突发&#xff01;IBM中国研发岗访问权限一夜关闭&#xff0c;千人或被裁 - IBM中国区一夜关闭了研发测试岗员工的内部权限&#xff0c;波及1000多名员工。 - 今年3月&#xff0c;IBM大中华区董事长陈旭东在媒体及分析师沟通会上表示&#xff0c;公司在IBM大中华区的战略将聚焦…

《重生到现代之从零开始的C语言生活》—— 指针4

字符指针变量 在指针类型中我们知道有一种指针类型为字符指针char* 如果我们想用他 int main() {char p w;char *d &p;return 0; }他可以存放字符变量的地址 也可以这么使用 int main() {char *d "hello"return 0 ; }其本质是把字符串"hello"的…

动态链接库——深入探讨C++程序中.so技术细节和实现方式及C程序中动静态库的区别(+工程分步骤编译库)

在开发中&#xff0c;动态链接库&#xff08;DLL&#xff09;和共享对象&#xff08;Shared Object&#xff09;.so文件的使用成为提升程序灵活性和重用性的关键手段。如下相关工具&#xff0c;GNU Libtool: 一种用于创建可移植共享库的工具。Dynamic Linker: 关于动态链接器的…

VSCode - 终端使用 code 命令

1、Command Shift P 调出 输入 shell 选择 安装命令 2、授权 3、使用 % code --version 1.92.1 eaa41d57266683296de7d214f574d0c2652e1fc4 arm64% code ~/.zshrc 伊织 2024-08-21&#xff08;三&#xff09;

6.InnoDB引擎

InnoDB引擎 1.逻辑存储结构2.架构2.1内存架构2.2 磁盘结构 3.事务原理3.1 事务3.2 redo log3.3undo log 4.MVCC4.1MVCC 基本概率14.2 实现原理 1.逻辑存储结构 2.架构 2.1内存架构 2.2 磁盘结构 create tablespace mytest add datafile mytest.idb engineinnodb;后台线程 mys…

Ubuntu 24.04 上安装和配置 Zabbix Agent

Zabbix 是一个强大的开源监控工具&#xff0c;可以帮助您跟踪服务器&#xff0c;网络和应用程序。在主机环境中配置了 Zabbix Server 之后&#xff0c;下一步是添加用于监视的远程主机。Zabbix Agent 从您的服务器收集数据并将其发送到 Zabbix 服务器进行监控。 本指南将向您展…

CUDA-BEVFusion(1): 环境安装

文章目录 1. 查看ubantu配置2. 环境安装2.1 安装包下载2.1.1 tensorRT 下载2.1.2 CUDA 下载2.1.3 cuDNN 下载2.2 安装2.2.1 cuda 安装2.2.2 cuDNN 安装2.2.3 tensorRT安装3. 安装包下载1. 查看ubantu配置 查看GPU的版本sudo apt-get install pciutilslspci | grep VGA查看linux…

Tabby 终端工具推荐

前言:Tabby 是一个现代化的、跨平台的终端模拟器&#xff0c;旨在提供增强的用户体验和定制功能。Tabby&#xff08;以前称为 Terminus&#xff09;被设计为比传统终端更加灵活和美观 Eugeny/tabby: A terminal for a more modern age (github.com)https://github.com/Eugeny/…

网络安全售前入门02——产品了解

目录 1.前言 2.WEB应用防火墙介绍 2.1产品架构功能 2.2应用场景 2.3部署形式 2.4产品价值 2.5选型依据 3.上网行为审计 3.1产品架构功能 3.2应用场景 3.3部署形式 3.4产品价值 3.5选型依据 后续 1.前言 为方便初接触网络安全售前工作的小伙伴了解网安行业情况,我…

BUUCTF PWN wp--ciscn_2019_n_1

第一步 checksec&#xff0c;并检查该题的保护机制 该题的保护机制如下&#xff1a; Arch (架构): amd64-64-little 这意味着这个二进制文件是为64位AMD64架构编译的&#xff0c;使用小端序&#xff08;little-endian&#xff09;。RELRO (重定位-read-only): Partial RELRO P…

工具技巧:如何使用AutoDL算力云

AutoDL算力云可以快速构建编程环境&#xff0c;价格也很实惠 模型运行已知需要显存少&#xff0c;可以考虑选择4090&#xff0c;有24G&#xff0c;具体选择哪种类型&#xff0c;可以看看重点看看这两方面**&#xff1a;数据盘能否扩容&#xff0c;CUDA版本是否够高** 根据自身…

虚拟化技术VirtualBox

虚拟化技术是当今云计算领域中的重要技术之一&#xff0c;而VirtualBox作为一款开源的虚拟化软件&#xff0c;在Linux系统中发挥着重要作用。本文将从VirtualBox的基本概念入手&#xff0c;介绍其在Linux系统中的应用和高级云计算技术&#xff0c;包括其原理、特点、优势、使用…

http基础原理及应用

三次握手 第一次 发送SYN报文 &#xff0c;传达信息&#xff0c;我想建立连接 第二次 回传SYNACK报文&#xff0c;传达信息 &#xff1a;好的可以建立链接 第三次 回传ACK报文 传到信息&#xff1a;好的&#xff0c;我知道了&#xff0c;哪我能连接&#xff0c;然后就建立连…

深入探讨Linux中的EncFS:安全、灵活的加密文件系统

在当今数字化时代&#xff0c;数据安全是任何组织和个人都不容忽视的重要问题。随着信息技术的发展&#xff0c;对数据的保护要求也日益提高。Linux操作系统作为开源社区的杰出产物&#xff0c;在提供各种安全工具和解决方案方面也颇具优势。其中&#xff0c;EncFS&#xff08;…

[指南]微软发布Windows-Linux双系统无法启动的完整修复方案

早前微软发布的 2024-08 例行安全更新导致 Windows-Linux 双系统无法启动引起关注&#xff0c;该问题实际上在 7 月份微软已经发现并且添加到已知问题列表中&#xff0c;但可能很多用户没注意结果安装更新后 Linux 系统无法正常启动。 问题根源在原本微软发布的补丁不应该针对…

使用vagrant、virtualbox、快速创建kali linux

使用vagrant、virtualbox、快速创建kali linux 初始化kali下载vagrant相应镜像vagrant添加相应镜像创建vagrantfile在vagrantfile根目录执行cmd虚拟机登录密码修改sshd配置 用shell远程链接(可选)可视化界面设置成中文创建成功展示图 添加实体网卡使用kali 破解WiFi密码解决 on…

网络安全教程初级指南

网络安全是当今最抢手的技能之一。如今&#xff0c;信息库如此庞大&#xff0c;节点网络也越来越庞大&#xff0c;网络安全的重要性也越来越高。 本网络安全教程适合初学者和专业人士。 在本教程中&#xff0c;您将学习有关网络安全的所有基本技能、工具和策略。 本网络安全…

【初阶数据结构】顺序表和链表算法题(上)

顺序表和链表算法题 1.顺序表1.1移除元素1.2删除有序数组中的重复项1.3合并两个有序数组 2.链表2.1移除链表元素2.2反转链表2.3链表的中间结点 1.顺序表 1.1移除元素 注意&#xff1a;返回的是元素个数&#xff0c;while循环不要少了等号 //https://leetcode.cn/problems/rem…