Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Обработка изображений перед загрузкой (https://javascript.ru/forum/misc/30330-obrabotka-izobrazhenijj-pered-zagruzkojj.html)

KupueIIIKo 31.07.2012 22:45

Обработка изображений перед загрузкой
 
Т. к. не корректен в этом вопросе, решил обратится к любимому форуму:)
А существуют ли библиотеки или что-то подобное для оптимизации изображений перед загрузкой, на сервер.
Допустим юзер решил загрузить фотку размером 5 метров)
Смысл мне напрягать свой сервак, когда это может сделать клиент...)
Буду при благодарен за всю предоставленную информацию)

Deff 31.07.2012 22:48

Цитата:

Сообщение от KupueIIIKo
Смысл мне напрягать свой сервак, когда это может сделать клиент...)

Вряд ли, либо не кроссбраузерно - либо - еще вариант - пропускать оптимизацию через чужие сервисы - с оправкой на серв чужой ссылки, для последующей закачки на серве автоматически

melky 31.07.2012 22:49

учите канвас, мсье, но забудьте о старых IE.

я его сам пока не учил - т.е. знаю, что он может сделать, но не знаю, как это делать :)

Deff 31.07.2012 22:50

melky,
5 метров канвы на клиенте - это нах такой сайт

melky 31.07.2012 22:51

Цитата:

Сообщение от Deff (Сообщение 193396)
melky,
5 метров канвы на клиенте - это нах такой сайт

где есть канва, там есть и воркеры. ничего тормозить не будет.

vadim5june 31.07.2012 22:53

Цитата:

Сообщение от melky (Сообщение 193397)
где есть канва, там есть и воркеры. ничего тормозить не будет.

а как Вы в canvas загрузите изображение на клиенте?

Magneto 31.07.2012 22:54

Цитата:

Сообщение от vadim5june (Сообщение 193399)
а как Вы в canvas загрузите изображение на клиенте?

Можно попробовать через File API. Но хз.

Цитата:

Сообщение от Deff (Сообщение 193396)
melky,
5 метров канвы на клиенте - это нах такой сайт

Это не сайт такой а пользователь, топикстартер хочет перед отправкой на сервер обработать изображение.

vadim5june 31.07.2012 22:56

Цитата:

Сообщение от Magneto (Сообщение 193400)
Можно попробовать через File API. Но хз.

это только хром на сегодняшний день-если устраивает то можно

Magneto 31.07.2012 22:58

Цитата:

Сообщение от vadim5june (Сообщение 193403)
это только хром на сегодняшний день-если устраивает то можно

Firefox >= 3.6
Safari >= 6.0
Chrome >= 7.0
Opera >= 11.1
IE - не поддерживает

Источник - Веб-приложения на JavaScript. Алекс Маккоу

Deff 31.07.2012 22:58

melky, Я загружаю 200кил канвы - этап загрузки - полминуты (и это еще никакой обработки

KupueIIIKo 31.07.2012 23:03

Народ у меня JS проверяет, если браузер старый, то посылает обновляться!
Суть в том, чтобы оптимизировать изображение на стороне клиента, перед загрузкой на сервак!
Желательно готовая библиотека...

vadim5june 31.07.2012 23:05

Цитата:

Сообщение от Magneto (Сообщение 193404)
Firefox >= 3.6
Safari >= 6.0
Chrome >= 7.0
Opera >= 11.1
IE - не поддерживает

Источник - Веб-приложения на JavaScript. Алекс Маккоу

да это я спутал с File System API

Deff 31.07.2012 23:05

Цитата:

Сообщение от KupueIIIKo
Народ у меня JS проверяет, если браузер старый, то посылает обновляться!

Гы - кароче - посылает

melky 31.07.2012 23:39

Цитата:

Сообщение от Deff (Сообщение 193405)
melky, Я загружаю 200кил канвы - этап загрузки - полминуты (и это еще никакой обработки

прошу демо? я пока что только читаю про это )

KupueIIIKo 01.08.2012 00:19

:D У кого вообще получилось загнать изображение пользователя в canvas?
У меня винда 7-ка вообще даже size не дает!

KupueIIIKo 01.08.2012 11:23

:D Пишу оптимизатор) Все вгрузил в canvas вообщем 1 часть кода отрабатывается на 100%) А вот с оптимизацией пока наоборот) Из файла в 5 метров получается файл в 27 метров)

vadim5june 01.08.2012 12:09

Цитата:

Сообщение от KupueIIIKo
Пишу оптимизатор)

а что он должен делать с картинкой
там картинка получается в формате dataURL в несколько раз больше чем двоичный файл

KupueIIIKo 01.08.2012 12:42

:D Гружу 5 метров изображения в canvas 100 метров оперативы как и не было))))))))))
И так теперь мой скрипт уменьшает изображение до 1024*768, получаю на выходе изображение уже не 5 метров а 1 метр с копейками)))

melky 01.08.2012 12:43

Цитата:

Сообщение от KupueIIIKo (Сообщение 193589)
:D Гружу 5 метров изображения в canvas 100 метров оперативы как и не было))))))))))
И так теперь мой скрипт уменьшает изображение до 1024*768, получаю на выходе изображение уже не 5 метров а 1 метр с копейками)))

так Вы покажете скрипт на jsbin'е, или нет ?))

KupueIIIKo 01.08.2012 12:59

Цитата:

Сообщение от melky (Сообщение 193591)
так Вы покажете скрипт на jsbin'е, или нет ?))

