• 解决Canvas画布跨域图片方法


    Canvas 是前端开发中一个非常强大的工具,通过生成标签海报绘制等,但也会遇到很多问题,例如海报报错,海报绘制大小,生成海报等一系列问题,下面介绍如何将图片绘制海报失败,产生跨域的问题。它有一个限制:跨域图片。当你试图在 Canvas 中操作来自其他域的图片时,通常会遇到跨域问题。

    一、跨域问题的原因:

            浏览器出于安全考虑,实施了同源策略(Same-Origin Policy),这意味着如果你的页面来自一个域(例如 https://yourwebsite.com),它不能直接访问不同域(例如 https://anotherwebsite.com)的资源,包括图片。这会导致 Canvas 在尝试绘制跨域图片时失败。

    二、解决的方法:

    服务器代理

    一种解决方法是通过在你的服务器上设置代理,将跨域图片请求发送到你的服务器,然后由服务器代为请求该图片并返回给你的页面。这样,你就绕过了浏览器的同源策略。

    1. const express = require('express');
    2. const axios = require('axios');
    3. const app = express();
    4. const port = 3000;
    5. app.get('/proxy-image', async (req, res) => {
    6. try {
    7. const imageUrl = req.query.url;
    8. const response = await axios.get(imageUrl, { responseType: 'arraybuffer' });
    9. const data = Buffer.from(response.data, 'binary').toString('base64');
    10. res.send(`data:image/png;base64,${data}`);
    11. } catch (error) {
    12. res.status(500).send('Error fetching image');
    13. }
    14. });
    15. app.listen(port, () => {
    16. console.log(`Proxy server is running on port ${port}`);
    17. });

    CORS 头信息

    过设置服务器上的 CORS(跨域资源共享)头信息来实现。服务器应该在响应中包含以下头信息:

    Access-Control-Allow-Origin: *
    

    将图片转成 Base64 数据

    1. const img = new Image();
    2. image2Base64(' // https://fuss10.elemecdn.com/a/3f/3302e58f9a181d2509f3dc0fa68b0jpeg.jpeg').then(base64 => {
    3. console.log("base64-------------")
    4. console.log(base64)
    5. img.src =base64
    6. img.crossOrigin = '*'
    7. img.onload = () => resolve(img)
    8. img.onerror = () =>{
    9. img.src = '/img/admin/error1.jpg';
    10. }
    11. })
    12. function image2Base64(img) {//导入的图片路径https://fuss10.elemecdn.com/a/3f/3302e58f9a181d2509f3dc0fa68b0jpeg.jpeg
    13. var toBase64= new Promise(function(resolve, reject){
    14. window.URL = window.URL || window.webkitURL;
    15. var xhr = new XMLHttpRequest();
    16. xhr.open("get", img, true);
    17. // 至关重要
    18. xhr.responseType = "blob";//文件流
    19. xhr.onload = function (res) {
    20. if (res.currentTarget.status == 200) {
    21. //得到一个blob对象
    22. var blob = res.currentTarget.response;
    23. // 至关重要
    24. let oFileReader = new FileReader();
    25. oFileReader.onloadend = function (e) {
    26. let base64 = e.target.result;//base64
    27. resolve(base64)
    28. };
    29. oFileReader.readAsDataURL(blob);
    30. }
    31. }
    32. xhr.send();
    33. });
    34. console.log("toBase64")
    35. console.log(toBase64)
    36. return toBase64;
    37. }

    这将创建一个 Base64 编码的图片对象,你可以将其绘制到 Canvas 上,但过大的图片不建议转换,会影响效率。

  • 相关阅读:
    〖全域运营实战白宝书 - 高转化文案速成篇②〗- 快速找到产品卖点的N个小技巧
    Python ---使用Fake库向clickhouse造数据小案例
    数字IC前端学习笔记:数字乘法器的优化设计(进位保留乘法器)
    Rust学习记录(linux)——安装、创建、编译、输入输出
    TCP缓存
    MFC 学习笔记
    保护鲸鱼动物网页设计作业 静态HTML宠物主题网页作业 DW鲸鱼网站模板下载 大学生简单动物网页作品代码 个人网页制作 学生个人网页
    苹果的小型开发者计划现在允许账号间转让app
    Supervisor安装
    Go语言进阶,交叉编译,数字与字符的转换,多变参数
  • 原文地址:https://blog.csdn.net/weixin_43452154/article/details/134449821