Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Создание миниатюры на стороне клиента (https://javascript.ru/forum/misc/13978-sozdanie-miniatyury-na-storone-klienta.html)

RE_ 22.12.2010 17:51

Создание миниатюры на стороне клиента
 
Всех приветствую!

Есть php галерея картинок в которой для создания миниатюр-thumbnail-ов используется GD. Памяти хоть и прилично хостинг дает, но некоторые изображения все равно слишком велики, памяти на них не хватает и создать тумбнейл в автоматическом режиме нельзя. ImageMagick подключить, понятно тоже нельзя, т.к. к конфигу php доступа нет.
В связи с этим вопрос - как создавать миниатюры больших картинок?

Пока есть несколько мыслей:
1) Может ImageMagickу нужно меньше памяти и его как-то можно встроить просто в php

2) Какая-то надстройка над GD которая бы разбивала картинки на части, делала бы миниатюры их, а потом склеивала бы:blink:

3) Создавать миниатюры яваскриптом на стороне клиента, а потом заливать их на сервер.

Последний вариант кажется мне наиболее нормальным. Но реализации я не нашел и с какой стороны подступится тоже не знаю. В этом я не могу разобраться, может кто подскажет?
Может у jQuery такая функция есть?

Спасибо!

kadabrik 22.12.2010 19:16

http://www.punypng.com/

B@rmaley.e><e 22.12.2010 19:28

Цитата:

Сообщение от RE_
Создавать миниатюры яваскриптом на стороне клиента, а потом заливать их на сервер.

alert('Создавать миниатюры яваскриптом на стороне клиента, а потом заливать их на сервер.'.replace('яваскрипт', 'флеш')) // нажми запустить для получения ответа

RE_ 22.12.2010 21:03

kadabrik,
Цитата:

*.jpg exceeded the maximum upload size of 350KB
B@rmaley.e><e,
можно конкретнее пожалуйста?

kadabrik 22.12.2010 21:54

Цитата:

Сообщение от RE_ (Сообщение 84806)
*.jpg exceeded the maximum upload size of 350KB

Ну значит не судьба, я всего лишь намекнул на существование 4 варианта. А вообще, если делать сжатие требуется на стороне клиента то наилучший вариант конечно же flash.

x-yuri 23.12.2010 07:33

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

RE_ 23.12.2010 09:18

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

Флеш, я его почти не знаю:( С другой стороны можно найти готовый скрипт. Может есть подходящий на примете?

x-yuri,
именно это я и обозначил как вариант №3. Проблема за малым - написать скрипт. А я даже не знаю, как яваскриптом сжать изображение.

x-yuri 23.12.2010 10:11

нет, я не имел в виду клиентскую сторону и не имел в виду javascript. Хотя может и на нем можно

RE_ 23.12.2010 23:46

В смысле мне их скачивать сжимать фотошопом, например, и обратно заливать?)
Не, ну понятно можно и программку написать, которая бы взаимодейтвовала с сервером, но это равносильно. Нужна автоматизация

kadabrik 23.12.2010 23:55

Цитата:

Сообщение от RE_ (Сообщение 84864)
Флеш, я его почти не знаю:( С другой стороны можно найти готовый скрипт. Может есть подходящий на примете?

http://www.adylevy.com/index.php/200...referencedata/

x-yuri 25.12.2010 06:57

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

если еще актуально, можешь мою реализацию попробовать

dmitriymar 25.12.2010 10:09

Цитата:

Сообщение от RE_
3) Создавать миниатюры яваскриптом на стороне клиента, а потом заливать их на сервер.

можно-но есть там куча моментов

RE_ 25.12.2010 17:09

kadabrik, x-yuri, попробую, но привязка флеша займет определенное время.

dmitriymar, можно? А можно пример или хотя бы методы/функции нужные?

dmitriymar 25.12.2010 17:15

пример не дам-сам сейчас в процессе. но скажу как-изображение в канву соответсвующего размера и скриншот.

canvas.toDataURL("image/png") возвращает base64-кодированный PNG-«скриншот» канвы. и отправить на сервер уже файл нужного размера.

в канву положить изображение-через форму выбора файла-ложиться но есть свои моменты чтобы он отобразился на канве. к ие прийдётся добавить поддержку канвы-так что в принципе метод кросбраузерный.сам долго искал варианты этого-на этом форуме. в итоге удалось собрать ориент. алгоритм. сейчас только ложит в канву файл -скриншот и отправку на сервер ещё не делал.

dmitriymar 25.12.2010 17:23

