canvas.toDataURL() 用于大画布

2023-12-22

我有一个问题.toDataURL()对于大画布。我想编码base64并在 php 文件上解码,但如果我有一个大画布strDataURI变量为空。

My code:

var strDataURI = canvas.toDataURL();
strDataURI = strDataURI.substr(22, strDataURI.length);
$.post("save.php",
{ 
   str: strDataURI
};

有没有什么替代方案.toDataURL()或者有什么方法可以改变大小限制?

Thanks.


我不确定画布尺寸是否有限制,但数据网址有限制,具体取决于浏览器:数据 URL 大小限制 https://stackoverflow.com/questions/695151/data-protocol-url-size-limitations.

您可以尝试使用 Node.js + node-canvas (服务器端)来重新创建画布。我一直在使用它们从画布元素创建可打印图像,并且到目前为止使用 toDataURL 没有任何问题/限制。

您使用的是fabric.js 库吗?我注意到您也在他们的论坛上发帖。 Fabric.js 可以在 Node.js 中使用,并且有一个带乘数的 toDataURL https://github.com/kangax/fabric.js/blob/master/src/static_canvas.class.js#L718-763方法,缩放画布/上下文,允许您更改 dataurl 图像大小。您可以检查方法源以了解这是如何完成的。

Edit:

由于您使用的是 Fabric.js,我建议使用 Node.js 来处理服务器上的画布到图像处理。您将找到有关如何在 Node.js 上使用 Fabric.js 的更多信息here http://fabricjs.com/fabric-intro-part-4/#node.

这是一个使用 Node.js 和 Express 的简单服务器:

var express = require('express'),
    fs = require('fs'),
    fabric = require('fabric').fabric,
    app = express(),
    port = 3000;

var allowCrossDomain = function (req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'POST, OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Content-Type');
    next();
}

app.configure(function() {
    app.use(express.bodyParser());
    app.use(allowCrossDomain);
});

app.options('/', function(req, res) {
    res.send(200);
});

app.post('/', function(req, res) {
    var canvas = fabric.createCanvasForNode(req.body.width, req.body.height);
    
    console.log('> Loading JSON ...');
    canvas.loadFromJSON(req.body.json, function() {
        canvas.renderAll();
        
        console.log('> Getting PNG data ... (this can take a while)');
        var dataUrl = canvas.toDataURLWithMultiplier('png', req.body.multiplier),
            data = dataUrl.replace(/^data:image\/png;base64,/, '');
        
        console.log('> Saving PNG to file ...');
        var filePath = __dirname + '/test.png';
        fs.writeFile(filePath, data, 'base64', function(err) {
            if (err) {
                console.log('! Error saving PNG: ' + err);
                res.json(200, { error: 'Error saving PNG: ' + err });
            } else {
                console.log('> PNG file saved to: ' + filePath);
                res.json(200, { success: 'PNG file saved to: ' + filePath });
            }
        });
    });
});

app.listen(port);
console.log('> Server listening on port ' + port);

当服务器运行时,您可以向其发送数据(postData)。 服务器期望json, width and height重新创建画布,以及multiplier缩放数据 url 图像。客户端代码看起来像这样:

var postData = {
    json: canvas.toJSON(),
    width: canvas.getWidth(),
    height: canvas.getHeight(),
    multiplier: 2
};

