当前位置: 首页 > 知识库问答 >
问题:

javascript - canvas使用跨域的图片时,image.crossOrigin = 'Anonymous',Tainted canvases may not be exported?

鲍建业
2023-11-07

canvas使用跨域的图片时,不加 image.crossOrigin = 'Anonymous'; 图片可以绘制,但是不能调用 toBlob(), toDataURL() 或 getImageData() 方法,调用它们会抛出安全错误。

Unable to get data URL. Failed to execute ‘toDataURL’ on ‘HTMLCanvasElement’: Tainted canvases may not be exported.

如果加上 image.crossOrigin = 'Anonymous'; 报错 Access to image at 'http://10.10.10.112/product/AVWT-154FESSA.png' from origin 'http://localhost:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.


问题的原因:是后端没有配置允许接受跨域

共有2个答案

徐峰
2023-11-07

换下小写试试

image.setAttribute(‘crossorgin’,’anonymous’)

将image作为文件读取blob流,ctx.toBlob 试试

export function imageToFileByCanvas(image: HTMLImageElement, fileName: string = "image.jpg"): Promise<File> {    const canvas = document.createElement("canvas")    canvas.width = image.width    canvas.height = image.height    const ctx = canvas.getContext("2d")!    ctx.drawImage(image, 0, 0)    return new Promise(resolve => canvas.toBlob(blob => resolve(new File([blob!], fileName))))}async function getImage(){      const file = await imageToFileByCanvas(image, "image.jpg")    const imgUrl = URL.createObjectURL(file) // image 内存地址}export function imageToFileByBlob(image: HTMLImageElement, fileName: string = "image.jpg") {    const binStr = atob(image.src.split(",")[1])    const len = binStr.length    const arr = new Uint8Array(len)    for (let i = 0; i < len; i++) {        arr[i] = binStr.charCodeAt(i)    }    const blob = new Blob([arr], { type: "image/png" })    return new File([blob], fileName)}

stackoverflow

松高歌
2023-11-07

这个问题是由于浏览器的同源策略造成的。在加载跨域图片时,浏览器会阻止对图片的某些操作,以避免潜在的安全问题。

首先,让我们解释一下同源策略。同源策略是一种安全协议,它规定了在没有明确权限的情况下,一个Web应用(源)不能与另一个源共享资源。这是为了防止恶意脚本在未经用户许可的情况下对用户的源进行操作。在浏览器的上下文中,"同源"指的是协议、域名和端口都相同。

在你的情况下,你试图在canvas中绘制一个来自不同源的图片(跨域)。如果不设置image.crossOrigin属性,浏览器会阻止对图片的某些操作,因为这可能会暴露敏感信息。因此,当你尝试调用toBlob(), toDataURL(), 或 getImageData() 方法时,会抛出一个安全错误。

然而,当你设置image.crossOrigin = 'Anonymous'时,你实际上是告诉浏览器允许对这个跨域图片进行操作。但这里的问题是,你的后端服务器没有正确配置CORS(跨源资源共享)策略。

你提到Access-Control-Allow-Origin: *已经添加到后端接口,但你仍然收到一个错误消息。这可能是由于服务器没有正确地响应跨域请求的预检请求。在CORS协议中,浏览器会首先发送一个预检请求(OPTIONS请求),以确定服务器是否允许跨域请求。服务器需要正确地响应这个预检请求,包括添加适当的CORS头部。

为了解决这个问题,你需要确保服务器正确地配置了CORS策略。具体的步骤可能因服务器的类型和配置而异,但通常你需要添加以下头部:

Access-Control-Allow-Origin: *Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS

此外,如果你的服务器使用的是Express.js,你可能会使用cors中间件来简化CORS配置:

var express = require('express');var cors = require('cors');var app = express();app.use(cors());

以上只是对这个问题的一种可能的解决方案。实际的解决方案可能会根据你的具体情况有所不同。

 类似资料:
  • 阿里云的图片,例如https://syx-hzy5200.oss-cn-shenzhen.aliyuncs.com/c17ed98cdb36...(不同图片这个不一样c17ed98cdb36418498caf32f95c0666f),前端项目中需要有一个需求是将url转图片 代码是 但是ccess to fetch at 'https://syx-hzy5200.oss-cn-shenzhen.a

  • 本文向大家介绍javascript使用链接跨域下载图片,包括了javascript使用链接跨域下载图片的使用技巧和注意事项,需要的朋友参考一下 前言 图片是最常见的静态资源文件,可以从本地、外链获取图片,或者使用base64码展示。而canvas的toDataUrl() API可以将图片转base64码,然后模拟点击事件即可下载图片。 外链下载 在本地或者网站下载外链url图片时涉及到跨域,跨域会

  • 本文向大家介绍使用JavaScript+canvas实现图片裁剪,包括了使用JavaScript+canvas实现图片裁剪的使用技巧和注意事项,需要的朋友参考一下 canvas是一个可以让我们使用脚本绘图的标签,它提供了一系列完整的属性和方法。我们可以借此来实现图形绘制,图像处理甚至实现简单的动画和游戏制作。 canvas标签只有两个属性:width和height,用来设定画布的宽和高,如果没有通

  • 问题内容: 我了解AJAX跨域策略。因此,我不能仅仅通过ajax HTTP请求调用“ http://www.google.com ”,并将结果显示在我的网站上。 我使用dataType“ jsonp”进行了尝试,这实际上可以工作,但是出现语法错误(显然是因为接收到的数据不是JSON格式的) 还有其他可能性可以从外部域接收/显示数据吗?iFrame是否遵循相同的政策? 问题答案: 使用AJAX获取跨

  • 本文向大家介绍快速解决Canvas.toDataURL 图片跨域的问题,包括了快速解决Canvas.toDataURL 图片跨域的问题的使用技巧和注意事项,需要的朋友参考一下 如题,在将页面的图片地址进行本地输出时(Html2Canvas.js),因不同源存在跨域问题,会出现toDataURL访问权限问题: 【Redirect at origin 'http://sub1.xx.com' has

  • 如图,如何给透明背景的canvas图片的轮廓描边。 尝试过几个方案,但是达不到想要的效果