![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Помогите, пожалуйста!! 
		
	
		
		
		
		
		
	
		
		
	
	
	Как сделать выделение произвольной области на изображении (Bitmap) ?? Потом эту выделенную область нужно в файл сохранять.  | 
| 
		 
			 
			#2  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Отлавливаете пермещение мыши по битмапу, при нажатии кнопки начинаете рисовать прямоугольник. Когда отпускаете кнопку рисовать прямоугольник перестаете и копируете в новый битмап регион попавший в выделенную область. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#3  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 В этом и загвоздка, что выделить нужно не прямоугольную область, а типа какую мышкой обведешь. 
		
	
		
		
		
		
		
	
		
		
	
	
	Если можно, выложите код, пожалуйста, как реализовать.  | 
| 
		 
			 
			#4  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Код писать лень. Идея такова: тебе надо следить за мышкой и запоминать кк координаты. Потом, по этим координатам строится регион, по которому и производится вырезание. Фактически, с момента нажатия кнопки мыши ты начинаешь запоминать ее координаты (в OnMouseMove). Когда кнопку отпускают, то перестаешь запоминать. В результате у тебя есть некоторый список координат, отражающих путь мыши. По этим координатам можно построить некоторый полигон (регион), по которому и делать обрезку. Да, не забудь замкнуть контур принудительно, т.е. в списке повторить в конце первые координаты. 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#5  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Я понимаю словами как оно должно быть, но программно, боюсь, не смогу это написать... Мне сказали, что самой это сложно сделать((((((( 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#6  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Тебя обманули, не сложно. Есть только одно уточнение к вышепредложенному варианту. После того как мышь отпустили желательно пройтись по списку и исключить лишние координаты. 
		
	
		
		
		
		
			
		
		
		
		
		
			Вот примерно так будет: Код: 
	procedure TForm1.FormCreate(Sender: TObject);
begin
 StartSelectArea := False;
end;
procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 StartSelectArea := True;
 SetLength(SelectArea, 1);
 SelectArea[0] := Point(X,Y);
end;
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 if StartSelectArea
 then if (SelectArea[High(SelectArea)].X <> X) or (SelectArea[High(SelectArea)].Y <> Y)
      then begin
           SetLength(SelectArea, Length(SelectArea)+1);
           SelectArea[High(SelectArea)] := Point(X,Y);
           end;
end;
procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 StartSelectArea := False;
 Image2.Canvas.Pen.Color := clRed;
 Image2.Canvas.Polygon(SelectArea);
end;
Последний раз редактировалось Страдалецъ, 14.04.2010 в 19:18.  | 
| 
		 
			 
			#7  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Это получается, что мы изначальное изображение в PaintBox1 загружаем, а потом то, что выделили уже хранится в  Image2.Canvas.Polygon , так? 
		
	
		
		
		
		
		
	
		
		
	
	
	Сейчас попробую сделать, что тут написано =)  | 
| 
		 
			 
			#8  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Не совсем так, там где выделяем область TImage1, а там где рисуем выделенный полигон TImage2. Это просто я поленился переименовывать имена процедур. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#9  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 а в использовании этих компонентов есть какая-то существенная разница?? можно ли оставить PaintBox? 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#10  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 SelectArea какой тип имеет? у меня что-то ошибка вылазит(( 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#11  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Код: 
	SelectArea: Array of TPoint; Последний раз редактировалось Страдалецъ, 14.04.2010 в 23:04.  | 
| 
		 
			 
			#12  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Ой что-то работает))) выделяет)))) 
		
	
		
		
		
		
		
	
		
		
	
	
	Осталось в нормальный вид все привести и обработать. Спасибо большое, очень помогли мне!!!!  | 
| 
		 
			 
			#13  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 А как сделать, чтобы выделенная область была не в виде массива SelectArea, а в виде региона?   (Rgn: HRGN) 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#14  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Цитата: 
	
  | 
| 
		 
			 
			#15  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 У меня часть программы написана с использованием региона ) 
		
	
		
		
		
		
		
	
		
		
	
	
	Там суть в том, что нужно выделить область, для этого применяем выделение по цвету сначала (волшебная палочка), а если результат не устраивает, то тогда уже вручную. Так вот волшебная палочка выделяет область в регион, и рисуется рамка для него, т.е. просто тобводится выделенная область ) а вот при выделении вручную, если делать, как описано тут, выделенная часть как бы вырезается из рисунка, и получается не очень удобно(  |