Обработка изображений перед загрузкой
Т. к. не корректен в этом вопросе, решил обратится к любимому форуму:)
А существуют ли библиотеки или что-то подобное для оптимизации изображений перед загрузкой, на сервер. Допустим юзер решил загрузить фотку размером 5 метров) Смысл мне напрягать свой сервак, когда это может сделать клиент...) Буду при благодарен за всю предоставленную информацию) |
Цитата:
|
учите канвас, мсье, но забудьте о старых IE.
я его сам пока не учил - т.е. знаю, что он может сделать, но не знаю, как это делать :) |
melky,
5 метров канвы на клиенте - это нах такой сайт |
Цитата:
|
Цитата:
|
Цитата:
Цитата:
|
Цитата:
|
Цитата:
Safari >= 6.0 Chrome >= 7.0 Opera >= 11.1 IE - не поддерживает Источник - Веб-приложения на JavaScript. Алекс Маккоу |
melky, Я загружаю 200кил канвы - этап загрузки - полминуты (и это еще никакой обработки
|
Народ у меня JS проверяет, если браузер старый, то посылает обновляться!
Суть в том, чтобы оптимизировать изображение на стороне клиента, перед загрузкой на сервак! Желательно готовая библиотека... |
Цитата:
|
Цитата:
|
Цитата:
|
:D У кого вообще получилось загнать изображение пользователя в canvas?
У меня винда 7-ка вообще даже size не дает! |
:D Пишу оптимизатор) Все вгрузил в canvas вообщем 1 часть кода отрабатывается на 100%) А вот с оптимизацией пока наоборот) Из файла в 5 метров получается файл в 27 метров)
|
Цитата:
там картинка получается в формате dataURL в несколько раз больше чем двоичный файл |
:D Гружу 5 метров изображения в canvas 100 метров оперативы как и не было))))))))))
И так теперь мой скрипт уменьшает изображение до 1024*768, получаю на выходе изображение уже не 5 метров а 1 метр с копейками))) |
Цитата:
|
Цитата:
<!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>
|
Ну и почему тишина? кто что еще предложит как его дорабоать?
|
:D Благодаря гуглу теперь все изображения на выходе получают формат jpeg))) Значит с 5 метров до 200КБ с разрешения 4К до 1024)
Делаю щас отправку на сервак через POST) кому надо в личку) |
KupueIIIKo,
Вопрос: Через POST - каким mime-типом отправка? multipart/form-data (стандартно) или всё же application/octet-stream ? |
application/x-www-form-urlencoded
|
KupueIIIKo, Спс
:( Эт мну ужо и бесит - пока не нашел достойного варианта идентичного отправке формы |
:D при отправке через аякс, можно менять mime)
|
KupueIIIKo,
Угу - ток при наличии филе API и и blob data итого в Хроме |
всем привет. Написал обертку для преобразования
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 ); Глупо звучит, но тем не менее :) |
Цитата:
так что два варианта: либо отправлять на сервер строку base64 и там раскодировать, либо как-то раскодировать вручную на js - получить байты в виде Uint8Array, потом передать в конструктор Blob функция с интуитивно понятным названием "atob" переводит base64 в строку, из этой строки (используя charCodeAt) и можно собрать Uint8Array |
вот, набросал http://jsfiddle.net/rsXTj/
|
Яростный Меч, где ж вы были год назад? :)
|
| Часовой пояс GMT +3, время: 18:10. |