【问题标题】:HTML5 Canvas created JPEG is "corrupt" or "damaged"?HTML5 Canvas 创建的 JPEG 是“损坏”还是“损坏”?
【发布时间】:2015-08-14 05:06:32
【问题描述】:

我有一个简单的 HTML5 Canvas 对象,一旦保存到文件中,它会在 Photoshop 中完美打开并且看起来正确,但根据 Windows 和 OSX 的说法是“损坏”或“损坏”。

我使用的代码很简单:

JavaScript:

var dataURL = canvas.toDataURL({
    format: 'jpeg',
    quality: 0.8
});

然后通过 AJAX 发送dataURL

      $.ajax({
         type: "POST",
         url: "scripts/saveImage.php",
         data: {
            imgBase64: dataURL
         }
      })

到一个简单的 PHP 脚本:

$imageBase64 = $_POST['imgBase64'];
$imageData = base64_decode($imageBase64);
file_put_contents($fileName,$imageData);

文件是创建文件。我可以在 Photoshop 中打开它,它看起来完全符合预期。十六进制编辑器显示其标题中包含 JFIF,这与您对 JPEG 的期望一样:

但您无法在 Windows 或 OSX 预览中打开文件:

我做错了什么吗?文件头中是否有一些东西让 Windows/OSX 无法正常工作?还是以这种方式创建的 JPEG 的预期行为?

【问题讨论】:

  • 这是toDataURL({ format: 'jpeg', quality: 0.8 })浏览器API?或者您正在使用一些额外的库?附加插件?据我所知,正确的用法是:canvas.toDataURL("image/jpeg", 0.8);
  • 能否附上损坏的 JPEG 文件?
  • 我正在使用 FabricJS,也许这就是原因?我看看能不能附上图片。
  • 我也遇到了同样的问题,原来“dataURL”是以data/base64encoded或类似的东西开头的,然后跟着图片走。我不得不删除开头,然后它起作用了。编辑:这是确切的代码base64_decode(str_replace(' ', '+', str_replace('data:image/png;base64,', '', \Input::data('base64image'))));
  • @php_nub_qq 非常感谢!!!把它放在一个答案中,我会接受。

标签: javascript php html canvas fabricjs


【解决方案1】:

我遇到了同样的问题,原来“dataURL”以 data:image/png;base64, 开头,这让 windows 媒体查看器等阅读器程序感到困惑。

为了解决问题,我使用了这段代码

$file = base64_decode(str_replace(' ', '+', str_replace('data:image/png;base64,', '', \Input::data('base64image'))));

我猜你得把它改成

$file = base64_decode(str_replace(' ', '+', str_replace('data:image/jpeg;base64,', '', $_POST['imgBase64'])));

老实说,我不记得第一个 str_replace 的目的是什么,这就是我将它包含在答案中的原因,因为如果我删除它可能会破坏某些东西。

【讨论】:

  • 可能是因为您是通过 URL 发送图像的?我保留了它,即使我正在发布数据,它仍然有效。再次感谢!
  • @Chuck 我刚刚有了另一个提高性能的想法 - 您可以使用 substr 并删除前 x 个字符,而不是使用 str_replace,因为这总是在开头并且长度恒定。此外,不,它不是通过 url 发送的,这是一个非常糟糕的主意:D
猜你喜欢
  • 1970-01-01
  • 2019-07-11
  • 2012-04-13
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多