当我使用 ctx.drawImage() 在画布中放置另一个图像时,无法将画布另存为图像

2024-05-01

我正在尝试制作绘图应用程序,您可以在画布上绘制一些内容,并通过单击“保存”按钮将结果保存为服务器上的图像。您还可以放置另一张图像作为绘图的背景。问题是,当我使用 ctx.drawImage() 将图像放入画布时,我无法将画布保存为图像,因为什么也没有发生。一切正常,直到我使用 ctx.drawImage()。为什么我无法将画布另存为其中包含其他图像的图像?

我的ajax代码:

// it works until I use ctx.drawImage()
$.ajax({
           type: "POST",
           url: "save.php",
           data: {image: dataURL},
           success: function()
            {
                alert('saved');
            }
        });

将另一张图像作为背景的代码:

//var ctx = can.getContext('2d');
var img = new Image;
ctx.drawImage (img, 0, 0);

我的 PHP 代码:

<?php
$dataURL = $_POST["image"];  
$parts = explode(',', $dataURL);  
$data = $parts[1];  
$data = base64_decode($data);  
$fp = fopen('test.png', 'w');  
fwrite($fp, $data);  
fclose($fp); 
?>

这是整个 JavaScript 代码

    $(document).ready (function()
    {

    var color = $("#color").val();


    $("#size").val("10");
    var mouse = 0;

    var can = document.getElementById("canny");
    var ctx = can.getContext('2d');

    var offsetX = 158;
    var offsetY = 200;

    var img = new Image;
    var url = "http://i.imgur.com/fmAoxZ0.jpg";
    img.src = url;



    function setBackground()
    {

        ctx.drawImage (img, 0, 0);
    }   






    function setOpacity(newValue)
    {
        $("#canny").css ("opacity", newValue * 0.01);
        $("#txt-opacity").html(newValue + "%");
    }


    $("body").mousedown(function(event)
    {

            color = $("#color").val();
            var cordX = event.clientX - offsetX;
            var cordY = event.clientY - offsetY;
            var size = $("#size").val();


            ctx.beginPath();
            ctx.arc(cordX,cordY,size,0,2*Math.PI);
            ctx.fillStyle = color;
            ctx.fill();


        document.getElementById("coords").innerHTML = "x: " + cordX + "     y: " + cordY;

        mouse = 1;

        $("body").mousemove(function(event)
        {
            if (mouse == 1)
            {

                var cordX = event.clientX - offsetX;
                var cordY = event.clientY - offsetY;
                var size = $("#size").val();


                ctx.beginPath();
                ctx.arc(cordX,cordY,size,0,2*Math.PI);
                ctx.fillStyle = color;
                ctx.fill();

                $("body").mouseup(function()
                {

                    mouse = 0;

                });


            }
        });

    mouse = 1;

    });


    $("#opacity").change (function()
    {
        setOpacity(this.value);
    });


    $("#opacity").trigger("change");





    $("#red").click (function()
    {
        $("#color").val("#FF3636");
        $(this).css ("border-color", "darkorange");
        $("#blue").css ("border-color", "black");
        $("#lime").css ("border-color", "black");
        $("#yellow").css ("border-color", "black");
    });


    $("#blue").click (function()
    {
        $("#color").val("#0080FF");
        $(this).css ("border-color", "darkorange");
        $("#red").css ("border-color", "black");
        $("#lime").css ("border-color", "black");
        $("#yellow").css ("border-color", "black");
    });


    $("#lime").click (function()
    {
        $("#color").val("#8CFF00");
        $(this).css ("border-color", "darkorange");
        $("#red").css ("border-color", "black");
        $("#blue").css ("border-color", "black");
        $("#yellow").css ("border-color", "black");
    });


    $("#yellow").click (function()
    {
        $("#color").val("#FFF01F");
        $(this).css ("border-color", "darkorange");
        $("#red").css ("border-color", "black");
        $("#blue").css ("border-color", "black");
        $("#lime").css ("border-color", "black");
    });





    $("#btn-clear").click(function()
    {


        if (confirm ("Are you sure to clear your image?"))
        {
            ctx.clearRect(0, 0, can.width, can.height);
        }

    });



    $("#btn-save").click (function()
    {
        var dataURL = can.toDataURL();


            $.ajax({
               type: "POST",
               url: "save.php",
               data: {image: dataURL},
               success: function()
                {
                    alert('saved');
                }
            });









    });


    $("#fill").click (function()
    {
        $("#canny").css ("background-color", color);

    });


    $('input[type=radio][name=bgselect]').change (function ()
    {
        if (this.value == "image")
        {
            setBackground();

            $("#url").css ("visibility", "visible");
            img.src = url;
        } else
        {
            $('#canny').css('background-image', 'none');
            $("#url").css ("visibility", "hidden");

        }
    });

    $("#url").change(function()
    {
        url = $(this).val();
        setBackground();

    });









});

