首页 > 其他分享 >图片作为Canvas贴图时要等图片加载完才可以读取canvas

图片作为Canvas贴图时要等图片加载完才可以读取canvas

时间:2024-08-27 10:56:29浏览次数:6  
标签:贴图 时要 canvas const sprite h1 THREE new 图片

一、效果

二、第一步:canvas.js中封装canvas函数,生成一个canvas对象,标注文字为参数name

unction createCanvas(name) {
    /**
     * 创建一个canvas对象,绘制几何图案或添加文字
     */
    const canvas = document.createElement("canvas");
    const arr = name.split(""); //分割为单独字符串
    let num = 0;
    const reg = /[\u4e00-\u9fa5]/;
    for (let i = 0; i < arr.length; i++) {
        if (reg.test(arr[i])) { //判断是不是汉字
            num += 1;
        } else {
            num += 0.5; //英文字母或数字累加0.5
        }
    }
    // 根据字符串符号类型和数量、文字font-size大小来设置canvas画布宽高度
    const h = 80; //根据渲染像素大小设置,过大性能差,过小不清晰
    const w = h + num * 32;
    canvas.width = w;
    canvas.height = h;
    const h1 = h * 0.8;
    const c = canvas.getContext('2d');
    // 定义轮廓颜色,黑色半透明
    c.fillStyle = "rgba(0,0,0,0.5)";
    // 绘制半圆+矩形轮廓
    const R = h1 / 2;
    c.arc(R, R, R, -Math.PI / 2, Math.PI / 2, true); //顺时针半圆
    c.arc(w - R, R, R, Math.PI / 2, -Math.PI / 2, true); //顺时针半圆
    c.fill();
    // 绘制箭头
    c.beginPath();
    const h2 = h - h1;
    c.moveTo(w / 2 - h2 * 0.6, h1);
    c.lineTo(w / 2 + h2 * 0.6, h1);
    c.lineTo(w / 2, h);
    c.fill();
    // 文字
    c.beginPath();
    c.translate(w / 2, h1 / 2);
    c.fillStyle = "#ffffff"; //文本填充颜色
    c.font = "normal 32px 宋体"; //字体样式设置
    c.textBaseline = "middle"; //文本与fillText定义的纵坐标
    c.textAlign = "center"; //文本居中(以fillText定义的横坐标)
    c.fillText(name, 0, 0);
    return canvas;
}
export default createCanvas;

三、第二步:在模型中调用

import * as THREE from 'three';
// 引入gltf模型加载库GLTFLoader.js
import {
  GLTFLoader
} from 'three/addons/loaders/GLTFLoader.js';
import createCanvas from './canvas.js'
const loader = new GLTFLoader(); //创建一个GLTF加载器
const model = new THREE.Group();

loader.load("../工厂.glb", function (gltf) {
  model.add(gltf.scene);

  const img = new Image();
  img.src = "./标签箭头背景.png";
  img.onload = function () {
    const canvas = createCanvas(img,'设备A');//创建一个canvas画布
    // 图片加载完成后,读取canvas像素数据创建CanvasTexture
    const texture = new THREE.CanvasTexture(canvas);
    const spriteMaterial = new THREE.SpriteMaterial({
      map: texture,
    });
    const sprite = new THREE.Sprite(spriteMaterial);
    const y = 4;//精灵y方向尺寸
    // sprite宽高比和canvas画布保持一致
    const x = canvas.width/canvas.height*y;//精灵x方向尺寸
    sprite.scale.set(x, y, 1);// 控制精灵大小
    sprite.position.y = y / 2; //标签底部箭头和空对象标注点重合  
    const obj = gltf.scene.getObjectByName('设备A标注'); // obj是建模软件中创建的一个空对象
    obj.add(sprite); //tag会标注在空对象obj对应的位置
  }
})

export default model;

标签:贴图,时要,canvas,const,sprite,h1,THREE,new,图片
From: https://blog.csdn.net/cui137610/article/details/141597360