Как я делал) про JSbin нечего не слышал) линку в студию)

<!DOCTYPE html> 
<html>
<head>
<noscript>
<meta http-equiv="refresh" content="0; url=nojs.html">
</noscript>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" content="no-cache">
<link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body>
<style>
  .thumb {
    height: 75px;
    border: 1px solid #000;
    margin: 10px 5px 0 0;
  }
</style>

<input type="file" id="files" name="files[]" multiple />
<output id="list"></output>

<script>
function handleFileSelect(evt) {

	var files = evt.target.files; //Файллист

	for (var i = 0, f; f = files[i]; i++) {

		if (!f.type.match('image.*')) {
			continue;
		}

	var reader = new FileReader();

	reader.onload = (function(theFile) {
		return function(e) {
			
			var canvas = document.createElement("canvas");
			var ctx = canvas.getContext("2d");
			var image = new Image();
			image.src = e.target.result;
			image.onload = function(e)
				{
var MAX_WIDTH = 1024;
var MAX_HEIGHT = 768;
var width = image.width;
var height = image.height;
  
if (width > height) {
  if (width > MAX_WIDTH) {
    height *= MAX_WIDTH / width;
    width = MAX_WIDTH;
  }
} else {
  if (height > MAX_HEIGHT) {
    width *= MAX_HEIGHT / height;
    height = MAX_HEIGHT;
  }
}
					canvas.width = width;
					canvas.height = height;
					ctx.drawImage(image, 0, 0, width, height);
				}
				
																	//

																	//
			document.getElementById("canvasiha").appendChild(canvas);
			dat=image.toDataURL("image/jpeg"); typ='jpeg';
			window.open(dat=imgage.toDataURL());
		};
	})(f);

	reader.readAsDataURL(f);
	}
}

document.getElementById('files').addEventListener('change', handleFileSelect, false);
</script>
<div id="canvasiha">
</body>
</html>

KupueIIIKo 01.08.2012 14:18

Ну и почему тишина? кто что еще предложит как его дорабоать?

KupueIIIKo 02.08.2012 10:31

:D Благодаря гуглу теперь все изображения на выходе получают формат jpeg))) Значит с 5 метров до 200КБ с разрешения 4К до 1024)
Делаю щас отправку на сервак через POST) кому надо в личку)

Deff 02.08.2012 13:21

KupueIIIKo,
Вопрос:
Через POST - каким mime-типом отправка?
multipart/form-data (стандартно) или всё же application/octet-stream ?

KupueIIIKo 02.08.2012 18:17

application/x-www-form-urlencoded

Deff 02.08.2012 18:38

KupueIIIKo, Спс
:( Эт мну ужо и бесит - пока не нашел достойного варианта идентичного отправке формы

KupueIIIKo 02.08.2012 21:40

:D при отправке через аякс, можно менять mime)

Deff 02.08.2012 22:39

KupueIIIKo,
Угу - ток при наличии филе API и и blob data итого в Хроме

nerv_ 30.10.2012 00:06

всем привет. Написал обертку для преобразования
a) image -> canvas
b) canvas -> canvas
Никакого сакрального смысла она не несет, просто чтобы не писать одно и тоже по многу раз. Например,
<script src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
<script src="http://nepiu.narod.ru/links/jquery.to.canvas.js"></script>

<!-- будем надеяться, что это изображение в кеше :) -->
<img src="http://javascript.ru/forum/images/ca_serenity/misc/logo.gif" alt="">​

<script>
    
    // to canvas 1:1
    $( 'img' ).toCanvas().appendTo( 'body' ).wrap( '<div>' );
    
    // zoom
    $( 'img' ).toCanvas({ width: 300, height: 68 }).appendTo( 'body' ).wrap( '<div>' );
    
    // crop
    $( 'img' ).toCanvas({ sw: 90, dw: 90 }).appendTo( 'body' ).wrap( '<div>' );
        
</script>

После того, как будут произведены все необходимые манипуляции с канвасом (ресайз и/или кроп), преобразую его в dataURL c помощью метода
var base64 = canvas.toDataURL( 'image/jpeg', 1 );

Можно ли это дело (base64) отправить на сервер в виде new FormData()? Т.е. сперва преобразовать, а затем отправить. Чтобы было так же просто, как и со встроенным объектом File?
var formData = new FormData();
formData.append( 'file', file );
xhr.send( formData );

Глупо звучит, но тем не менее :)

Яростный Меч 01.10.2013 21:14

Цитата:

Сообщение от nerv_
Можно ли это дело (base64) отправить на сервер в виде new FormData()? Т.е. сперва преобразовать, а затем отправить. Чтобы было так же просто, как и со встроенным объектом File?
var formData = new FormData();
formData.append( 'file', file );
xhr.send( formData );

у канвы есть метод toBlob, но реализован по-моему только в FF.

так что два варианта: либо отправлять на сервер строку base64 и там раскодировать, либо как-то раскодировать вручную на js - получить байты в виде Uint8Array, потом передать в конструктор Blob


функция с интуитивно понятным названием "atob" переводит base64 в строку, из этой строки (используя charCodeAt) и можно собрать Uint8Array

Яростный Меч 01.10.2013 21:58

вот, набросал http://jsfiddle.net/rsXTj/

nerv_ 02.10.2013 23:52

Яростный Меч, где ж вы были год назад? :)


Часовой пояс GMT +3, время: 22:23.