你的问题是canvas.toDataURL,如果你将跨域图像绘制到画布上,它会被禁用。如果您使用 F12 打开浏览器控制台,您将看到安全错误。

由于您的图片托管商(imgur.com)已启用对图片的跨域访问,因此您可以通过添加以下内容来遵守跨域安全性:img.crossOrigin='anonymous'到你的 img 对象。

var img = new Image;
img.crossOrigin='anonymous';
var url = "http://i.imgur.com/fmAoxZ0.jpg";
img.src = url;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我使用 ctx.drawImage() 在画布中放置另一个图像时,无法将画布另存为图像 的相关文章

  • 将音频与视频流合并 Node.js

    我正在创建 YouTube 视频下载器并且正在使用ytdl core库 它无法下载带有音频的高质量视频 因为 youtube 将其放在另一个文件中 但我需要将其全部下载到一个文件中 我已经这样做了 app get download asyn
  • 创建 Cookie 时需要帮助

    我有一个名为yes和另一个名叫no
  • 如何在android中画一条曲线?

    我是 Android 新手 正在开发一个关于绘制线条的示例项目 我想画一条连接两点的曲线或高架线 x1 y1 and x2 y2 我试过canvas drawArc 方法 但是RectF内的值drawArc方法只是圆的 x y 中心点 它在
  • 使用模态表单 ajax 超出 HTMLFormElement.toString 的最大调用堆栈大小

    我想使用模态窗口中的 ajax 请求提交表单 单击此链接可打开该模式 a class btn btn primary i class fa fa edit i Write a review a 模态窗口 div class modal fa
  • html5 输入模式属性在表单之外不起作用?

    这把小提琴 http jsfiddle net 2gaw3 按预期工作 当用户输入无效的国家 地区代码时 它会显示警告 这另一个小提琴 http jsfiddle net y66vH 4 没有form元素 不起作用 看来输入的pattern
  • 如何记录返回的事件发射器

    如何记录所发出的事件stream返回于MyFunc 与 JSDoc MyFunc description param Object opts description return Stream description function My
  • iframe 重新加载按钮

    我浏览了很多网站 但似乎没有一个能正常工作 或者我不明白它们 我想要一个刷新某个 iframe 的简单按钮 该按钮将位于父页面上 并且 iframe 名称为 Right 有很多方法可以做到这一点 假设这个iframe markup 我们可以
  • v-file-input .click() 不是函数

    我试图以编程方式触发 v file input 的 click 事件 因为它在 Vuetify 的文档中 但它显示一个错误this refs imagePicker click is not a function我在这里错过了什么吗 代码重
  • 使用 jquery 将字符串数组转换为整数

    我正在尝试将 jquery 中的字符串数组转换为整数数组 这是我的尝试 var cdata data values split each cdata function i l l parseInt l 我认为在这种情况下你不需要使用 Jqu
  • React无限滚动scrollableTarget动态获取id?

    我在我的项目中使用react infinite scroll component 如何让scrollableTarget动态获取item id 我试过这样scrollableTarget item id 但它不起作用 必须与该 div 具有
  • 如何使 jQuery 向上动画

    我有一些 jquery 运行得相当好 但是当我将鼠标悬停在有问题的元素上时 底部向下扩展 这并不意外 但不是所需的效果 我希望元素的底部保持静止 而元素的顶部向上扩展 如果您想查看我目前拥有的内容 您可以导航至http demo ivann
  • 有关于 PHP 中的 V8JS 的文档吗?

    有没有关于V8JS的文档 我是否只需要标准 PHP 或一些扩展即可使用 V8JS 我将非常感谢有关 PHP 中的 V8JS 的任何信息 要求 PHP 5 3 3 和 V8 库和标头安装在正确的路径中 Install http www php
  • WebRTC:通道、轨道和流与 RTP SSRC 和 RTP 会话之间的关系

    来自 Mozilla 网站 https developer mozilla org en US docs Web API Media Streams API https developer mozilla org en US docs We
  • 从多维无穷大数组中删除数组元素

    我想删除一个特定元素 例如 我想删除元素id 76在下面的数组中 而且 数组可以无限地组合在一起 这里的问题是我无法刷新页面 因为我使用 Vue js 进行即时操作 如果我能做到这一点 我的下一个问题可能是如何在我现在想要的地方添加一个元素
  • ng-model 和值组合不适用于输入文本框

    我有两个输入文本框 我需要组合在两个文本框中输入的值并将其显示在第三个文本框中 如果我只使用value在第三个文本框中 Box 1
  • 需要js、d3 和 nvd3 集成

    我面临整合的问题要求 questions tagged requirejs with d3 questions tagged d3 and nvd3 questions tagged nvd3 我找到了一个使用 require 的简单解决方
  • 如何获取使用 .map 渲染的第一个元素的 ref?

    我需要在几行中显示视频 卡片 的缩略图 并重点关注第一个缩略图 我使用嵌套地图进行了显示 该代码基本上迭代视频数组并返回多行视频 我们如何关注第一个渲染的元素 我认为我们需要获得第一个要聚焦的元素的引用 但是我们如何在这里设置 ref 并在
  • MYSQL 按喜欢/不喜欢和受欢迎程度排序

    我有评论表 其中包括喜欢和不喜欢的内容 现在我在正确的顺序上遇到了问题 实际上 我的系统在顶部显示了最多点赞的评论 我正在 youtube 上寻找类似系统的东西 这意味着 100like 100dislikes 的评论的顺序高于 1 1 我
  • 当选择下拉列表中的某些值时,取消选中复选框

    当我从下拉列表中选择某个值或用户未从下拉列表中选择任何值时 我需要取消选中复选框 我现在正在使用 Jquery 这是我现在使用的代码 但它不起作用 Script
  • 如何在 SVG 元素上使用箭头标记?

    我需要在 d3 js 中创建一个箭头 但我找到的只是带有节点图的示例 我需要的是简单地制作一个从 A 点到 B 点的箭头 我尝试实现以下示例中的部分代码 http bl ocks org 1153292 http bl ocks org 1

