Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "Media";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.027 c
4-1094276415
Гаврилов В.А.
2004-09-04 09:40
2004.10.10
Как построить диаграммы к расчетам


3-1092807793
TeNY
2004-08-18 09:43
2004.10.10
Как создать независимую базу данных


1-1095695552
volser
2004-09-20 19:52
2004.10.10
Редактирование ресурсов exe


1-1096129696
AdmeraL
2004-09-25 20:28
2004.10.10
копирование файлов


1-1095775511
misha123
2004-09-21 18:05
2004.10.10
ООП тип?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский