Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 27.06.2009, 19:04
djyamato вне форума Посмотреть профиль Отправить личное сообщение для djyamato Посетить домашнюю страницу djyamato Найти все сообщения от djyamato
  № 1  
Ответить с цитированием
djyamato
 
Аватар для djyamato

Регистрация: Feb 2006
Сообщений: 884
Записей в блоге: 2
Отправить сообщение для djyamato с помощью ICQ Отправить сообщение для djyamato с помощью Skype™
По умолчанию Вырезание части картинки программным методом

Здравствуйте.
Столкнулся со следующим:

ЗАДАЧА - динамически изготовить маску (сложной формы с наклонными и множеством углов)

Есть некая картинка и нужно вырезать ее часть (хотя бы одну), рисуя мышкой выделение.
Я делаю следующим образом:

создаю программно мувик - при нажатии по нему запоминаю точку и добавляю в массив,
сразу после нажатия в цикле отрисовываю на этом мувике по точкам из массива прямые (это выделение).
Затем, по окончании "выделения", (допустим это будет разница по Х и У между первой точкой и любой, которая меньше 3 пикселей) мне нужно то, что внутри выделенного сделать маской, залить и применить эту маску к основной фото (из которой вырезать часть пытаюсь).

Все бы ничего но, например, в рисунках где много изгибов (чертежи допустим) я никак не могу правильно залить (beginFill)

Вот часть кода...

Код AS1/AS2:
_root.createEmptyMovieClip("VirtMC_container",_root.getNextHighestDepth());
LoadedPict=_root.VirtMC_container.createEmptyMovieCl("VirtMC",_root.VirtMC_container.getNextHighestDepth());
HOLST=LoadedPict.createEmptyMovieClip("hlst",LoadedPict.getNextHighestDepth());
PiesRamka=LoadedPict.createEmptyMovieClip("ramka",LoadedPict.getNextHighestDepth());
SelectionMC=LoadedPict.createEmptyMovieClip("Sel",LoadedPict.getNextHighestDepth());
MASK=_root.VirtMC_container.createEmptyMovieClip("VirtMC_mask",_root.VirtMC_container.getNextHighestDepth());
 
MASK.onPress=function(){
   var tmp_Point=new Array();
   tmp_Point[0]=HOLST._xmouse;
   tmp_Point[1]=HOLST._ymouse;
   var canAddPoint=true;
   for(m=0;m<MaskPointsArray.length;m++){
	if(Math.abs(MaskPointsArray[m][0]-tmp_Point[0])< 5 and Math.abs(MaskPointsArray[m][1]-tmp_Point[1])< 5)
   {
	   canAddPoint=false;
	   break;
	}
   }
   if(canAddPoint){
      MaskPointsArray.push(tmp_Point);
      _root.drawSelection();
   }else{
      MaskPointsArray.push(tmp_Point);
      _root.drawSelection();
      _root.fillSelection(); // пока здесь ничего нет
      //inf.text+="Близкие точки !\n";
   }
}
 
_root.drawSelection=function(){
   MASK.beginFill(0xFF0000,30);
   SelectionMC.lineStyle(2, 0xFF0000, 100);
   for(u=0;u<(MaskPointsArray.length-1);u++){
      SelectionMC.moveTo(MaskPointsArray[u][0],MaskPointsArray[u][1]);
      SelectionMC.lineTo(MaskPointsArray[u+1][0],MaskPointsArray[u+1][1]);
      if(u<>0){
	MASK.moveTo(MaskPointsArray[0][0],MaskPointsArray[0][1]);
	MASK.lineTo(MaskPointsArray[u][0],MaskPointsArray[u][1]);
	MASK.lineTo(MaskPointsArray[u+1][0],MaskPointsArray[u+1][1]);
      }
   }
   //  вообще эти предидущие строчки не решают проблемы но хот как-то маска заполняет выделение хотя и неправильно
// если вместо MASK.moveTo(MaskPointsArray[0][0],MaskPointsArray[0][1]) сделать MASK.moveTo(MaskPointsArray[u-1][0],MaskPointsArray[u-1][1]) тоже естественно неправильно маска заполняется
   MASK.endFill();
   LoadedPict.setMask(MASK);
}

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

На рисунке карсное- это выделение (его не замкнул я специально).



Заранее спасибо


Последний раз редактировалось djyamato; 27.06.2009 в 20:44.
Старый 27.06.2009, 20:26
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 2  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Расставьте запятые или тема будет закрыта.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 28.06.2009, 19:09
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 3  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Код AS3:
  for(u=0;u<(MaskPointsArray.length-1);u++){
      SelectionMC.moveTo(MaskPointsArray[u][0],MaskPointsArray[u][1]);
      SelectionMC.lineTo(MaskPointsArray[u+1][0],MaskPointsArray[u+1][1]);
      if(u<>0){
	MASK.moveTo(MaskPointsArray[0][0],MaskPointsArray[0][1]);
	MASK.lineTo(MaskPointsArray[u][0],MaskPointsArray[u][1]);
	MASK.lineTo(MaskPointsArray[u+1][0],MaskPointsArray[u+1][1]);
      }
   }
Помоему проблема в том, что Вы прерываете контур командой moveTo.
Если уж прерываете нужно писать endFill() и снова beginFill(...)
А так - между beginFill() и endFill() должны быть только lineTo(...)

Создать новую тему Ответ Часовой пояс GMT +4, время: 10:05.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 10:05.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.