Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Image [D6, WinXP]


Страницы:   1 2

ser_ega ©   (2004-07-08 17:22:00) 

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


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

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

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

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

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


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

Это раз. ну тамже ясно написано =Но в 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 17:46:00) [3]

2 grom:

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


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

в 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 15:50:00) [5]

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

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

К тому же:

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

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


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

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


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

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

2 grom:

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


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

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

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


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

Смотри я так сделал:
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 и реальный цвет (там куда я ткнут мышкой) совпадает! УРА!!!


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

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

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 и реальный цвет (там куда я ткнут мышкой) не совпадает!
Что за фигня?


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

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


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

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


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

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

Я так понимаю задачу: есть отсканированный прямоугольник, который на самом деле чёрный (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, тем точнее должен чернее должен быть цвет, чтобы его определило как чёрный.


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

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

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


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

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


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

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


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

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

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

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

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

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

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


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

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


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

procedure TForm1.Timer1Timer(Sender: TObject);

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


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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо