Цвет точки

  • Автор темы SOV
  • Дата начала
Статус
Закрыто для дальнейших ответов.
S
#1
На форме элементарно просто можно нарисовать кружек, квадрат, точку, ... заранее определенного цвета.
А вот как узнать цвет заранее определенной точки (например узнать цвет в целочисленном формате)?
 
S
#2
Подскажите пожалуйста еще с одним похожим нюансом.
Как узнать цвет (в целочисленном формате) определенного пикселя графического файла (bmp и jpg).
Помогите исходником.
 
G

Guest

#3
:) Елементарно!

//Цвет пикселя на форме за координ. точки.
var color:Tcolor;
begin
color:=form1.canvas.pixels[x,y];
end;
//Цвет color будет равно прибл. =1000000; вот такому числу;
//ето код цвета;
//если нужно витянуть RGB, пиши я позже отвечу!


//Насчет bmp и (jpg :( ) файлов тоже просто!
//Увы я могу помочь только с bmp
var bit:Tbitmap;
color:Tcolor;
begin
bit:=TBitmap.create;
bit.LoadFromFile('*.bmp');
color:=bit.Canvas.Pixels[x,y];
end;






:( Чето типа того! Юзайте!

Извеняюсь!
free(bit); :)
 
S

sab0tage

#6
Я бы использовал GetPixel

Код:
function DesktopColor(const X, Y: Integer): TColor;
var
c: TCanvas;
begin
c := TCanvas.Create;
try
c.Handle := GetWindowDC(GetDesktopWindow);
Result  := GetPixel(c.Handle, X, Y);
finally
c.Free;
end;
end;
 
Z

Zuzlan

#7
Поскольку цвет определяется тремя цветами (RGB), то было бы удобнее воспользоваться следующим:
Код:
r:=GetRValue(image1.Picture.Bitmap.Canvas.Pixels[i,j])
g:=GetGValue(image1.Picture.Bitmap.Canvas.Pixels[i,j])
b:=GetBValue(image1.Picture.Bitmap.Canvas.Pixels[i,j])
где r,g,b типа integer и находятся в диапозоне от 0 до 255

Что же касается JPG файлом, то сперва их нужно конвертировать в bitmap
Удобнее всего для этого - воспользоваться процедурой:

Код:
procedure AnyToBitmap(Bmp:Graphics.TBitmap;const FileName:string);
var
OleGraphic:TOleGraphic;
Stream:TFileStream;
begin
Stream:=TFileStream.Create(FileName,fmOpenRead or fmShareDenyWrite);
try
OleGraphic:=TOleGraphic.Create;
try
OleGraphic.LoadFromStream(Stream);
Bmp.Width:=OleGraphic.Width;
Bmp.Height:=OleGraphic.Height;
Bmp.Palette:=OleGraphic.Palette;
Bmp.Transparent:=OleGraphic.Transparent;
Bmp.Canvas.Draw(0,0,OleGraphic);
finally
OleGraphic.Free;
end;
finally
Stream.Free;
end;
end;

А вообще на королевстве делфи эти вопросы поднимались много раз, поэтому там можно найти более исчерпывающие ответы по этой теме...

Сам же я интересуюсь сравниванием изображений... Причем попиксельно не очень бы холтелось, потому как это отнимает много времени... Есть идеи?
 
S
#8
Большео всем спасибо за помощь.
Но насчет jpeg фйлов есть одно маленькое но.
Не хотелось бы загружать весть вайл, чтобы узнать цвет всего одной точки.
По задумке, ихзображение будет находиться в нескольких файлох подобного формата.
И при масштабировании необходимо более рациональнее использавть рксурсы, для увеличения скорости.
Может у кого нибудь есть реальный алгоритм по конвертированию jpeg файлов. Тоесть надо нать в bmp не цельный файл а только одну конуретную матрицу 8х8.

Насчает сравнивания изображений, пока не сталкивался с этими вопросами.
но в последнее время становятся популянрыми фрактальные алгоритмы.
Несколько тем, правда не по сравнению, а по сжатию изображений рассматриваются на сайтах
http://www.compression.ru/
http://compression.graphicon.ru/
А насчет идеи, вохможно както можно сравнивать изобрадения по плотности, и насыщености цветов. Это просто идея в толпу ;)
Еще разок большое спасибо всем за помощь и идеи.
 
P

Pradov

#9
А как быть с флешь?Очень надо.....и анимация через определенный промежуток времени движеться!
 
Z

Zuzlan

#10
А как быть с флешь?Очень надо.....и анимация через определенный промежуток времени движеться!
Вот как быть с флешками не знаю... вернее знаю, но механизм реализации не самых лучших... но как вариант...
Вобщем можно делать принтскрины экрана, а потом искать позицию и вырезать.
Скорее всего можно и проще... я бы на твоем месте на королевстве поискал
 
Z
#11
1. Создать совместимый контекст устройства CreateCompatibleDC.
2. Создать и проинициализировать структуру BITMAPINFO размером с точку.
3. Создать дибсекцию CreateDibSection с созданной структурой BITMAPINFO.
4. Выбрать в созданном контексте созданную дибсекцию SelectObject.
5. Скопировать из контекста, где отображается флеш в созданный контекст нужную точку BitBlt.
6. Получить RGB-байты этой точки с помощью функции GetDiBits.
7. Очистить все что создали.
 
A

Aim Destroyer

#13
А как определить цвет серой точки рисунка в оттенках серого так, чтоб она была равна 1..256?
 
Z

Zuzlan

#14
А как определить цвет серой точки рисунка в оттенках серого так, чтоб она была равна 1..256?
Особонностью серого цвета является то, что все 3 цвета(RGB) имеют одинаковые значения...
Т.е. (12,12,12) или (145,145,145). Чем ближе к значению 255, тем светлее.
Для того что бы перевести картинку в ч.б.(с оттенками) я просто брал общее арифметическое RGB.
Если нужно на выходе получить вообще только 2 цвета, то находишь среднее значение RGB на всей картинке и сравниваешь его со всеми точками, если точка оказывается темнее, то присваиваешь ей черный цвет (0,0,0) и наоборот...
 
A

Aim Destroyer

#15
Большое спасибо!!! :)
А то я пыталься найти кубический корень каждой точки на картинке и моя прога начинала глючить, ошыбки выдавать.... Видно комп не выдержал.
 
Z

Zuzlan

#16
Большое спасибо!!! :)
А то я пыталься найти кубический корень каждой точки на картинке и моя прога начинала глючить, ошыбки выдавать.... Видно комп не выдержал.
А ошибки могли вылетать потому, что кубический корень на выходе не дает целого числа... нужно было сделать div 1
 
Статус
Закрыто для дальнейших ответов.