Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 277

/ вопрос решён /

Доброго времени суток, уважаемые эксперты!
Я прошу вас помочь с доработкой программы:
Мне нужно создать приложение на форму которого помещены компоненты:Label-2шт, Image-1шт. И написать обработчик событий OnMouseMove компонента Image, который отображает с помощью первого компонента Label координаты мыши, а с помощью второго Label цвет каждой составляющей(красной,синей,зеленой) пикселя в текущих координатах.
Вопрос: 1)как координаты объединить в один Label
2)как отобразить цвет пикселя во второй Label на который навел. Второй вопрос важнее.
Кто поможет, заранее спасибо!!!

Приложение:
  1.  
  2.  
  3.  
  4. procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  5. Y: Integer);
  6. begin
  7. label1.Caption:=inttostr(x);
  8. label2.Caption:=inttostr(y);
  9.  


Smirnov Ivan Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Smirnov Ivan (статус: Посетитель)
Вопрос отправлен: 20 января 2008, 14:01
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: Dron

Здравствуйте, Smirnov Ivan!
Вероятно, вы новичок в программировании, потому что первый вопрос очень простой. Label.Caption - строка, текст, а чтобы "связать" две строки в одну, достаточно их сложить (знаком "+"). Поэтому координаты отобразить можно так:

Label1.Caption:=IntToStr(X)+' , '+IntToStr(Y);
Теперь насчёт цвета. Не совсем понятна фраза "пытался так, но похоже он отображает цвет с помощью координат, а не пикселя". Получить цвет точки можно именно через Canvas, только вопрос в том, с какой именно канвой работать. Это зависит от типа изображения загруженного в TImage. К примеру, если загружена картинка из файла *.bmp, то нужно обращаться к Picture.Bitmap:
Label2.Color:=Image1.Picture.Bitmap.Canvas.Pixels[X,Y];
Обращение напрямую к Image.Canvas не всегда даст успех.
Удачи!

Ответ отправил: Dron (статус: Студент)
Время отправки: 20 января 2008, 14:20
Оценка за ответ: 5

Комментарий к оценке: Dron спасибо!
Первый ответ правильный и второй тоже.Во втором у меня написано:
label3.Color:=image1.Canvas.Pixels[x,y];
это опечатка, просто по ходу редактирования текста, половина куда-то подевалось а так было написано:Label3.Color:=Image1.Picture.Bitmap.Canvas.Pixels[X,Y];

После твоего ответа я попробовал создать в Pait файл *.bmp и у меня получилось,а когда брал другие bmp файлы эта функция работала не корректно).
Благодарю, удачи!

Ответ #2. Отвечает эксперт: Николай Рубан

Здравствуйте, Smirnov Ivan!

В дополнение к предыдущему ответу, скажу что если Вам предварительно не извесен формат картинки, то можно обратится к канвасу самой формы. Так же в примере полученный цвет отображается в RGB.

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var r,g,b:Byte;
    rgb:TColor;
begin
  Label1.Caption:=Format('%dx%d',[x,y]);
  rgb:=ColorToRGB(Form1.Canvas.Pixels[x,y]);
  Label2.Caption:=Format('R=%d G=%d B=%d',[GetRValue(rgb),GetGValue(rgb),GetBValue(rgb)]);
end;

Good Luck!!!

Ответ отправил: Николай Рубан (статус: 10-ый класс)
Время отправки: 20 января 2008, 15:28
Оценка за ответ: 5

Комментарий к оценке: Спосибо!
Тоже может пригодиться)

Мини-форум вопроса

Всего сообщений: 5; последнее сообщение — 21 января 2008, 18:44; участников в обсуждении: 3.
Smirnov Ivan

Smirnov Ivan (статус: Посетитель), 20 января 2008, 16:22 [#1]:

Причем функция
label1.Color:=image1.Canvas.Pixels[x,y];
тоже действует)
Dron

Dron (статус: Студент), 20 января 2008, 16:44 [#2]:

Smirnov Ivan:

Цитата:

Причем функция label1.Color:=image1.Canvas.Pixels[x,y]; тоже действует)

Ну, это не функция, а строка программного кода, команда. Лучше называть вещи своими именами.

Николай Рубан:
В коде "r,g,b:Byte;" - лишнее :-)
С уважением.
Smirnov Ivan

Smirnov Ivan (статус: Посетитель), 20 января 2008, 18:42 [#3]:

“Цитата” ()
Ну, это не функция, а строка программного кода, команда. Лучше называть вещи своими именами.

Запомню, на будущее)
Николай Рубан

Николай Рубан (статус: 10-ый класс), 20 января 2008, 22:17 [#4]:

Да Вы правы просто изначально код выглядел так:

...
r:=GetRValue(Color);
  g:=GetGValue(Color);
  b:=GetBValue(Color);
  ShowMessage(format('R=%d G=%d B=%d',[r,g,b]));
...

Забыл убрать.... :)))
Smirnov Ivan

Smirnov Ivan (статус: Посетитель), 21 января 2008, 18:44 [#5]:

да, без r,g,b:Byte; работает также)

31 января 2011, 19:30: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:25
Выполнено за 0.04 сек.