TL; DR;
Есть ли способ сжать изображение (в основном jpeg, png и gif) непосредственно на стороне браузера, прежде чем загружать его? Я уверен, что JavaScript может это сделать, но я не могу найти способ его достичь.
Здесь полный сценарий, который я хотел бы реализовать:
- пользователь переходит на мой сайт и выбирает изображение с помощью элемента
input type="file"
, - это изображение извлекается с помощью JavaScript, мы выполняем некоторую проверку, такую как правильный формат файла, максимальный размер файла и т.д.,
- Если все в порядке, на странице отображается предварительный просмотр изображения,
- пользователь может выполнять некоторые основные операции, такие как поворот изображения на 90 °/-90 °, обрезать его по заранее определенному соотношению и т.д., или пользователь может загрузить другое изображение и вернуться к шагу 1,
- когда пользователь удовлетворен, отредактированное изображение затем сжимается и "сохраняется" локально (не сохраняется в файле, а в памяти браузера/странице),
- пользователь заполняет форму данными, такими как имя, возраст и т.д.
- пользователь нажимает кнопку "Готово", затем форма, содержащая данные + сжатое изображение, отправляется на сервер (без AJAX),
Полный процесс до последнего шага должен выполняться на стороне клиента и должен быть совместим с последними браузерами Chrome и Firefox, Safari 5+ и IE 8 +. Если возможно, нужно использовать только JavaScript (но я уверен, что это невозможно).
Я ничего не кодировал прямо сейчас, но я уже думал об этом. Чтение файлов локально возможно через API файлов, предварительный просмотр и редактирование изображений можно выполнить с помощью Canvas элемента, но Я не могу найти способ сделать часть сжатия изображения.
В соответствии с html5please.com и caniuse.com поддержка этих браузеров довольно сложная (благодаря IE), но это можно сделать с помощью polyfill, например FlashCanvas и FileReader.
На самом деле, цель заключается в уменьшении размера файла, поэтому я вижу сжатие изображения как решение. Но я знаю, что загруженные изображения будут отображаться на моем сайте каждый раз в одном месте, и я знаю размер этой области отображения (например, 200x400). Таким образом, я мог бы изменить размер изображения в соответствии с этими размерами, тем самым уменьшив размер файла. Я понятия не имею, каков будет коэффициент сжатия для этой техники.
Как вы думаете? У вас есть какие-либо советы, чтобы рассказать мне? Вы знаете какой способ сжатия изображения на стороне браузера в JavaScript? Спасибо за ваши ответы.