|
Вопрос # 1 277/ вопрос решён / |
|
Доброго времени суток, уважаемые эксперты!
Я прошу вас помочь с доработкой программы:
Мне нужно создать приложение на форму которого помещены компоненты:Label-2шт, Image-1шт. И написать обработчик событий OnMouseMove компонента Image, который отображает с помощью первого компонента Label координаты мыши, а с помощью второго Label цвет каждой составляющей(красной,синей,зеленой) пикселя в текущих координатах.
Вопрос: 1)как координаты объединить в один Label
2)как отобразить цвет пикселя во второй Label на который навел. Второй вопрос важнее.
Кто поможет, заранее спасибо!!!
Приложение: Переключить в обычный режим-
-
-
- procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
- Y: Integer);
- begin
- label1.Caption:=inttostr(x);
- label2.Caption:=inttostr(y);
-
 |
Вопрос задал: 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 (статус: Посетитель), 20 января 2008, 16:22 [#1]:
Причем функция
label1.Color:=image1.Canvas.Pixels[x,y];
тоже действует)
|
|
Dron (статус: Студент), 20 января 2008, 16:44 [#2]:
Smirnov Ivan:
Цитата:
Причем функция label1.Color:=image1.Canvas.Pixels[x,y]; тоже действует)
Ну, это не функция, а строка программного кода, команда. Лучше называть вещи своими именами.
Николай Рубан:
В коде "r,g,b:Byte;" - лишнее
С уважением.
|
|
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 (статус: Посетитель), 21 января 2008, 18:44 [#5]:
да, без r,g,b:Byte; работает также)
|
31 января 2011, 19:30: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|