PDA

Просмотр полной версии : Надо сделать crop как в фотошопе


Sh@man
31.08.2004, 18:42
Мне во флеше необходимо реализовать работу инструмента Crop точно так как он сделан в фотошопе, т.е. при выделении области картинки остается видима только эта область, а остальная часть затеняется, видны бегущие пунктиры, квадратики и т.д.
Может кто уже делал такое? Подскажите функции.
Thnx

Flasham
01.09.2004, 19:09
Привет!

После того как выделена область, скриптом:

1. создаеш пустой клип с depth > того где картинка, т.е. размещаеш его над кортинкой.

2. в этом клипе ресуеш 4 прямоугольника кот. будут закрывать "обрезанную" часть картинку, например серого цвета.

3. устанавливаеш альфа данного клипа на 50%.


Бегущую линию - можно например сделать клип с 1-й линией, в кото будет проигроватся анимация. Причем данный клип должен иметь маску в кач-ве мувиклипа и заданным именем, а также иметь максимально возможную длинну. ПОтом береш этот клип и дублируеш его 4 раза и размещаеш слева, сверху,справа, снизу. А размер его регулируется маской.

Такие варианты первыми пришли в голову.

Удачи

Sh@man
01.09.2004, 19:33
Э-э-э неее. Я не то имел в виду. Мне надо все скриптом сделать. Т.е. загружаем картинку, а затем выделяем мышью область картинки и чтоб выделение производилось динамически как в фотошопе - с такими же эффектами и т.д.

sergwizard
02.09.2004, 03:16
Может быть, не самый лучший вариант, но напрягаться сейчас - просто лень, и спать хочется. Позови Silin(a), он любит и умеет такие вещи до ума доводить.

Sh@man
02.09.2004, 17:46
А где его искать этого Silin(a) ?

Sh@man
02.09.2004, 17:54
А в принципе то что ты сделал - очень неплохо. Спасибо.

sergwizard
03.09.2004, 19:18
Вот так, наверное, интереснее будет. Но есть одна проблема: все хорошо, если делаешь выделение стандартным способом – сверху-слева вниз-вправо. Если в других направлениях, - получается лажа.
Надо прописывать дополнительные условия. Будет время, - поправлю. Если еще желающих не найдется. :)

Штрек
03.09.2004, 20:13
Да уж Силин бы сделал конфетку. :p
У меня вот что получилось -
есть мув с пунктирным квадратом и линкаге -

Ну а дальше всё просто /относительно/ -

xf = foto._x;
yf = foto._y;
xc = cont._x;
yc = cont._y;
_root.onMouseDown = function() {
limit_foto = foto.getBounds(this);
foto.setMask(null);
if (!knopka.hitTest(_root._xmouse, _root._ymouse, false)) {
foto._x = xf;
foto._y = yf;
cont._x = xc;
cont._y = yc;
x1 = _root._xmouse;
y1 = _root._ymouse;
_root.onEnterFrame = function() {
cont.attachMovie("punktir", "punktir", 1);
with (cont) {
if (x1>=limit_foto.xMin && x1<=limit_foto.xMax) {
if (_root._xmouse>=limit_foto.xMin && _root._xmouse<=limit_foto.xMax) {
_x = x1+(_root._xmouse-x1)/2;
_xscale = Math.abs(_root._xmouse-x1);
} else if (_root._xmouse<limit_foto.xMin) {
_x = limit_foto.xMin+(x1-limit_foto.xMin)/2;
_xscale = Math.abs(x1-limit_foto.xMin);
} else if (_root._xmouse>limit_foto.xMax) {
_x = x1+(limit_foto.xMax-x1)/2;
_xscale = Math.abs(x1-limit_foto.xMax);
}
} else if (x1<limit_foto.xMin) {
if (_root._xmouse>=limit_foto.xMin && _root._xmouse<=limit_foto.xMax) {
_x = limit_foto.xMin+(_root._xmouse-limit_foto.xMin)/2;
_xscale = Math.abs(limit_foto.xMin-_root._xmouse);
} else if (_root._xmouse<limit_foto.xMin) {
_x = limit_foto.xMin;
_xscale = 0;
} else if (_root._xmouse>limit_foto.xMax) {
_x = (limit_foto.xMax+limit_foto.xMin)/2;
_xscale = Math.abs(limit_foto.xMax-limit_foto.xMin);
}
} else if (x1>limit_foto.xMax) {
if (_root._xmouse>=limit_foto.xMin && _root._xmouse<=limit_foto.xMax) {
_x = limit_foto.xMax+(_root._xmouse-limit_foto.xMax)/2;
_xscale = Math.abs(limit_foto.xMax-_root._xmouse);
} else if (_root._xmouse<limit_foto.xMin) {
_x = (limit_foto.xMax+limit_foto.xMin)/2;
_xscale = Math.abs(limit_foto.xMax-limit_foto.xMin);
} else if (_root._xmouse>limit_foto.xMax) {
_x = limit_foto.xMax;
_xscale = 0;
}
}
if (y1>=limit_foto.yMin && y1<=limit_foto.yMax) {
if (_root._ymouse>=limit_foto.yMin && _root._ymouse<=limit_foto.yMax) {
_y = y1+(_root._ymouse-y1)/2;
_yscale = Math.abs(_root._ymouse-y1);
} else if (_root._ymouse<limit_foto.yMin) {
_y = limit_foto.yMin+(y1-limit_foto.yMin)/2;
_yscale = Math.abs(y1-limit_foto.yMin);
} else if (_root._ymouse>limit_foto.yMax) {
_y = y1+(limit_foto.yMax-y1)/2;
_yscale = Math.abs(y1-limit_foto.yMax);
}
} else if (y1<limit_foto.yMin) {
if (_root._ymouse>=limit_foto.yMin && _root._ymouse<=limit_foto.yMax) {
_y = limit_foto.yMin+(_root._ymouse-limit_foto.yMin)/2;
_yscale = Math.abs(limit_foto.yMin-_root._ymouse);
} else if (_root._ymouse<limit_foto.yMin) {
_y = limit_foto.yMin;
_yscale = 0;
} else if (_root._ymouse>limit_foto.yMax) {
_y = (limit_foto.yMax+limit_foto.yMin)/2;
_yscale = Math.abs(limit_foto.yMax-limit_foto.yMin);
}
} else if (y1>limit_foto.yMax) {
if (_root._ymouse>=limit_foto.yMin && _root._ymouse<=limit_foto.yMax) {
_y = limit_foto.yMax+(_root._ymouse-limit_foto.yMax)/2;
_yscale = Math.abs(limit_foto.yMax-_root._ymouse);
} else if (_root._ymouse<limit_foto.yMin) {
_y = (limit_foto.yMax+limit_foto.yMin)/2;
_yscale = Math.abs(limit_foto.yMax-limit_foto.yMin);
} else if (_root._ymouse>limit_foto.yMax) {
_y = limit_foto.yMax;
_yscale = 0;
}
}
xxx = _x;
yyy = _y;
_parent.fl = true;
}
};
}
};
_root.onMouseUp = function() {
xsmesch = foto._x-xxx;
ysmesch = foto._y-yyy;
delete _root.onEnterFrame;
};
knopka.onPress = function() {
foto.setMask(cont);
if (fl) {
foto._x += xsmesch;
foto._y += ysmesch;
cont._x += xsmesch;
cont._y += ysmesch;
}
fl = false;
};
Очень надеюсь на помошь Нокса в оптимизации кода. :p

