Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.10;
Скачать: CL | DM;

Вниз

Image   Найти похожие ветки 

 
ser_ega   (2004-07-08 17:22) [0]

Мастера помогите! Как для Image сделать "пипетку" (Определение цвета точки), типа как в Corel Draw!


 
Огромное Кулясищще ©   (2004-07-08 18:41) [1]

Обрабатывай OnMouseDown. Обработчик предоставляется переменные X, Y, хранящие координаты курсора. По этим координатам определишь цвет пикселя:

Color := Image.Picture.Bitmap.Pixels[x,y];


 
grom   (2004-07-08 21:47) [2]

procedure TForm1.Timer1Timer(Sender: TObject);
var c:TColor;
begin
c := GetPixel(GetDC(0),Mouse.CursorPos.X, Mouse.CursorPos.Y);
Caption :="R="+IntToStr(GetRValue(c)) + " G=" + IntToStr(GetGValue(c)) + " B=" + IntToStr(GetBValue(c));
Color := c;
end;
----------
http://www.zdima-iv.nm.ru/delphi.html
Color Choose v1.2


 
Огромное Кулясищще ©   (2004-07-08 22:36) [3]

procedure TForm1.Timer1Timer(Sender: TObject);

Это абсолютно неправильный подход. Он работает, но это неверный подход из-за нежелания работать с хуками. К тому же - зачем, если в пределах компонента можно обойтись стандартными обработчиками событий?


 
grom   (2004-07-09 08:03) [4]

А как насчет http://www.zdima-iv.nm.ru/delphi.html
Color Choose v1.2
Подход правильный ?


 
Огромное Кулясищще ©   (2004-07-09 14:04) [5]

Подход правильный, но в коде есть ошибка. При вызове Perevod происходит ZDimaDrow, которая рисует квадратик с цветом. Дело в том, что когда происходит рисование на канве формы, Delphi автомтаически генерирует OnPaint, в котором опять же стоит ZDimaDrow, т.е. одно и то же рисуется два раза.

Выход - использовать в процедуре Perevod вызов Invalidate, который вызывает OnPaint.

========================

В том примере цвет опередлялся только пока SpeedButton был нажат. Однако чтобы не зависеть от этого нужно использовать хуки - просто повесить хук на мышь.

Малой же кровью этого можно добиться обработкой
procedure WMLButtonDown(var Message: TMessage); message WM_LBUTTONDOWN;

Если надо, то приведу код.


 
ser_ega   (2004-07-09 23:03) [6]

А как мне для отсканированной картинки определить цвет определенного прямоугольника? Допустим этот прямоуг. должен быть черный, но отсканированная картинка может иметь не черный цвет а какой-то оттенок черного! Как быть?


 
ser_ega   (2004-07-09 23:21) [7]

Я пишу так:
Label1.Color := Image.Picture.Bitmap.Pixels[x,y];
А он мне ошибку выдает: Неизвестный идентификатор Pixels!
Что это?


 
Огромное Кулясищще ©   (2004-07-10 00:34) [8]

>А он мне ошибку выдает: Неизвестный идентификатор Pixels!

Извиняюсь:
Label1.Color := Image.Picture.Bitmap.Canvas.Pixels[x,y];


 
Огромное Кулясищще ©   (2004-07-10 00:41) [9]

>А как мне для отсканированной картинки определить цвет определенного прямоугольника? Допустим этот прямоуг. должен быть черный, но отсканированная картинка может иметь не черный цвет а какой-то оттенок черного! Как быть?

Я так понимаю задачу: есть отсканированный прямоугольник, который на самом деле чёрный (clBlack), но отсканировался не совсем чёрным. Это можно сделать так:


function IsBlack(AColor: TColor; Similarity: Byte): Boolean;
var R, G, B: Integer;    
begin
 R := GetRValue(AColor);
 G := GetGValue(AColor);
 B := GetBValue(AColor);
 If (R <= Similarity) and (G <= Similarity) and
   (B <= Similarity) then Result := True else
     Result := False;
end;


Код я не проверял на наличие ошибок, если есть таковые - попробуй исправить.

Применять так. Получаешь цвет и вызываешь:
 If IsBlack(Color, 30) then ShowMessage("Color is black")
  else ShowMessage("Color is not black");

Значение Similarity показывает, насколько цвет должен совпадать. Чем меньше Similarity, тем точнее должен чернее должен быть цвет, чтобы его определило как чёрный.


 
ser_ega   (2004-07-14 18:08) [10]

А где вводятся координаты прямоугольника?


 
Огромное Кулясищще ©   (2004-07-14 18:22) [11]

Собственно, нигде. IsBlack проверяет, является ли заданный цвет чёрным с каким-то отклонением или нет. Цвет ты должен задать сам (я так подумал, что это задача пользователя - ткнуть мышкой в прямогуольник).


 
ser_ega   (2004-07-15 23:53) [12]