вот текст полного ответа какой я получил по скриншоту из канвы
Цитата:

Сообщение от subzey
canvas.toDataURL("image/png") возвращает base64-кодированный PNG-«скриншот» канвы. Отослать его на сервер, разобрать в php base64, и вуаля. Если хочется, можно сохранить строку в файл. Если хочется, можно скормить её GD и сделать jpg.


kadabrik 25.12.2010 23:05

Canvas не будет работать в IE ниже 9 версии, тоесть в большинстве ослов на сегодня.

dmitriymar 25.12.2010 23:08

kadabrik,
растрою ,канва работает в ie ниже 9 версии-нужно библиотеку полключить и експлорер начинает работать с канвой и всеми её функциями
excanvas.js -одна из библиотек раелизующих канву в експлорере
есть ещё библиотека полной поодержки

RE_ 26.12.2010 14:24

dmitriymar, канвас - хорошая мысль.
Правда пока нашел простенький вариант (на php), который конечно не решает проблемы, по позволяет ее обойти в некоторых случаях.
Мы тянем превьюшку, которая встроена в jpg, и работаем с ней:

if(exif_thumbnail($tmpname)) {
	$image_tmp = exif_thumbnail($tmpname, $width, $height);
	$image = imagecreatefromstring($image_tmp);
	imagecopyresampled(
		$thumb, $image, 0, 0, 0, 0,
		$tsize[0], $tsize[1], $width, $height
		);
}


Правда это работает только с включенным на сервере exif и только если в картинке есть превьюшка, поэтому вариант не окончательный.
Постараюсь что-нибудь придумать с канвасами.
x-yuri, добавление флеш заливки не очень хороший вариант(я это не упомянул) т.к. желательно было бы генерировать тумбнейлы в первую очередь при массовой заливке с ftp. Если никак не получится, то буду пытаться использовать этот вариант.

dmitriymar 26.12.2010 14:31

я ща просто налетел на то что при выборе файла-он отображается(тоесть его можно отобразить на странице ) в сафари, ие ,фф. а вот в опере и хроме нет. причину вижу в том что те браузеры-отображают только название файла -скрывая путь-если присваивать путь из строки выбора переменной-но работает с полным ,а хром и опера пишет путь при присваивании на манер-с:\fakepath\ -причём неважно на каком диске лежит изображение -всё равно будет диск с /фкепатч/имя файла.вот сейчас думаю как с:\fakepath\ обойти -если пройдёт что при убирании его будет работать как и в остальных браузерах-тогда норм. но вот если они скрывают путь этим-тогда всё станет. а вот остальная реализация-уменьшение в размерах,отправка на сервер -это не проблема

x-yuri 26.12.2010 15:00

Цитата:

Сообщение от RE_
x-yuri, добавление флеш заливки не очень хороший вариант(я это не упомянул) т.к. желательно было бы генерировать тумбнейлы в первую очередь при массовой заливке с ftp. Если никак не получится, то буду пытаться использовать этот вариант.

ну, и к чему тогда вот это было?
Цитата:

Сообщение от RE_
В смысле мне их скачивать сжимать фотошопом, например, и обратно заливать?)
Не, ну понятно можно и программку написать, которая бы взаимодейтвовала с сервером, но это равносильно. Нужна автоматизация

пишешь php-скрипт, который автоматически заливает на ftp картинки, генерирует для них эскизы и тоже заливает на ftp

dmitriymar 26.12.2010 15:18

не знаю у меня таже проблемма-на серваке это делать-просто всё. но при паралельной оработке нескольких десятков не считая других задач -сервак так конкретно тормозит так что или канва или флеш. флеш учить нужно-согласен что в принципе под одну задачу +форумы-это много времени не займёт-но с другой стороны и какнва в пятом и поддержка аудио и видио официальная-так что флеш наверно останется для мультипликации и всё..

dmitriymar 26.12.2010 15:56

канва наверное отпадает-поскольку сегодня в фф перестало работать отображение картинки если она не лежит в одной папке со страницей(гляну конечно что будет если страницу с сервера вызывать) хотя ещё с утра работало с отображаемой частью пути как с целым путём:blink:

RE_ 27.12.2010 09:18

Цитата:

Сообщение от x-yuri (Сообщение 85339)
ну, и к чему тогда вот это было?

К тому что массово заливаешь все файлы, а отдельно, скажем через флеш, "неформатные"
Цитата:

Сообщение от x-yuri (Сообщение 85339)
пишешь php-скрипт, который автоматически заливает на ftp картинки, генерирует для них эскизы и тоже заливает на ftp

