2010-03-12 3 views
123

Я хотел бы знать, если это технически возможно изменить размер изображения на стороне клиента с JavaScript (на самом деле размер, а не просто изменить ширину и высоту). Я знаю, что это возможно сделать во Flash, но я хотел бы избежать этого, если это возможно. Есть ли какой-либо алгоритм с открытым исходным кодом где-то в Интернете?изменение размеров изображений на стороне клиента с JavaScript перед загрузкой на сервер

+0

Для тех из вас, кто все еще хочет узнать ответ на этот вопрос, вы можете это сделать, но вам нужно будет сделать несколько аякс-вызовов для обработки изображений. – polyhedron

+1

«Нужно сделать»? Хорошо, что вы МОЖЕТЕ решить эту проблему на сервере в конце концов и получить эти прозрачные данные через AJAX-вызовы. Но вся эта попытка состоит в том, чтобы сделать это на стороне клиента, а Джереми указывает, что МОЖЕТ быть сделано. Я думаю, что это отличный пример: https://github.com/rossturner/HTML5-ImageUploader – Bart

+1

С его последней версией Dropzone.js поддерживает изменение размера изображения на стороне клиента перед загрузкой. – user1666456

ответ

6

Возможно, с тегом холста (хотя он не переносимый). Есть блог о том, как повернуть изображение с холстом here, я полагаю, что если вы можете его повернуть, вы можете изменить его размер. Возможно, это может быть отправной точкой.

См there также.

+1

Очень полезные примеры. Возможно, вы захотите добавить фрагмент или два ответа в случае, если эти ссылки когда-либо сломаются. – Trevor

-14

Это возможно с html5.

На данный момент, вы можете использовать Silverlight, чтобы сделать это. Вот отличная отправная точка.

http://www.codeplex.com/SilverlightFileUpld

+2

silverlite - проприетарное дополнительное программное обеспечение - это нехорошо, особенно когда все браузеры уже поддерживают javascript – antiqe

+2

Вы отдали голос, ответ на который ответил 3,5 года назад ... –

+12

через 3,5 года silverlite - проприетарное дополнительное программное обеспечение - это нехорошо, особенно когда все браузеры поддерживали javascript 3.5 года назад – antiqe

53

Ответ на этот вопрос - да в HTML 5 вы можете изменить размер изображения на стороне клиента, используя элемент холста. Вы также можете взять новые данные и отправить их на сервер. Смотрите этот учебник:

http://hacks.mozilla.org/2011/01/how-to-develop-a-html5-image-uploader/

+19

Это ** ссылка только ответ ** и как таковой должен быть комментарий. – Jimbo

12

Не знаю, почему вы хотите это сделать ... но если вы где изменение размера перед загрузкой я только что узнал, это http://www.plupload.com/ он делает все волшебство для Вас в любых мыслимых метода.

Unfortunatelly HTML5 изменить размер только suported с Mozilla borwser, но вы можете перенаправить другие браузеры на флэш и SilverLight.

Я просто попробовал и работал с моим андроидом !.

я использовал вспышку http://swfupload.org/, это делает работу очень хорошо, но размер изменить размер очень мал. (не помню предел) и не возвращается к html4, когда вспышка недоступна.

+42

Приятно делать изменения на стороне клиента, когда пользователь пытается загрузить фотографию размером 10 Мб, которая будет храниться только как гораздо меньшая фотография. Он будет загружаться намного быстрее. – Kyle

+0

Тот же сценарий здесь, как только у вас есть вход для файла, а пользователь находится на смартфоне и снимает изображение с помощью камеры, он будет около 10 мб на современных смартфонах. Если вы на стороне сервера все равно изменяете размер и сохраняете гораздо меньшую версию, вы сэкономите много сотовых данных и время загрузки, предварительно сделав изменения размера в клиенте. – Alex

+1

Будьте осторожны, потому что plupload AGPL. – Alex

79

Вот суть, которая делает это: https://gist.github.com/dcollien/312bce1270a5f511bf4a

(версию ES6 и .js версия, которая может быть включена в тег сценария)

Вы можете использовать его следующим образом:

<input type="file" id="select"> 
<img id="preview"> 
<script> 
document.getElementById('select').onchange = function(evt) { 
    ImageTools.resize(this.files[0], { 
     width: 320, // maximum width 
     height: 240 // maximum height 
    }, function(blob, didItResize) { 
     // didItResize will be true if it managed to resize it, otherwise false (and will return the original file as 'blob') 
     document.getElementById('preview').src = window.URL.createObjectURL(blob); 
     // you can also now upload this blob using an XHR. 
    }); 
}; 
</script> 

она включает в себя кучу обнаружения поддержки и polyfills, чтобы убедиться, что он работает на столько браузеров, как я мог управлять.

(он также игнорирует GIF изображения - в случае, если они анимированные)

+2

Я чувствую, что вы не получили почти хвалы для этого - я думаю, что он отлично работает и очень просто. Спасибо, что поделился! – Matt

+3

Хм .. У меня был хороший успех, но я обнаружил, что мои изображения (помимо изменения размера) также понесли огромную потерю качества (в виде сильной пикселизации), хотя он был выведен с правильным разрешением. –

+0

привет, мне нужен фрагмент, который можно использовать как этот, и я думаю, что это очень хорошо, но .. function (blob, didItResize) { // hasItResize будет правдой, если ему удастся изменить его размер, иначе false (и вернет исходный файл как «blob») document.getElementById ('preview'). src = window.URL.createObjectURL (blob); // вы также можете загрузить этот blob с помощью XHR. здесь у меня есть проблема. Как отправить это изображение в форме, просто отправив форму. Я имею в виду, как сообщение, инициированное кнопкой отправки. Вы знаете, обычный способ. Спасибо за суть! – iedmrc99

7

http://nodeca.github.io/pica/demo/

В современном браузере вы можете использовать холст для загрузки/сохранения данных изображения. Но вы должны иметь в виду несколько вещей, если вы измените размер изображения на клиенте:

  1. У вас будет только 8 бит на канал (jpeg может иметь лучший динамический диапазон, около 12 бит). Если вы не загружаете профессиональные фотографии, это не должно быть проблемой.
  2. Будьте осторожны при изменении размера алгоритма. Большинство ресайдеров на стороне клиента используют тривиальную математику, и результат хуже, чем может быть.
  3. Возможно, вам понадобится затачивать уменьшенное изображение.
  4. Если вы хотите повторно использовать метаданные (exif и другие) с оригинала - не забудьте удалить информацию о цветовых профилях. Потому что он применяется, когда вы загружаете изображение в холст.
2

Да, с современными браузерами это вполне выполнимо. Даже выполним задачу загрузки файла в виде двоичного файла, выполнив любое количество изменений холста.

http://jsfiddle.net/bo40drmv/

(этот ответ является улучшение принятого ответа here)

Имея в виду, чтобы поймать обрабатывать представление результата в PHP с чем-то сродни:

//File destination 
$destination = "/folder/cropped_image.png"; 
//Get uploaded image file it's temporary name 
$image_tmp_name = $_FILES["cropped_image"]["tmp_name"][0]; 
//Move temporary file to final destination 
move_uploaded_file($image_tmp_name, $destination); 

If один беспокоится о точке Виталия, вы можете попробовать некоторые из обрезки и изменения размера на рабочем столе.

Смежные вопросы