相关文章

  • 图片工具箱:一键批量加水印,守护创意,提升效率!
    前言你是否曾在处理海量图片时,被繁琐的步骤和漫长的等待时间折磨得苦不堪言?是否梦想过拥有一款神器,能让你的图片处理工作变得轻松愉快,从此告别加班的烦恼,迎接升职加薪的曙光?那么,让我向你隆重介绍——图像工具箱!有了这款工具箱,将会发现,原来图像处理可以如此简单高效。它不仅......
  • 【Sceneform-EQR】scenefrom-eqr中的几种背景实现(不仅用于AR、三维场景,在图片、视频
    Sceneform-EQR简介Sceneform-EQR是EQ基于sceneform(filament)扩展的一个用于安卓端的三维渲染器。相关链接Git仓库Sceneform-EQR码云EQ-Renderer的示例工程EQ-R相关文档文档目录CSDN专栏几种背景实现方式示例工程Sceneform-EQR实现透明背景代码样例示例地址:Sc......
  • Java使用EasyExcel导出图片(原比例大小)到Excel中
    EasyExcel导出图片又开始写Excel导出的需求了,哈哈哈……目前的需求是将图表分析对的饼图和折线图,也就是一张完整的图片单独导出到Excel中为了方便客户在业务报告时,可以使用数据分析图片,从而更清晰准确地展示数据趋势因此关键点是将图片原比例尺寸大小导出,不能进行压缩原数......
  • OpenCV开发笔记(七十九):基于Stitcher类实现全景图片拼接
    前言  一个摄像头视野不大的时候,我们希望进行两个视野合并,这样让正视的视野增大,从而可以看到更广阔的标准视野。拼接的方法分为两条路,第一条路是stitcher类,第二条思路是特征点匹配。  本篇使用stitcher匹配,进行两张图来视野合并拼接。 Demo   两张图拼接过......
  • 点击屏幕新增一个按钮/图片等控件
    在日常代码编写中,有时候会遇到一些在页面中随机点击新增一个按钮,图片等控件或文字,此时我们需要用到如下代码代码如下html:js:1.先设置图片varimg=$('');img.attr('ID','myCarousels123');//设置图片源img.attr('src','/GateMana/FindImage?GateID='+obj.gateI......
  • 《机器学习》—— OpenCV 对图片的各种操作
    文章目录1、安装OpenCV库2、读取、显示、查看图片3、对图片进行切割4、改变图像的大小5、图片打码6、图片组合7、图像运算8、图像加权运算1、安装OpenCV库使用pip是最简单、最快捷的安装方式pipinstallopencv-python==3.4.2还需要安装一个包含了其他一些图像......
  • scrapy--图片管道-ImagesPipeline
    免责声明:本文仅做演示与分享~ 目录介绍 ImagesPipelinepipelines.pyitems.pyzz.pysettings.py介绍scrapy还提供了处理图片、视频、音频等媒体文件的插件,如:-scrapy-images:用于下载和处理图片-scrapy-video:用于下载和处理视频-scrapy-podcast:用于下载和处......
  • win10系统图片打开方式为照片查看器的方法
    众多win10用户都知道,当查看图片文件的时候,系统便会默认运行Metro风格的照片运用来打开图片。但是有许多用户更喜欢传统照片查看器来看图片,但是却不知道该怎么设置。小编今天这里就来为大家分享下设置win10系统图片打开方式为照片查看器的方法。工具/原料联想小......
  • 061、Vue3+TypeScript基础,插槽中增加图片和控制视频
    01、main.js代码如下://引入createApp用于创建Vue实例import{createApp}from'vue'//引入App.vue根组件importAppfrom'./App.vue'//引入emitter用于全局事件总线//importemitterfrom'@/utils/emitter'constapp=createApp(App);//App.vue的根元素id为......
  • C# 扫描并读取图片中的文字(.NET Core)
    本文介绍如何通过C#程序来扫描并读取图片中的文字,这里以创建一个.NetCore程序为例。下面是具体步骤,供参考。程序测试环境:VisualStudio版本要求不低于2017图片扫描工具:Spire.OCRfor.NET图片格式:png(这里的图片格式支持JPG、PNG、GIF、BMP、TIFF等格式)扫描的图片文字:中文(......