Не, ну я могу взять АЦДСии, сгенерировать тумбнейлы и залить. Но во-первых, все равно нужно продумывать названия, писать скрипт добавления в БД, а во-вторых, это же убого. Хочется сделать по нормальному, извиняюсь если это желание кажется наглым :)

А я опять натолкнулся на очередной трабл:
я не могу определить можно создать эскиз нормальным способом или нет.

На входе в функцию стоит проверка на вес и размеры картинки, большинство картинок она отсеивает, но если картинка хорошо ужата, пусть и большого размера (2500х2000=500кб) то проходит как "нормальная".
php функция createimagefromstring() пытается выполнится и вылетает.
Пытался загнать ее try catch, перестает работать вообще все:blink:
загоняю в if эффекта 0.
Как ошибку отловить - понятия не имею.

x-yuri 27.12.2010 09:50

Цитата:

Сообщение от RE_
В смысле мне их скачивать сжимать фотошопом, например, и обратно заливать?)
Не, ну понятно можно и программку написать, которая бы взаимодейтвовала с сервером, но это равносильно. Нужна автоматизация

Цитата:

Сообщение от RE_
К тому что массово заливаешь все файлы, а отдельно, скажем через флеш, "неформатные"

ты можешь внятно объяснить, как файлы попадают на сервер? Только ты их туда заливаешь?

Цитата:

Сообщение от RE_
Но во-первых, все равно нужно продумывать названия

на третьей странице мы выяснили, что не все можно автоматизировать

Цитата:

Сообщение от RE_
Не, ну я могу взять АЦДСии... [но] это же убого.

я тоже так считаю

Цитата:

Сообщение от RE_
я не могу определить можно создать эскиз нормальным способом или нет.

getimagesize?

Цитата:

Сообщение от RE_
я не могу определить можно создать эскиз нормальным способом или нет.

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

dmitriymar 27.12.2010 10:07

Цитата:

Сообщение от x-yuri
Но во-первых, все равно нужно продумывать названия
на третьей странице мы выяснили, что не все можно автоматизировать

можно автоматизировать-но без сервера при этом никак
Цитата:

Сообщение от x-yuri
нормальный способ - это когда ты можешь можешь на сервере создавать эскизы для фотографий любого нужного размера

почему не искать варианты разгрузить сервер?если можно при этом обходится более дешевым хостингом а не использовать десятки серверов

x-yuri 27.12.2010 10:42

Цитата:

Сообщение от dmitriymar
почему не искать варианты разгрузить сервер?

если речь идет о создании эскизов для имеющихся на сервере фотографий: потому что надо сначала, выяснить, какой эффект будет от такой разгрузки. Если человек, который считает количество знаков в имени переменной, говорит, что "У меня задачи на ресайз сотен тысяч фоток за раз, что разгребается за полдня под полной нагрзукой.", то это повод задуматься

а весь этот разговор в пределе выглядит так: "хочу разместить youtube на бесплатном виртуальном хостинге"...

Цитата:

Сообщение от dmitriymar
если можно при этом обходится более дешевым хостингом а не использовать десятки серверов

это уже уход в какие-то абстрактные материи, на который можно абстрактно ответить, что "время программиста стоит дороже". И спорить на этом уровне можно долго и нудно

dmitriymar 27.12.2010 10:48

ну да согласен.ну если програмист при этом он сам то стоит тратить время-не на трубу конечно)

RE_ 27.12.2010 15:29

Цитата:

Сообщение от x-yuri
ты можешь внятно объяснить, как файлы попадают на сервер? Только ты их туда заливаешь?

Это картинная галерея. Пока заливаю я, но предполагается, что будут заливать и обычные пользователи.
Я могу заливать двумя способами:
1) как все через форму - выбрал файл=>нажал залить.
2) залить много картинок на ftp и нажать "добавить папку с ftp"
К способу 1 можно прикрутить флеш-загрузчик. Но способ 2 все равно нужен, т.к. нужно залить около 5к файлов и предполагается заливать еще до сотни разом.
Все на любительском уровне на бесплатном хостинге (потому и ограничение памяти), хотя это не значит что я потом не докуплю платный. Просто я не особо знаком с тем как делаются проекты и думаю что по началу пусть висит на бесплатном, как доделаю, можно будет уже на платный переезжать.

Цитата:

Сообщение от x-yuri
на третьей странице мы выяснили, что не все можно автоматизировать

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

Цитата:

Сообщение от x-yuri
getimagesize

