Вот лапша скребок.
Имея в виду, у нас есть локальное хранилище HTML5 и xhr v2, а что нет. Мне было интересно, сможет ли кто-нибудь найти рабочий пример или просто дать мне ответ «да» или «нет» на этот вопрос:
Можно ли предварительно настроить размер изображения, используя новое локальное хранилище (или что-то еще), чтобы пользователь, который не имеет понятия о том, как изменить размер изображения, может перетащить свое изображение размером 10 МБ на мой веб-сайт, изменить его размер с помощью нового локального хранилища и Затем загрузите его в меньшем размере.
Я прекрасно знаю, что вы можете сделать это с помощью Flash, Java-апплетов, активного X ... Вопрос в том, сможете ли вы сделать это с Javascript + Html5.
Ждем ответа на этот.
Та пока.
источник
onload
изображения (присоедините обработчик перед установкойsrc
), потому что браузеру разрешено выполнять декодирование асинхронно, а пиксели могут быть недоступны раньшеdrawImage
.ctx.drawImage()
приблизитесь к концу.Я решил эту проблему несколько лет назад и загрузил свое решение на github как https://github.com/rossturner/HTML5-ImageUploader
В ответе Роберта используется решение, предложенное в сообщении в блоге Mozilla Hacks , однако я обнаружил, что это приводит к очень низкому качеству изображения при изменении размера до 2: 1 (или кратного). Я начал экспериментировать с различными алгоритмами изменения размера изображения, хотя большинство из них оказались довольно медленными или не очень хорошими по качеству.
Наконец, я пришел к решению, которое, на мой взгляд, выполняется быстро и также имеет довольно хорошую производительность - поскольку решение Mozilla по копированию с одного холста на другой работает быстро и без потери качества изображения при соотношении 2: 1 при заданном значении x пикселей в ширину и y пикселей в высоту, я использую этот метод изменения размера холста, пока изображение не станет между x и 2 x , и y и 2 y . Затем я перехожу к алгоритмическому изменению размера изображения для заключительного «шага» изменения размера до целевого размера. Попробовав несколько разных алгоритмов, я остановился на билинейной интерполяции, взятой из блога, который больше не находится в сети, но доступен через Интернет-архив. , что дает хорошие результаты, вот соответствующий код:
Это уменьшает изображение до ширины
config.maxWidth
, сохраняя исходное соотношение сторон. На момент разработки это работало на iPad / iPhone Safari в дополнение к основным настольным браузерам (IE9 +, Firefox, Chrome), поэтому я ожидаю, что он все еще будет совместим, учитывая более широкое распространение HTML5 сегодня. Обратите внимание, что вызов canvas.toDataURL () принимает тип MIME и качество изображения, что позволит вам контролировать качество и формат выходного файла (потенциально отличный от ввода, если хотите).Единственный момент, который не охватывает это - сохранение информации об ориентации, без знания этих метаданных размер изображения изменяется и сохраняется как есть, теряя метаданные внутри изображения для ориентации, что означает, что изображения, сделанные на планшетном устройстве «вверх ногами», были отображаются как таковые, хотя они были бы перевернуты в видоискателе камеры устройства. Если это вызывает беспокойство, в этом блоге есть хорошее руководство и примеры кода о том, как этого добиться, и я уверен, что он может быть интегрирован в приведенный выше код.
источник
Исправление к вышесказанному:
источник
dataurl
не там.img.width
иimg.height
изначально они есть0
. Вы должны поместить остальную часть функции внутрьimg.addEventListener('load', function () { // now the image has loaded, continue... });
Модификация к ответу Джастина, которая работает для меня:
источник
Если вы не хотите изобретать велосипед, вы можете попробовать plupload.com
источник
Машинопись
источник
Это не будет работать. На стороне PHP вы не можете сохранить файл с этим.
Используйте этот код вместо:
источник
Изменение размера изображения в элементе canvas, как правило, является плохой идеей, поскольку в нем используется самая дешевая интерполяция блоков. Полученное изображение заметно ухудшается по качеству. Я бы рекомендовал использовать http://nodeca.github.io/pica/demo/ который может вместо этого выполнять преобразование Ланцоша. Демонстрационная страница выше показывает разницу между подходами canvas и Lanczos.
Он также использует веб-работников для параллельного изменения размера изображений. Также есть реализация WEBGL.
Есть некоторые онлайн-ресайзеры изображений, которые используют pica для выполнения этой работы, например https://myimageresizer.com
источник
Принятый ответ прекрасно работает, но логика изменения размера игнорирует случай, когда изображение больше максимума только по одной из осей (например, высота> maxHeight, но ширина <= maxWidth).
Я думаю, что следующий код заботится обо всех случаях более простым и функциональным способом (игнорируйте аннотации типов машинописного текста при использовании простого javascript):
источник
Вы можете использовать dropzone.js, если вы хотите использовать простой и удобный менеджер загрузки с изменением размера перед загрузкой.
Он имеет встроенные функции изменения размера, но вы можете предоставить свои собственные, если хотите.
источник