【问题标题】:Saving canvas as a PNG or JPG将画布保存为 PNG 或 JPG
【发布时间】:2012-06-27 17:57:58
【问题描述】:

我想将画布保存为 PNG,而不是在新窗口中将其作为 base64 编码图像打开。

我使用了这个代码:

jQuery("#btnPreview").click(function(){
        if (!fabric.Canvas.supports('toDataURL')) {
            alert('Sorry, your browser is not supported.');
        }
        else {
            canvas.deactivateAll();
            canvas.forEachObject(function(o){
                if(o.get("title") == "||Watermark||"){
                    canvas.bringToFront(o);
                }
            });
            window.open(canvas.toDataURL('png'), "");
            canvas.forEachObject(function(o){
                if(o.get("title") == "||Watermark||"){
                    canvas.sendToBack(o);
                }
            });
            canvas.renderAll();
        }

    });

我想让按钮将图像保存为 PNG 或 JPG。

【问题讨论】:

  • 我不认为这是这个问题的重复。
  • 我不认为我正在寻找的东西 :(
  • 我想将画布保存为“png”,而不是在新窗口中将其作为 base64 编码图像打开。我想让按钮将图像保存为“png”或“jpg”,我很清楚
  • 无论如何都要通过PHP下载

标签: javascript html canvas fabricjs


【解决方案1】:

canvas.toDataURL('png') 提供了一个字符串,例如 data:image/png;base64,XYZ。您可以将其填充到 <a href="%dataURI%" download>download</a> 中(可能会触发元素上的单击事件)。见Downloading resources in HTML5: a[download]

不过,目前只有 Google Chrome 支持。

【讨论】:

    【解决方案2】:

    我在我的 jquery 上使用它:

    var image = canvas.toDataURL("image/png").replace("image/png", "image/octet-stream"); 
    
    $('.save').attr({
        'download': 'YourProduct.png',  /// set filename
        'href'    : image              /// set data-uri
    });
    

    【讨论】:

      【解决方案3】:

      在 script.js 文件中

        $(document).on('click','#btnPreview',function(){
           var img =$scope.canvas.toDataURL('image/png');
           $.ajax({
                      type: "POST",   
                      url: 'ajax.php', 
                      data: {'img':img},
                      success: function(data) { 
                          $("#loader_message").html("Image saved successfully"); 
                      }
                  });
        });
      

      在 ajax.php 中

          $encodedData=explode(',', $_POST["img"]);
          $data = base64_decode($encodedData[1]);
          $urlUploadImages = $_SERVER['DOCUMENT_ROOT'].$projName.'/images/canvas/';
          $nameImage = "test.png";
          $img = imagecreatefromstring($data);
           if($img) {
              imagepng($img, $urlUploadImages.$nameImage, 0);
              imagedestroy($img); 
              echo "OK";
          }
          else {
              echo 'ERROR';
          }
      

      【讨论】:

      • 它保存在名为“canvas”的服务器文件夹中
      • 我的意思是问题是“如何在本地保存”。我知道你的代码应该做什么,这就是为什么我要指出它实际上并没有回答问题。