т.е. ты предлагаешь просто фильтровать большие изображения не разобравшись в причине? Мой перфекционизм негодуе!
Хотя наверно это самый легкий и правильный вариант.
Ну неужели нет более нормального решения чем костыль?

Цитата:

Сообщение от x-yuri
нормальный способ - это когда ты можешь можешь на сервере создавать эскизы для фотографий любого нужного размера

Не, ну понятно что я упираюсь в недостаток памяти. Для всех jpgов я его обошел, создавая эскизы из встроенных тумбнейлов. Осталась эта непонятная проблема.

Цитата:

Сообщение от x-yuri
"время программиста стоит дороже"

В данном случае я не только программирую, а еще и учусь, поэтому хочется сделать все по нормальному. Хотя нет, мне всегда хочется сделать все по нормальному :)

x-yuri 30.12.2010 10:08

Цитата:

Сообщение от RE_
Я имел ввиду что файлы заливаются не просто кучей, а в папки особым образом, по именам хешей, тумбнейлы также.

(мысли вслух) хотелось бы знать, как их оптимально по папкам расположить...

Цитата:

Сообщение от RE_
Так что всю эту логику (пусть и не хитрую) нужно разбирать и прописывать(копировать) мне показалось легче и лучше решить проблему с тумбнейлами - в конце концов можно залить большинство, а с проблемными потом разобраться отдельно их одна на пару сотен.

т.е. надо, чтобы картинки заливались на ftp в оригинальном размере, а потом при "добавлении папки" создавались эскизы? И надо сделать, чтобы все эскизы создавались именно при добавлении папки? Ну, пожалуйста: создаешь все эскизы которые можешь на сервере, а оставшиеся по одному отправляешь на клиент, где flash их ресайзит и отправляет обратно на сервер

Нормальное решение: картинки ресайзятся перед заливкой на ftp, автоматически, и сразу заливаются. Тебя смущает дублирование логики? не дублируй ее: сделай чтобы скрипт и "добавление папки" использовали общий код

Цитата:

Сообщение от RE_
т.е. ты предлагаешь просто фильтровать большие изображения не разобравшись в причине? Мой перфекционизм негодуе!
Хотя наверно это самый легкий и правильный вариант.
Ну неужели нет более нормального решения чем костыль?

причина известна: закончилась память. Поищи, если хочешь...

Цитата:

Сообщение от RE_
В данном случае я не только программирую, а еще и учусь, поэтому хочется сделать все по нормальному.

надо только не ошибится в выборах критериев "нормальности" ;) как видим, на одно нормальное решение нету денег

попробуй на всякий случай ini_set("memory_limit", "...M")

RE_ 04.01.2011 17:18

Цитата:

Сообщение от x-yuri
(мысли вслух) хотелось бы знать, как их оптимально по папкам расположить...

про оптимальность думаю тут речь не идет)

Цитата:

Сообщение от x-yuri
т.е. надо, чтобы картинки заливались на ftp в оригинальном размере, а потом при "добавлении папки" создавались эскизы?

Сейчас так уже есть. Правда с некоторыми картинками бывают сбои, которые и хочется устранить.

Цитата:

Сообщение от x-yuri
Ну, пожалуйста: создаешь все эскизы которые можешь на сервере, а оставшиеся по одному отправляешь на клиент, где flash их ресайзит и отправляет обратно на сервер

Да, именно так я и собирался(юсь) сделать. Правда проблему реализации диалога с флеш отодвинула на второй план проблема невозможности отловить "неправильные" изображения.
Я склоняюсь к созданию отдельной заливки вручную.

Цитата:

Сообщение от x-yuri
Нормальное решение: картинки ресайзятся перед заливкой на ftp, автоматически, и сразу заливаются.

я не делал систему, я просто пытаюсь устранить один недостаток.

а! система shimmie2 если интересно.
Цитата:

Сообщение от x-yuri
попробуй на всякий случай ini_set("memory_limit", "...M")

попробую, хотя вряд ли на серьезном хостинге будет такая бага)

x-yuri 04.01.2011 19:28

Цитата:

Сообщение от RE_
Правда проблему реализации диалога с флеш отодвинула на второй план проблема невозможности отловить "неправильные" изображения.

это возможно, эмпирически, на основании размеров изображения

Цитата:

Сообщение от RE_
я не делал систему, я просто пытаюсь устранить один недостаток.

не вижу разницы в сложности между этими вариантами с точки зрения реализации. Зато вижу разницу в удобстве: вместо того, чтобы все залить за один раз, надо будет проблемные фотографии вручную заливать. Решать тебе, конечно...


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