将 Blob 的一部分绘制到 html canvas Javascript 中没有数据 url

Drawing parts of a Blob to html canvas without data urls in Javascript

我正在使用网络应用程序测试一些东西,用户可以在其中看到图像的几部分,但不能一次看到全部。整个数据被发送到客户端并在客户端解密。该数据然后在 base64 中,所以我只需使用:

img.src = 'data:image/jpeg;base64,' + imgdata;

为了展示它。然后我可以打电话

my2Dcontext.drawImage(img, x, y, width, height)

一切都会好起来的,对吧?

除此之外,原始完整数据非常容易下载。只需从图像中复制数据源,然后下载或打开检查器并以这种方式下载。

出于这个原因,我想知道如何才能将 imgData 中的数据放到屏幕上,而不必将其 all 放在屏幕上。

有没有什么方法可以将数据中的部分图像渲染到 canvas 而无需创建完整图像数据 url 之类的东西?

我知道这是一个奇怪的案例,但如果你们有任何创意,我将不胜感激!

(P.S,我知道从某种意义上说,这本质上是通过模糊实现的安全性,如果他们可以在屏幕上单独显示这些部分,他们就可以将它们拼凑在一起。我只是想停止最简单的提取级别。谢谢)

确保用户只能访问允许的内容的唯一方法是只给他们这个。

因此您需要在服务器上对图像进行处理和切片,然后仅将需要的部分重新传递给客户端。

好吧,您实际上无法保护显示的图像免受决心获取图像的用户的影响。然后可以使用一个简单的屏幕抓取工具将图像的 tiles/parts 拼接在一起。高级用户可以注入脚本来自动执行相同的操作。

但是,为了创造性的方法:

图像数据混淆

可以选择在传送前对数据本身进行混淆处理,这样即使尝试下载 也将毫无用处。当在 canvas 上显示时,您可以“解码”数据以使其正确显示(但随后再次返回到屏幕抓取工具,用户必须选择将 canvas 另存为图像等)。

虽然混淆并不一定要非常复杂,但您需要找到一种可以混淆源位图数据的算法,以及同样可以将其恢复原状的方法 - 这当然会随附它对 JPEG 等有损格式的挑战;这里几乎需要 PNG(我有没有提到更高级的(?)用户也可以提取解码内容的代码)。

视频加密(EncryptedMediaExtensions API)

另一种方法是将图像作为受 DRM 保护的视频流(每个部分可以是一个帧)提供。这 可能 在屏幕抓取器的情况下有一些影响取决于 OS/hardware 支持等,但不要赌它(即使 browser support DRM).. .

如果没有 DRM,只需获取视频并使用 ffmpeg 等工具提取每一帧即可。

加水印

一种广泛采用的解决方案(至少在库存照片领域)是为每个预览和拼贴添加水印。这将升级游戏并迫使下定决心的用户启动 Photoshop 或类似软件,并花费比认为有趣的更多时间来删除它们;结果可变。

这可能适合也可能不适合您的情况。

值?

就个人而言,我不会花时间尝试这样做。为此付出的努力很快就会得到解决。

根据目的,加水印 tiles/parts(在源代码中)可能是更有效的解决方案。