Кадрирование изображений на сайте.

12
malls
На сайте с 08.08.2005
Offline
255
1887

Кто-нибудь когда-нибудь делал что-то подобное?

Интересуют алгоритмы и подводные камни.

На вскидку в голову приходит:

1. Задаем размеры кадра, показываем div поверх картинки - выбираем нужное положение (все JS)

2. Передаем координаты и габариты div в пыху, - далее стандартные средства пыхи.

ЗЫ: Если видели красивые/достойные примеры - буду благодарен за линки.

ЗЫЗЫ: К JS фреймворкам испытываю стойкую неприязнь - предлагать только в варианте изучения кодов соответсвующих функций...

T.R.O.N
На сайте с 18.05.2004
Offline
314
#1

malls,

там ведь работы, если хочется красиво - 1 день. Зачем ходить по чужим граблям. делал такое очень давно (подгон обоев под разные мобильники). Все достаточно просто. В качестве примера использовал http://mkartinki.ru/img1792.htm когда нажимаешь кнопку "В мобильник" (там с прототипом, но я взял только идею).

Там правда все просто. Если исходники найду - кину.

От воздержания пока никто не умер. Хотя никто и не родился! Prototype.js был написан теми, кто не знает JavaScript, для тех, кто не знает JavaScript (Richard Cornford)
wdsg
На сайте с 09.02.2009
Offline
31
#2

Самое примитивное, что пришло в голову (осторожно, много букв):

<style type="text/css">
.pic {background:url('путь до исходного изображения');position:fixed;} /* Стиль блока, содержащего исходное изображение */
.wnd {background:white;opacity: 0.2;} /* Стиль окна кадрирования */
</style>

<script type="text/javascript">

// Эти параметры мы подставляем на сервере
var Width = 100; // Ширина исходника
var Height = 100; // Высота исходника
var WndWidth = 50; // Начальная ширина окна кадрирования
var WndHeight = 50; // Начальная высота окна кадрирования
var WndX = 0; // Начальное положение окна кадрирования по X
var WndY = 0; // Начальное положение окна кадрирования по Y

// Перемещение окна кадрирования
function moveWnd(x, y) {
var Wnd = document.getElementById('wnd');
if (WndX + x >= 0 && WndX + x <= Width - WndWidth) {
WndX = WndX + x;
}
if (WndY + y >= 0 && WndY + y <= Height - WndHeight) {
WndY = WndY + y;
}
refreshWnd();
}
// Изменение размера окна кадрирования
function resizeWnd(width, height) {
var Wnd = document.getElementById('wnd');
if (WndWidth + width >= 1 && WndX + WndWidth + width <= Width) {
WndWidth = WndWidth + width;
}
if (WndHeight + height >= 1 && WndY + WndHeight + height <= Height) {
WndHeight = WndHeight + height;
}
refreshWnd();
}
// Обновление окна кадрирования с текущими координатами
function refreshWnd() {
var Wnd = document.getElementById('wnd');
Wnd.style.marginLeft = WndX;
Wnd.style.marginTop = WndY;
Wnd.style.width = WndWidth;
Wnd.style.height = WndHeight;
document.getElementById('inpX').value=WndX;
document.getElementById('inpY').value=WndY;
document.getElementById('inpW').value=WndWidth;
document.getElementById('inpH').value=WndHeight;
}
</script>

Позиция:
<table>
<tr><td></td><td><a href="#" onClick="moveWnd(0, -1)"> &uarr; </a></td><td></td></tr>
<tr><td><a href="#" onClick="moveWnd(-1, 0)"> &larr; </a></td><td></td><td><a href="#" onClick="moveWnd(1, 0)"> &rarr; </a></td></tr>
<tr><td></td><td><a href="#" onClick="moveWnd(0, 1)"> &darr; </a></td><td></td></tr>
</table>

Размер:
<table>
<tr><td></td><td><a href="#" onClick="resizeWnd(0, -1)"> &uarr; </a></td><td></td></tr>
<tr><td><a href="#" onClick="resizeWnd(-1, 0)"> &larr; </a></td><td></td><td><a href="#" onClick="resizeWnd(1, 0)"> &rarr; </a></td></tr>
<tr><td></td><td><a href="#" onClick="resizeWnd(0, 1)"> &darr; </a></td><td></td></tr>
</table>

<!-- Эта форма с координатами окна кадрирования уйдет на сервер -->
<form action="" method="post">
X: <input id="inpX" name="inpX" value=""/><br/>
Y: <input id="inpY" name="inpY" value=""/><br/>
W: <input id="inpW" name="inpW" value=""/><br/>
H: <input id="inpH" name="inpH" value=""/><br/>
<input type="submit" value="Обрезать"/>
</form>

<div id="pic" class="pic">
<div id="wnd" class="wnd"></div>
</div>

<script type="text/javascript">
var Pic = document.getElementById('pic');
Pic.style.width = Width;
Pic.style.height = Height;
refreshWnd();
</script>

Разумеется, далеко не самая удобная реализация.

Проектирование и разработка сложных IT-систем. Вожусь с проблемными задачами.
malls
На сайте с 08.08.2005
Offline
255
#3
T.R.O.N:
malls, там ведь работы, если хочется красиво - 1 день.

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

T.R.O.N:
Зачем ходить по чужим граблям.

Почему ходить - хочется просто о них знать. :)

