![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Здравствуйте, знатоки своего дела! 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	Так вот, значит, вопрос: Подскажите пожалуйста, как мне получить корректные координаты пикселя из TBitmap, загруженной в TImage. Я это делаю так: Код: 
	function GetPixelColor(Canvas: TCanvas; X,Y: Integer): String;
var
  Color:      TColor;
  Color2:     LongInt;
  sColorWeb,
  sColorRGB:  String;
  r,g,b:      Byte;
begin
  Color := Canvas.Pixels[X,Y];
  sColorWeb := 'WEB: ' + ColorToString(Color);
  Color2 := ColorToRGB(Color);
  r := GetRValue(Color);
  g := GetGValue(Color);
  b := GetBValue(Color);
  sColorRGB := 'RGB: (' + IntToStr(r) + ','
                        + IntToStr(g) + ','
                        + IntToStr(b) + ')';
  Result := sColorWeb + #10#13 + sColorRGB;
end;
procedure TMainForm.InImageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
//...
Label1.Caption := GetPixelColor(InImage.Canvas,X,Y);
//...
end;InImage - обычный компонент TImage, расположенный на форме В него загружаеся какая-то картинка, причем, размеры картинки, допустим, 100 на 100 пикс., а размеры компонента - 200 на 200. Так вот, после загрузки картинки, она вписиывается в компонент с соблюдением пропорций (Stretch := True; Proportional := True); В итоге, визуально мы видим правильно вписанную картинку, но когда пытаемся получить цвет пикселя с канвы TImage или c канвы TImage.Picture.Bitmap, все координаты получаются неверными, т.е. фактически X и Y, например = 50, а цвет, возвращаемый функцией Canvas.Pixels[X,Y] соответствует цвету пикселя, расположенного выше и левеетого, на который мы навели мышь. Я немного покопался и понял, что в канве находится как бы картинка не растянутая, а та, которую мы загружали (визуально она растянулас на компоненте мы ее видим растянутой,а на самом деле она все еще прежних размеров и Canvas той же шириныи высоты,что и картинка, а не той, что Компонент TImage). Наверное, всеэто звучит запутанно, если чего не совсем понятно- пишите, я уточню... Надеюсь, кто-нибудь уже сталкивался с подобным. Спасибо.  | 
| 
		 
			 
			#2  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Непосредственно с такой ситуацией я не сталкивался, но нечто похожее делать приходилось. Мне нужно было получить цвет пикселя под курсором мыши. Я это сделал так: 
		
	
		
		
		
		
		
	
		
		
	
	
	Код: 
	procedure TForm1.Timer1Timer(Sender: TObject); var DC: HDC; Cur: TPoint; ColorValue: Cardinal; begin DC := GetDC( 0 ); // Получаю координаты курсора GetCursorPos( Cur ); // Узнаю цвет пикселя в полученных координатах ColorValue := GetPixel( DC, Cur.X, Cur.Y ); // Показываю полученный цвет PanelMonitor.Color := ColorValue; // Показываю красную составляющую цвета TrackRValue.Position := GetRValue( ColorValue ); // Показываю зеленую составляющую цвета TrackGValue.Position := GetGValue( ColorValue ); // Показываю синюю составляющую цвета TrackBValue.Position := GetBValue( ColorValue ); ReleaseDC( 0, DC ); end;  | 
| 
		 
			 
			#3  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Спасибо огромное, дружище! 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	Я уже замучался просто. Еще раз благодарю!  | 
| 
		 
			 
			#4  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 У меня подобное задание: на bitmap проводится линия, необходимо узнать цвет пикселей, через которые она проходит. Возникает проблема с занесением данных в массив. Не могли б Вы написать примерный код. Заранее спасибо. 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#5  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 -------Это должно выполнятся, когда прямая еще не нарисована--------- 
		
	
		
		
		
		
		
		
			Код: 
	//Чтобы не было проблем с занисением данных в массив type PixelData=record Point:Tpoint; //Координаты точки Color:TColor //Цвет точки end; var Mass: array of PixelData; //Наш массив //Формирование массива procedure GetMass(x1,y1,x2,y2:integer); //Координаты двух точек через которые проходит прямая var t,x,y:integer; begin SetLength(Mass,x2-x1); for t:=x1 to x2 do begin //Система параметрических уравнений, которой удовлетворяет каждая точка прямой x:=x1+t*(x2-x1); y:=y1+t*(y2-y1); Mass[t-x1].x:=x; Mass[t-x1].y:=y; Mass[t-x1].color:=bitmap.canvas.pixel[x,y]; //Здесь твой битмап end; end; //Не гарантирую правильность и точность (не проверял), возможно сущуствует и более рациональное решение Последний раз редактировалось Admin, 07.10.2009 в 12:18.  | 
| 
		 
			 
			#6  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 ART, спасибо 
		
	
		
		
		
		
		
	
		
		
	
	
	у меня была подобная идея, но в этом случае несовместимы   Point:Tpoint; //Координаты точки Mass[t-x1].x:=x; Mass[t-x1].y:=y; кроме того, он будет двигаться в горизонтальном направлении, а не вдоль линии  | 
| 
		 
			 
			#7  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Помогите пожалуйста. А если мне нужно узнать цвет любого пиксела не в форме. Т.е., например, на рабочем столе, или в программе... Какой DC использовать, и, скажем, если я иду через функцию function GetActiveWindow: HWnd, то как получить HWnd именно нужного мне окна. 
		
	
		
		
		
		
		
	
		
		
	
	
	Достаточно ли просто выделить нужное окно, или необходимо глубже лезть? ![]()  |