javascript - 上传的 Canvas 图像比其主要来源大得多

标签 javascript php image canvas

<img id='imgt' src='01.jpg' alt='img'>

此图像为原始 4000x3000px - 0.9MB - 由 css 在 960x540px 上计算

js

    var img = document.getElementById("imgt");
    c1 = document.createElement("canvas");
    var ctx = c1.getContext("2d");

    var a = $('#imgt').width();
    var b = $('#imgt').height();

    c1.width = a;
    c1.height = b;
    ctx.drawImage(img, 0, 0, a, b);

    var dataURL = c1.toDataURL();
    $.ajax({
      url: 'process.php',
      type: 'post',
      data: {'imgBase64': dataURL},
      success: function(data) {
        console.log('ok');
    }
});

process.php

$img = $_POST['imgBase64'];
$img = str_replace('data:image/png;base64,', '', $img);
$img = str_replace(' ', '+', $img);
$fileData = base64_decode($img);
$fileName = 'photo.jpg';
file_put_contents($fileName, $fileData);

起始图像 imgt4000x3000px - 0.9MB。生成的图像 photo.jpg960x540px - 1.05MB

我怀疑生成的图像实际上不是jpg而是png,所以我在js中尝试而不是var dataURL = c1.toDataURL():

var dataURL = c1.toDataURL("image/jpeg");

还有

var dataURL = c1.toDataURL("image/jpeg", 0.95);

在这两种情况下,生成的图像约为 200KB,但在 img 查看器中无法读取 - 它会报告损坏的图像或类似的内容。

有什么帮助吗?

最佳答案

你的怀疑是对的。当您仅使用 var dataURL = c1.toDataURL(); 时,图像默认保存为 png。要将图像保存为 jpeg 并降低质量(大小),您需要使用 var dataURL = c1.toDataURL("image/jpeg", 0.95) ;。但当您尝试在服务器端解析/解码图像时,实际问题发生了。您试图替换 data:image/png;base64,,它仅适用于 png 格式的图像。由于您尝试将图像保存为 jpeg,因此您需要使用 data:image/jpeg;base64,。因此,服务器端代码将是...

$img = $_POST['imgBase64'];
$img = str_replace('data:image/jpeg;base64,', '', $img);
$img = str_replace(' ', '+', $img);
$fileData = base64_decode($img);
$fileName = 'photo.jpg';
file_put_contents($fileName, $fileData);

关于javascript - 上传的 Canvas 图像比其主要来源大得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42758432/

相关文章:

php - 高级 PHP 设置 - 有选择地包括内置 PHP 函数

javascript - 仅获取 JavaScript 对象数组中的特定值

javascript - 如果禁用了JavaScript,则为备用行为

javascript - 将 PHP 变量传递给 Javascript 函数

javascript - react 错误 <th> 不能作为 <thead> 的子项出现。参见(未知)> thead > th

php - 如何在我的网站上为现有或回头客显示 Paypal 存储的信用卡详细信息?

php - 数组在localhost中工作,但不在服务器上

css - 如何在css中单独自定义列表项图片

java - 更改下载图像的单色

java - 如何从 JSP 获取图像 blob 到 JavaScript?