Sh@man
03.09.2004, 20:23
Ай, молодца.... Очень неплохо получается.

Штрек
03.09.2004, 20:45
Оригинал написал(а) Sh@man
Ай, молодца.... Очень неплохо получается.
Чего молодца - давай код оптимизируй...
Если б не надо было б учитывать границы картинки при выделении - было бы 10 строчек, а так вот пришлось в лоб условия прописывать. Надеюсь Нокс мимо не пройдёт, поможет сократить писанину... :p

sergwizard
04.09.2004, 02:41
О, я вижу Штрек подключился. Здорово Михалыч.
Вот это ты наворотил. :) Сомневаюсь, что кто-то сможет оптимизировать твой код, - уж слишком все заморочено.
В принципе, красиво, но тоже есть недостатки: дополнительные символы в библиотеке, при скалировании мувика, изменяются размеры штрихов (нехорошо это).
Вот, я еще наваял вариант. Глянь-ка глазом молодым.

Sh@man
04.09.2004, 14:33
sergwizard, это здорово получилось. Я еще добавлю ограничение на область выделения, т.е. чтоб только картинку можно было выделять и наложение тени на невыделенную область - и будет как раз то что надо.
Спасибо.

sergwizard
04.09.2004, 15:47
Ну-у-у..., тогда вот это попробуй.

Штрек
04.09.2004, 20:16
Оригинал написал(а) sergwizard
Ну-у-у..., тогда вот это попробуй.
Ещё малёхо и можно в Adobe рулить 9ку ваять... :p

Sanik
04.09.2004, 22:30
и наложение тени на невыделенную область - и будет как раз то что надо
И будет супер... (особенно картинки в сэмплы Фотошопа 9 обязательно добавить... :D )

Sh@man
06.09.2004, 11:45
и еще вопрос: как реализовать пропорциональную работу инструмента выделения? Т.е. наподобие когда делаешь выделение с зажатым Shift'ом. Например, задаю x=2, y=3 и исходя из этого надо сделать чтоб отношение ширины выделения к высоте было всегда 2/3.

sergwizard
06.09.2004, 14:33
Блин, ты – вообще-то – хоть что-нибудь сделаешь сам? Или ты хочешь, чтобы все сделали за тебя? Неужели тебе западло просто посидеть, подумать…
Создай объект, слушающий нажатие и отпускание клавиши SHIFT и, в зависимости от этого, меняющий какую-то переменную (sh) на true или false. Потом пропиши условия, если !sh, то все рисуется, как и рисовалось. Если sh, то endY будет равен не _ymouse, а startY+(endX-startX)*(заданный коэффициент). И дальше - в том же духе.

Sh@man
06.09.2004, 14:42
уже сделал сам )

Sh@man
06.09.2004, 14:49
В последнее время действительно лень думать. Извини если достал.