Смотри я так сделал:

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
    CColor := Image1.Picture.Bitmap.Canvas.Pixels[x,y];
    Label1.Color:=CColor;
    If IsBlack(CColor, 50) then Label2.Caption:="BLACK"
       else Label2.Caption:="NOT BLACK";
end;

Но в CCOLOR совсем не тот цвет! т.е. CCOLOR и реальный цвет (там куда я ткнут мышкой) не совпадает!
Что за фигня?


 
grom   (2004-07-16 09:14) [13]

Смотри я так сделал:
procedure TForm1.Image256Click(Sender: TObject);
begin
CColor:=GetPixel(GetDC(0),Mouse.CursorPos.X, Mouse.CursorPos.Y);
Label1.Color:=CColor;
If IsBlack(CColor, 50) then Label2.Caption:="BLACK"
                       else Label2.Caption:="NOT BLACK";
end;
Но в CCOLOR совсем тот цвет! т.е. CCOLOR и реальный цвет (там куда я ткнут мышкой) совпадает! УРА!!!


 
Koster   (2004-07-16 11:40) [14]

Зачем так круто? Image1.Picture.Bitmap.Canvas.Pixels

Ведь можно Image1.Canvas.Pixels (даже если загружен не BMP файл, а JPEG например или WMF)


 
Огромное Кулясищще ©   (2004-07-16 13:14) [15]

Для того, чтобы вот такой квадратик:
http://www.hot.ee/mvps6/pic1.png
определился правильно, нужно вызывать с IsBlack(CColor, 100), потому что там уже откровенно серый цвет.

2 grom:

Что за страсть к экранным координатам?


 
grom   (2004-07-16 14:00) [16]

Что за страсть к экранным координатам?
Зато работает как надо


 
Огромное Кулясищще ©   (2004-07-16 15:50) [17]

> Зато работает как надо

Да, но и в ser_ega (15.07.04 23:53) [12] всё работает как надо.

К тому же:

CColor := GetPixel(GetDC(0),Mouse.CursorPos.X, Mouse.CursorPos.Y);

А кто и более того - каким образом будет освобождать DC???


 
grom   (2004-07-16 17:21) [18]

в ser_ega (15.07.04 23:53) [12]
CColor := Image1.Picture.Bitmap.Canvas.Pixels[x,y];
Но в CCOLOR совсем не тот цвет! т.е. CCOLOR и реальный цвет (там куда я ткнут мышкой) не совпадает!
   Не совпадает цвет c реальным.
-----------------------
CColor:=GetPixel(GetDC(0),Mouse.CursorPos.X, Mouse.CursorPos.Y);
совпадает цвет c реальным.


 
Огромное Кулясищще ©   (2004-07-16 17:46) [19]

2 grom:

А откуда ты знаешь, работает ли твой код у ser_ega? Это раз. А почему бы тебе не проверить код от ser_ega у себя? Это два. И наконец, так что же будет освобождать дескриптор или так и оставишь утечку памяти? Это три.


 
grom   (2004-07-16 19:14) [20]

Это раз. ну тамже ясно написано =Но в CCOLOR совсем не тот= цвет!

Это два. Что мне проверять код.

CColor := Image1.Picture.Bitmap.Canvas.Pixels[x,y];
будет правильно определять цвет под мышкой если картинка
в Image1 находится в нормальном состоянии.
А если картинка в Image1 сжата или ратянута то цвет вудет искажен.

пример
------
берем картинку 16х16
растягиваем
Image1.Stretch:=True;
далее
Image1.Width:=100;
Image1.Height:=100;
пробуем
получается полная фигня
------------------------
CColor:=GetPixel(GetDC(0),Mouse.CursorPos.X, Mouse.CursorPos.Y);
в любом случае цвет определяется правильно

Это три. сделаем как в http://www.zdima-iv.nm.ru/delphi.html
Color Choose v1.2


 
Огромное Кулясищще ©   (2004-07-16 20:35) [21]

>Это раз. ну тамже ясно написано =Но в CCOLOR совсем не тот= цвет!

В ser_ega  15.07.04 23:53) [12] человек использовал не тот код, который ты выставляешь за рабочий. Никто не знает, заработает ли тот код, который ты предложил, у него. Вся проблема была явно в том, что Similarity = 50 нехватало.

Если с растяжением, то сойдёт и Image1.Canvas.Pixels. Кому как удобней.

Про третий пункт. Если сделаешь, как в Color Choose, то тогда хвала демонам.



Страницы: 1 вся ветка

Текущий архив: 2004.10.10;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.075 c
4-1094722724
BRemB
2004-09-09 13:38
2004.10.10
Контекстное меню


1-1096113765
Billi
2004-09-25 16:02
2004.10.10
Проблема кодировок


1-1095949017
zokzok
2004-09-23 18:16
2004.10.10
StringGrid


1-1096007928
Lexxx
2004-09-24 10:38
2004.10.10
Помогите вытащить PrintPreview у DBChart :(


4-1094609462
Бушин Сергей
2004-09-08 06:11
2004.10.10
Кто нибудь завязывался на IFS?