Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.10.2006, 13:12
Аватар для 4kusNick
4kusNick 4kusNick вне форума
Местный
 
Регистрация: 06.09.2006
Адрес: Россия, Санкт-Петербург
Сообщения: 444
Репутация: 550
Печаль Получить цвет отдельного пикселя

Здравствуйте, знатоки своего дела!
Так вот, значит, вопрос:
Подскажите пожалуйста, как мне получить корректные координаты пикселя из 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).
Наверное, всеэто звучит запутанно, если чего не совсем понятно- пишите, я уточню...
Надеюсь, кто-нибудь уже сталкивался с подобным.
Спасибо.
__________________
THE CRACKER IS OUT THERE
Ответить с цитированием
  #2  
Старый 02.10.2006, 14:32
Аватар для Decoding
Decoding Decoding вне форума
Местный
 
Регистрация: 03.06.2006
Адрес: Почту найдете на моем сайте
Сообщения: 576
Версия Delphi: D10.2
Репутация: 214
По умолчанию

Непосредственно с такой ситуацией я не сталкивался, но нечто похожее делать приходилось. Мне нужно было получить цвет пикселя под курсором мыши. Я это сделал так:
Код:
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  
Старый 02.10.2006, 14:43
Аватар для 4kusNick
4kusNick 4kusNick вне форума
Местный
 
Регистрация: 06.09.2006
Адрес: Россия, Санкт-Петербург
Сообщения: 444
Репутация: 550
По умолчанию

Спасибо огромное, дружище!
Я уже замучался просто.
Еще раз благодарю!
__________________
THE CRACKER IS OUT THERE
Ответить с цитированием
  #4  
Старый 12.11.2006, 21:38
antol antol вне форума
Прохожий
 
Регистрация: 11.11.2006
Сообщения: 3
Репутация: 10
По умолчанию

У меня подобное задание: на bitmap проводится линия, необходимо узнать цвет пикселей, через которые она проходит. Возникает проблема с занесением данных в массив. Не могли б Вы написать примерный код. Заранее спасибо.
Ответить с цитированием
  #5  
Старый 13.11.2006, 09:54
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию

-------Это должно выполнятся, когда прямая еще не нарисована---------
Код:
//Чтобы не было проблем с занисением данных в массив
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: Пока просто напоминание про теги. Стыдно, батенька.
//Не гарантирую правильность и точность (не проверял), возможно сущуствует и более рациональное решение

Последний раз редактировалось Admin, 07.10.2009 в 12:18.
Ответить с цитированием
  #6  
Старый 28.11.2006, 01:17
antol antol вне форума
Прохожий
 
Регистрация: 11.11.2006
Сообщения: 3
Репутация: 10
По умолчанию

ART, спасибо

у меня была подобная идея, но в этом случае несовместимы

Point:Tpoint; //Координаты точки
Mass[t-x1].x:=x;
Mass[t-x1].y:=y;


кроме того, он будет двигаться в горизонтальном направлении, а не вдоль линии
Ответить с цитированием
  #7  
Старый 07.10.2009, 10:42
Iskander Iskander вне форума
Прохожий
 
Регистрация: 06.10.2009
Сообщения: 8
Репутация: 10
По умолчанию А если в общем виде?

Помогите пожалуйста. А если мне нужно узнать цвет любого пиксела не в форме. Т.е., например, на рабочем столе, или в программе... Какой DC использовать, и, скажем, если я иду через функцию function GetActiveWindow: HWnd, то как получить HWnd именно нужного мне окна.
Достаточно ли просто выделить нужное окно, или необходимо глубже лезть?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:13.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter