强制iOS从HTML5 Canvas下载图像(使用纯JavaScript)并保持应用CSS过滤器

时间:2018-05-23 22:43:55

标签: javascript ios html5 css3 css-filters

参考这篇文章,部分回答了我的问题:Force iOS to download image from HTML5 Canvas (using pure JavaScript)

总之,之前已经问过这个问题,一般的回答是它无法在iOS上完成。但是,这些问题已有几年的历史了, 回复上述问题的成员确实提供了部分答案:使用HTMLCanvasElement.toDataURL()将图像转换为数据URL,然后强制数据URL在新选项卡中作为图像打开。然后,可以通过手指在图像上下载,打开iOS保存对话框来下载。

问题是,即使我的保存代码下载了应用了CSS过滤器的图片,在iOS上的新标签页中打开的图片也会应用过滤器。

所以,我的问题是,如何采取最后一步:强制在新标签页中打开的图像应用CSS过滤器,就像在计算机上下载的图像应用了CSS过滤器一样。

这是从原始画布获取图像并应用CSS过滤器的代码,创建一个应用了CSS过滤器的新图像:

function fileApply() 
{ 

  var cP = document.getElementById("cPreview");
  var cntxCP = cP.getContext("2d");

  var cS = document.getElementById("cSave");
  var cntxCS = cS.getContext("2d");

  // take whatever CSS filters are applied to the first canvas
  var cssFilter = getComputedStyle(cP).filter; 

  // use those filter as the second canvas' context's filter
  cS.width = cP.width; 
  cS.height = cP.height; 
  cntxCS.filter = cssFilter;

  cntxCS.drawImage(cP, 0, 0);
  cP.style.display = "none";   
  if (cS.style.display == "none") cS.style.display = "block";   
}

这一切都有效。

这是保存代码:

function fileSave()
{

  var canvas = document.getElementById('cSave');

  if (document.getElementById("png").checked == true)
  {
    var quality = null;  // canvas.toBlob() takes an extra argument if file type is JPG. Set quality to null to allow PNG downloads. Quality value will be supplied if JPG is selected.   
    var format = "image/png"; 
    var name = "new_image.png"; 
  }

  if (document.getElementById("jpg").checked == true)
  {
    var format = "image/jpeg";  
    var quality = Number(document.getElementById("quality").value) / 100; 
    var name = "new_image.jpg"
  }

  if (!isIOS())
  {
    canvas.toBlob(function(blob) // Send canvas to blob and download blob 
    {
    const anchor = document.createElement('a')
    const url = URL.createObjectURL(blob)
    anchor.href = url
    anchor.download = name, 
    document.body.appendChild(anchor)
    anchor.click()
    document.body.removeChild(anchor)
    URL.revokeObjectURL(url);   
    }, format, quality)
  }

  if (isIOS()) 
  {
    var iString = canvas.toDataURL(); // convert image to base64 string 
    document.getElementById("iOS").innerHTML = '<a href="' + iString + '">click me</a>'; // add string to url and target new tab.     
  }

在计算机上运行正常。在iOS上,在新选项卡中创建新图像,不使用应用CSS过滤器。

谢谢

0 个答案:

没有答案