随机推荐

  • 带汇总总计和小计

    我有一个脚本可以生成几乎已经存在的结果集 我正在尝试获取小计和总计 我在年份栏中得到了小计 在最后得到了总计 我的目标是让最终结果显示 总计 而不是小计 请注意 由于汇总函数 我的最后一行 位置 也返回为空 SELECT YEAR COUN
  • 从特定的 setup.py 进行 pip 安装

    我在 RedHat 的 Openshift 云服务上创建了一个 python 3 3 应用程序 默认情况下 它有我的项目的 setup py 我正在学习名为 使用 Flask 构建 SaaS 应用程序 的 Udemy 课程 源代码 http
  • 如何将数据动态分配给jqGrid?

    这是我创建 jqGrid 的代码 ptDataGrid jqGrid datatype local data arrSpecData colModel colmod rowNum 10 rowList 10 pager ptPager gr
  • 如何在 XAML 中定义变量?

    我在 XAML 中有以下两个按钮
  • svn 1.7 错误 E200009 无法添加所有目标,因为某些目标已经版本化

    我对存储库进行了彻底的检查 然后每天我都有一个 hudson 工作来运行脚本来备份配置 脚本的一部分是添加 xml svn add xml svn warning W150002 data hudson config xml is alre
  • difflib python 格式化

    我使用此代码来查找两个 csv 列表之间的差异并提出一些格式问题 这可能是一个简单的解决方法 但我是新手 正在尝试学习 但遇到了很多问题 import difflib diff difflib ndiff open test1 csv rb
  • 检测碰撞方向

    一块方形瓷砖与另一块方形瓷砖碰撞 调酒师说 I have 两个图块的高度 宽度 x 和 y 引起碰撞的运动的 2D 矢量 我需要知道碰撞发生在哪一侧 例如顶部 底部 左侧 右侧 以便适当地重置位置 我会给任何能回答这个问题的人一个心理饼干
  • 用于阻止大于 20MB 的提交的预提交挂钩

    是否可以为 SVN 1 8 编写 prcommit 挂钩以避免提交大于 20MB 的文件 任何建议 将不胜感激 谢谢 我尝试过 但这不适用于二进制文件或其他文件扩展名 filesize SVNLOOK cat t TXN REPOS f w
  • Pyspark 将多个列合并为一个 json 列

    我不久前问过 python 的问题 但现在我需要在 PySpark 中做同样的事情 我有一个像这样的数据框 df cust id address store id email sales channel category 1234567 1
  • iReport 中的新页面

    这是我的情况 我有一份详细区域包含 10 个 或更多 项目的报告 我有一个大文本字段 我想跨越多个页面 此文本与项目无关 我无法创建另一个页面 因为我的所有项目都非常适合第一页 如何在页脚上创建 强制 仅包含一些可变 静态 文本的新页面 换
  • 使用 Keras、Tensorflow 进行多时间序列维度的 RNN 时间序列预测

    我正在尝试在某些时间序列集上运行 RNN LSTM 网络 值得一提的是 时间序列正在分类 我有大约 600 个不同的时间序列 每个序列都有 930 个带有特征的时间步长 我已将数据结构化为 numpy 3D 数组 其结构如下 X 666 o
  • 这是使用 husky + lint-staged 的​​正确方法吗?

    我发现很多博客 包括 lint staged 文档 介绍了这样一种使用 husky lint staged 的 方法 如 package json 中定义的以下代码 scripts precommit lint staged lint st
  • 获取 ASP.NET 网站的 IIS 站点名称

    在我的 ASP NET Web 应用程序中 我想查找在 IIS 中创建它时指定的名称 该名称对于服务器来说是唯一的 我对网站的域名不感兴趣 而是对 IIS 中为该网站指定的实际名称感兴趣 我需要能够在 IIS6 和 7 上可靠地完成此操作
  • 如何将操作和处理程序添加到“处理货件”屏幕?

    如何将操作和处理程序添加到 处理货件 屏幕 我们想要向屏幕 SO503000 上的 操作 组合框添加一个操作 然后在代码中添加一个处理程序来处理新操作 我们希望在不必覆盖 SOShipmentEntry 图中 Action 的巨大 swit
  • Functools.update_wrapper() 无法正常工作

    I use Functools update wrapper 在我的装饰器中 但看起来像update wrapper仅重写函数属性 例如 doc name 但不影响help 功能 我知道这些答案 https stackoverflow co
  • Jasmine 2.0 rc* 等待未定义

    刚刚升级到茉莉花2 0 rc5 from 1 3现在我所有的测试都使用了waits 被打破了 因为waits and waitsFor 函数未定义 我似乎在网上找不到任何参考 有人知道替换 wait 的新 API 是什么吗 好吧 异步调用的
  • 语音识别中如何处理同音词?

    对于那些不熟悉什么是同音字 https en wikipedia org wiki Homophone是的 我提供以下示例 我们的 是 嗨和高 到 太 二 在使用时语音API https developer apple com docume
  • 如何编写写入 /var/log/myapp 目录的 C/C++ 应用程序?

    背景 在 Linux 系统上 应用程序日志 https help ubuntu com community LinuxLogFiles Application Logs存在于子目录中 var log 其所有者为root root并且在我的系
  • 继承时字段冲突

    我有以下简化的模型结构 common models py class CLDate models Model active models BooleanField default True last modified models Date
  • 当我使用 ctx.drawImage() 在画布中放置另一个图像时,无法将画布另存为图像

    我正在尝试制作绘图应用程序 您可以在画布上绘制一些内容 并通过单击 保存 按钮将结果保存为服务器上的图像 您还可以放置另一张图像作为绘图的背景 问题是 当我使用 ctx drawImage 将图像放入画布时 我无法将画布保存为图像 因为什么