То что в примере как раз подобное и планирую... Только там жесткие пропорции - мне нужно "помягче"

wdsg не разбирался пока чего там, но обязательно посмотрю потом - сейчас просто срубает уже, почти сутки не спал. Спасибо в любом случае...

T.R.O.N
На сайте с 18.05.2004
Offline
314
#4
malls:
Понимаю что не бог весть как сложно, но я всегда сначала размышляю прежде чем делать... Привычка...

ну так энто понятно, кто же с х...ом на перевес в атаку бегает....

От себя, если бы сейчас была задача, клиентскую часть делал бы только на флеше, AS3 стал проще чем JS для подобных вещей, а кросброузерность / кросплатформенность 101%

edogs software
На сайте с 15.12.2005
Offline
775
#5

Полезный плагин для jquery http://odyniec.net/projects/imgareaselect/

malls:
ЗЫЗЫ: К JS фреймворкам испытываю стойкую неприязнь - предлагать только в варианте изучения кодов соответсвующих функций...

(пожимаем плечами) - ну, копайтесь в исходниках, там все банально. Тольао зачем? Так Вы и до асма докатитесь:)

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
Ghost Bear
На сайте с 01.07.2009
Offline
28
#6

Решал такую задачу, когда делал сервис создания карточек со вставлением туда собственного лица. На стороне браузера использовал http://www.speedingrhino.com/cropper.htm - вполне удобно и просто получилось внедрить код в приложение. Для выбора регионов на больших фотках, например с фотоаппаратов, предварительно сжимал исходную фотку, чтобы она поместилась на страничке, а потом умножал выбранные юзером координаты лица на коэффициент сжатия картинки и дальше резал как надо.

Пишу продвинутый веб-софт и автоматизирую сео-задачи на партнёрских условиях. Ваша тема + Мой код = Совместный успех. Велком в ЛС.
malls
На сайте с 08.08.2005
Offline
255
#7
T.R.O.N:
ну так энто понятно, кто же с х...ом на перевес в атаку бегает....

Ну это... смотря "на куда"... :)))

T.R.O.N:
От себя, если бы сейчас была задача, клиентскую часть делал бы только на флеше, AS3 стал проще чем JS для подобных вещей, а кросброузерность / кросплатформенность 101%

Честно говоря не знаю его... Лень разбираться... Тем более уже пар достойных примеров есть в топике... А "кросс", это дело техники...

Ghost Bear:
Решал такую задачу, когда делал сервис создания карточек со вставлением туда собственного лица. На стороне браузера использовал http://www.speedingrhino.com/cropper.htm - вполне удобно и просто получилось внедрить код в приложение.

Тоже весьма достойненько смотрится! Спасибо!

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

Да точно такую логику я и продумываю... В корень зрите! :)

edogs:
Полезный плагин для jquery http://odyniec.net/projects/imgareaselect/

Этой чушке подавай браузеры, которые чуть не в следующем году выйдут, в отличие от примеров T.R.O.N и Ghost Bear

edogs:
(пожимаем плечами)

Ради бога, уши не прищемите! :)

edogs:
Так Вы и до асма докатитесь:)

Я с него когда то начинал... Не пугает... :) Только не для веб.

edogs software
На сайте с 15.12.2005
Offline
775
#8
malls:
Этой чушке подавай браузеры, которые чуть не в следующем году выйдут

Вы на каком сайте новости читаете? IE 6.0 вышел уже давно, а не в следующем году выходит:)

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

malls
На сайте с 08.08.2005
Offline
255
#9
edogs:
Вы на каком сайте новости читаете? IE 6.0 вышел уже давно, а не в следующем году выходит:)/QUOTE]
Шуток не понимем? У меня, например, Opera 9.23 (считайте меня ретроградом, но пока устраивает) в ней не работает. А что первичнее "яйцо или курица" и "кто под кого должен подстраиваться" - это бесполезный холивар.

edogs:
Нет, ну хотите все делать руками, что бы после Вас все в куче кода разбирались, вместо пары аккуратных вызовов функций - хозяин барин. Но зачем откровенную чушь про jquery говорить про якобы несовместимость с современными браузерами...

Вы же программист. Вы где-нибудь в мануалаах по JS видели функции вида $(...)? Я нет... Вот когда они там появяться - я буду считать что это действительно аккуратный способ обработки всего чего-угодно... а до тех пор я предпочитаю понятные вменяемые "мануальные" средства.

edogs:
религиозный фанатик детектед?

Нет, просто я просил про FW не писать... Или нет?
edogs software
На сайте с 15.12.2005
Offline
775
#10
malls:
Нет, просто я просил про FW не писать... Или нет?

Нет. Перечитайте свой ЗЫЗЫ в первом посте. У imgareaselect код простейший, мы Вам и сказали в первом же ответе - копайтесь в исходниках если хотите, изучайте.

malls:
Вы где-нибудь в мануалаах по JS видели функции вида $(...)? Я нет...
Вот когда они там появяться - я буду считать что это действительно аккуратный способ обработки всего чего-угодно...

А еще мы там функций вида echo и mysql_query не видели. Ни в коем случае не используйте php пока функции его не появятся в мануалах по JS . А еще в asme нет функций типа alert( - ни в коем случае не используйте JS пока его функции не появятся в документациях по asm-у.

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

Поэтому просто не холиварьте и не будете вынуждать Вам отвечать, ок?:)

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий