Цвет точки

  • Автор темы SOV
  • Дата начала
Статус
Закрыто для дальнейших ответов.
S

SOV

На форме элементарно просто можно нарисовать кружек, квадрат, точку, ... заранее определенного цвета.
А вот как узнать цвет заранее определенной точки (например узнать цвет в целочисленном формате)?
 
S

SOV

Подскажите пожалуйста еще с одним похожим нюансом.
Как узнать цвет (в целочисленном формате) определенного пикселя графического файла (bmp и jpg).
Помогите исходником.
 
G

Guest

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

//Цвет пикселя на форме за координ. точки.
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); :)
 
G

Guest

Если че обрящайся! Чем смогу помогу! :)
 
S

sab0tage

Я бы использовал 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

Поскольку цвет определяется тремя цветами (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

SOV

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

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


А насчет идеи, вохможно както можно сравнивать изобрадения по плотности, и насыщености цветов. Это просто идея в толпу ;)
Еще разок большое спасибо всем за помощь и идеи.
 
P

Pradov

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

Zuzlan

А как быть с флешь?Очень надо.....и анимация через определенный промежуток времени движеться!
Вот как быть с флешками не знаю... вернее знаю, но механизм реализации не самых лучших... но как вариант...
Вобщем можно делать принтскрины экрана, а потом искать позицию и вырезать.
Скорее всего можно и проще... я бы на твоем месте на королевстве поискал
 
Z

zubr

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

Pradov

zubr )) Респект)Спасибо)))
еси че напишу)
 
A

Aim Destroyer

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

Zuzlan

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

Aim Destroyer

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

Zuzlan

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!