Форум: "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.043 c