$.ajax({
    url: 'http://localhost:3000',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify(postData),
    dataType: 'json',
    success: function(data) {
        console.log(data);
    },
    error: function(err) {
        console.log(err);
    }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

canvas.toDataURL() 用于大画布 的相关文章

  • 快速响应的交互式图表/图形:SVG、Canvas 还是其他?

    我正在尝试选择正确的技术来更新一个项目 该项目基本上在可缩放 可平移的图表中渲染数千个点 当前使用 Protovis 的实现性能不佳 在这里查看 http www planethunters org classify http www pl
  • 鼠标移动时画布拖动

    我正在尝试构建一个可以使用鼠标移动拖动的画布 我做了一些我无法理解的错误 因为一开始似乎有效 然后出现了一个增量错误 使画布移动得太快 考虑以下代码 window onload function var canvas document ge
  • webglcontextcreationerror事件:是否同步触发?

    Is the webglcontextcreationerror 事件 https developer mozilla org en US docs Web Events webglcontextcreationerror同步触发还是异步触
  • 不同时间视频截图

    我在一条线上有 3 个画布 我想在每个画布中放置一个图像 视频的屏幕截图 在不同的时间 问题是所有 3 个屏幕截图都是在同一时间 最后指定的时间 下面是我的 JavaScript 代码 function getVideoScreenShot
  • 流媒体性能 - Canvas 与

    我正在开发一个应用程序 需要通过 webSocket 连接以每秒至少 30 帧的速度持续传输图像 我遇到了一些性能问题 并希望尽我所能进行优化 我想知道使用不断更新的图像之间的性能差异是什么 就像这样 img src someDynamic
  • 限制线的长度

    我正在尝试画一条代表 弹弓 的线 并且希望它具有最大拉伸长度 在 p5 中 我在位置和位置之间画了一条线 line posA x posA y posB x posB y posA 是鼠标 x 和 y posB 是画布上圆的位置 我想要做的
  • EaselJS Alpha 遮罩滤镜

    我对 Canvas 还很陌生 我一直在尝试将图像颠倒过来EaselJS Alpha 蒙版 http www createjs com demos easeljs alphamaskreveal示例 以便初始图像清晰 并且您可以paint是模
  • HTML5 Canvas 的环绕:如何获取(静态)形状继续围绕画布边缘

    我正在尝试画一个平铺背景在 HTML5 画布上使用 Javascript 但它不起作用 因为与画布边缘相交的形状不会环绕到另一侧 需要明确的是 这些是静态形状 没有及时运动 如何让被画布一侧中断的对象环绕到另一侧 基本上我正在寻找许多视频游
  • 无法在 Raphael 中缩放多条路径?

    我尝试使用当前的热门问题 使用 raphael 缩放多条路径 https stackoverflow com questions 3352698 scaling multiple paths with raphael 没有太多运气 我正在通
  • Python,Tkinter:如何获取可滚动画布上的坐标

    我有一个带有滚动条的 Tkinter 画布 还有一些项目 当我单击它们时 它应该返回坐标 使用Python 这对于窗口中最初可见的对象效果很好 但是 当我向下滚动并且画布上更下方的项目进入视图时 单击时我不会获得它们的画布坐标 而是获得窗口
  • jsPlumb:如何使流程图连接器避免元素相交?

    是否可以使 jsPlumb Flowchart 连接器不交叉可连接的项目或指定元素 在示例中 具有 item 类的元素 默认流程图行为 想要的结果 这是我尝试过的 http jsfiddle net CcfTD 1 http jsfiddl
  • 在android中的圆形路径上绘制文本

    我需要在圆形路径上绘制文本 我已经尝试过drawTextOnPath 方法 但对于所附图像中的 肥沃窗口 等文本 文本会旋转且不可读 我使用过的代码 customPath2 addArc mCircleRectF 30F 64 28F cu
  • 如何等待第一次画布重绘,直到 @font-face-font 加载?

    我有一个 HTML5 画布并用它编写文本context fillText 使用 font face font 使用 Firefox 3 6 显示页面我遇到问题 在画布的第一次绘制上 字体尚未下载 因此文本将以标准字体显示 我找到了一个 解决
  • 如何使用画布调整图像大小然后裁剪图像

    我已经知道如何 gt 调整图像大小 var image document getElementById myImage canvas document createElement canvas ctx canvas getContext 2
  • Html2canvas 忽略图像的对象拟合

    我一直在尝试利用 html2canvas 来截取元素的屏幕截图 我注意到 div 元素内使用 object fit 属性的图像在 html2canvas 屏幕截图后被拉伸 有没有为此散步 这是我的代码
  • 重命名从 HTML5 画布创建的图像

    我制作了一个简单的画布并将其另存为图像 我在这段代码的帮助下做到了这一点 var canvas document getElementById mycanvas var img canvas toDataURL image png 并弹出创
  • 使用 PHP 或 HTML5 进行图像弯曲

    我希望实现 http i53 tinypic com 2gule04 jpg http i53 tinypic com 2gule04 jpg 我已经尝试过提到的答案弯曲以矩形开头的图像 由用户上传 最好使用 Canvas 或 JS htt
  • 身体动画不流畅

    下面代码中的 spaceShip 在开始按住任何箭头键时移动并不顺利 它移动一步 冻结一瞬间 然后 平稳 地移动 怎样才能让它从一开始就顺利运转 而不是 冻结 My code
  • 如何以 Rails 形式将图像从 上传到具有 Rails Active Storage 的 S3?

    正如标题中所述 我正在尝试使用 Rails 的 Active Storage 从嵌套在 Rails 表单中的元素将图像上传到我的 S3 存储桶 到目前为止我已经能够使用使用 Active Storage 上传图像 这User class h
  • Python GTK+ 画布

    我目前正在通过 PyGobject 学习 GTK 需要画布之类的东西 我已经搜索了文档 发现两个小部件似乎可以完成这项工作 GtkDrawingArea 和 GtkLayout 我需要一些基本函数 如 fillrect 或 drawline

随机推荐