Как сохранить HTML Canvas в виде изображения
Как сохранить HTML Canvas в виде изображения
Canvas - элемент HTML5, предназначенный для создания и обработки растрового изображения при помощи скриптов на языке JavaScript. На его основе, к примеру, работают различные библиотеки для построения графиков, различные онлайновые редакторы изображений, сервисы навигации и даже достаточно продвинутые анимированные игры. Все области применения трудно перечислить. Но просто рисовать в браузере иногда может быть недостаточно, надо передать готовый результат на сервер или сохранить в виде изображения на локальный компьютер.
Начнем с верстки. Тут будет один тег canvas и несколько кнопок, при нажатии на которые будет выполнено сохранение картинки или передача данных картинки на сервер.
Code (HTML) : Убрать нумерацию
- <canvas id="my_canvas"></canvas>
- <div>
- <input type="button" onclick="save_canvas('png');" value="Save as PNG" />
- <input type="button" onclick="save_canvas('jpg');" value="Save as JPG" />
- <input type="button" onclick="save_canvas('webp');" value="Save as WEBP" />
- </div>
- <div>
- <input type="button" onclick="upload_canvas('png');" value="Upload as PNG" />
- <input type="button" onclick="upload_canvas('jpg');" value="Upload as JPG" />
- <input type="button" onclick="upload_canvas('webp');" value="Upload as WEBP" />
- </div>
Code (JavaScript) : Убрать нумерацию
- <script type="text/javascript">
- function save_canvas(save_type) {
- var canvas = document.getElementById('my_canvas');
- if (save_type=='jpg') {
- // Формат JPEG с качеством 95%
- var canvas_data = canvas.toDataURL('image/jpeg', 0.95);
- }
- else if (save_type=='webp') {
- // Формат WEBP с качеством 90%
- var canvas_data = canvas.toDataURL('image/webp', 0.9);
- }
- else {
- // Формат PNG по умолчанию
- var canvas_data = canvas.toDataURL();
- }
- // Создать фейковый элемент-ссылку
- var fake_link=document.createElement('a');
- // Содержимое изображения
- fake_link.href = canvas_data;
- // Имя файла для сохранения
- fake_link.download = 'canvas_downloaded_as_'+save_type;
- // Имитация клика на ссылке для сохранения файла
- fake_link.click();
- // Удалить фейковый элемент
- fake_link.remove();
- }
- </script>
Также можно передавать данные через AJAX, если браузер не поддерживает fetch и промисы. В приведенном примере промисы используются только для сокращения кода.
Code (JavaScript) : Убрать нумерацию
- <script type="text/javascript">
- function upload_canvas(save_type) {
- var canvas = document.getElementById('my_canvas');
- if (save_type=='jpg') {
- // Формат JPEG с качеством 95%
- var canvas_data = canvas.toDataURL('image/jpeg', 0.95);
- }
- else if (save_type=='webp') {
- // Формат WEBP с качеством 90%
- var canvas_data = canvas.toDataURL('image/webp', 0.9);
- }
- else {
- // Формат PNG по умолчанию
- var canvas_data = canvas.toDataURL();
- }
- // Сформировать имя файла для передачи на сервер
- var file_name='canvas_uploaded_as_'+save_type+'.'+save_type;
- // Отправить содержимое canvas на сервер
- var response = fetch(
- 'canvas_uploader.php?filename='+file_name,
- {method:"POST", body:canvas_data}
- );
- }
- </script>
Code (PHP) : Убрать нумерацию
- $data=file_get_contents('php://input');
- $tmp=explode('base64,',$data,2);
- if (isset($tmp[1])) {
- $f=fopen($_GET['filename'], 'wb');
- fwrite($f, base64_decode($tmp[1]));
- fclose($f);
- }
Рабочий пример скрипта можно посмотреть на демонстрационной странице. Загрузка файлов по понятным причинам отключена, но в консоли можете убедиться, что заглушка на сервере получила результат.
Просмотров: 693 | Комментариев: 0
Комментарии
Отзывы посетителей сайта о статье
Комментариeв нет
Добавить комментарий
Заполните форму для добавления комментария