У меня есть простой объект Canvas HTML5, который после сохранения в файл открывает перфекционизм в Photoshop и выглядит корректно, но в соответствии с Windows и OSX "поврежден" или "поврежден".
Код, который я использую, очень прост:
JavaScript:
var dataURL = canvas.toDataURL({
format: 'jpeg',
quality: 0.8
});
А затем отправив dataURL
через AJAX:
$.ajax({
type: "POST",
url: "scripts/saveImage.php",
data: {
imgBase64: dataURL
}
})
Для простого PHP-скрипта:
$imageBase64 = $_POST['imgBase64'];
$imageData = base64_decode($imageBase64);
file_put_contents($fileName,$imageData);
Файл создается файлом. Я могу открыть его в Photoshop, и он выглядит точно так, как ожидалось. Редактор HEX показывает, что JFIF
в своих заголовках, как и ожидалось для JPEG, тоже:
Но вы не можете открыть файл в предварительном просмотре Windows или OSX:
Я сделал что-то не так? Есть ли что-то в заголовке файла, который отбрасывает Windows/OSX? Или это ожидаемое поведение для JPEG, созданного таким образом?
У меня была такая же проблема, оказалось, что "dataURL" начался с data:image/png;base64,
что путает читательские программы, такие как Windows Media Viewer и т.д.
Чтобы решить проблему, я использовал этот код
$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
, и именно поэтому я включил его в ответ, потому что это может сломать что-то, если я удалю его.
toDataURL({ format: 'jpeg', quality: 0.8 })
API браузера? Или вы используете какую-то дополнительную библиотеку? Дополнительный плагин? Насколько я знаю, правильное использование это:canvas.toDataURL("image/jpeg", 0.8);