Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Цвет точки
Форум программистов > Системное программирование > Delphi и Pascal > Delphi - Multimedia, Графика, Игры
SOV
На форме элементарно просто можно нарисовать кружек, квадрат, точку, ... заранее определенного цвета.
А вот как узнать цвет заранее определенной точки (например узнать цвет в целочисленном формате)?
SOV
Подскажите пожалуйста еще с одним похожим нюансом.
Как узнать цвет (в целочисленном формате) определенного пикселя графического файла (bmp и jpg).
Помогите исходником.
ОлегMonster
smile.gif Елементарно!

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


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






smile.gif Чето типа того! Юзайте!

Извеняюсь!
free(bit); smile.gif
SOV
Большое спасибо вам smile.gif
ОлегMonster
Если че обрящайся! Чем смогу помогу! biggrin.gif
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;
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;



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

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

Насчает сравнивания изображений, пока не сталкивался с этими вопросами.
но в последнее время становятся популянрыми фрактальные алгоритмы.
Несколько тем, правда не по сравнению, а по сжатию изображений рассматриваются на сайтах
]]>http://www.compression.ru/]]>
]]>http://compression.graphicon.ru/]]>
А насчет идеи, вохможно както можно сравнивать изобрадения по плотности, и насыщености цветов. Это просто идея в толпу smile.gif
Еще разок большое спасибо всем за помощь и идеи.
Pradov
А как быть с флешь?Очень надо.....и анимация через определенный промежуток времени движеться!
Zuzlan
Цитата(Pradov @ 25:02:2007, 18:21 ) *
А как быть с флешь?Очень надо.....и анимация через определенный промежуток времени движеться!

Вот как быть с флешками не знаю... вернее знаю, но механизм реализации не самых лучших... но как вариант...
Вобщем можно делать принтскрины экрана, а потом искать позицию и вырезать.
Скорее всего можно и проще... я бы на твоем месте на королевстве поискал
zubr
1. Создать совместимый контекст устройства CreateCompatibleDC.
2. Создать и проинициализировать структуру BITMAPINFO размером с точку.
3. Создать дибсекцию CreateDibSection с созданной структурой BITMAPINFO.
4. Выбрать в созданном контексте созданную дибсекцию SelectObject.
5. Скопировать из контекста, где отображается флеш в созданный контекст нужную точку BitBlt.
6. Получить RGB-байты этой точки с помощью функции GetDiBits.
7. Очистить все что создали.
Pradov
zubr )) Респект)Спасибо)))
еси че напишу)
Aim Destroyer
А как определить цвет серой точки рисунка в оттенках серого так, чтоб она была равна 1..256?
Zuzlan
Цитата(Aim Destroyer @ 18:03:2007, 10:54 ) *
А как определить цвет серой точки рисунка в оттенках серого так, чтоб она была равна 1..256?

Особонностью серого цвета является то, что все 3 цвета(RGB) имеют одинаковые значения...
Т.е. (12,12,12) или (145,145,145). Чем ближе к значению 255, тем светлее.
Для того что бы перевести картинку в ч.б.(с оттенками) я просто брал общее арифметическое RGB.
Если нужно на выходе получить вообще только 2 цвета, то находишь среднее значение RGB на всей картинке и сравниваешь его со всеми точками, если точка оказывается темнее, то присваиваешь ей черный цвет (0,0,0) и наоборот...
Aim Destroyer
Большое спасибо!!! smile.gif
А то я пыталься найти кубический корень каждой точки на картинке и моя прога начинала глючить, ошыбки выдавать.... Видно комп не выдержал.
Zuzlan
Цитата(Aim Destroyer @ 18:03:2007, 11:57 ) *
Большое спасибо!!! smile.gif
А то я пыталься найти кубический корень каждой точки на картинке и моя прога начинала глючить, ошыбки выдавать.... Видно комп не выдержал.

А ошибки могли вылетать потому, что кубический корень на выходе не дает целого числа... нужно было сделать div 1
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2009 IPS, Inc.