Цвет точки

Тема в разделе "Delphi - Multimedia, Графика, Игры", создана пользователем SOV, 30 сен 2006.

Статус темы:
Закрыта.
  1. SOV

    SOV Гость

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

    SOV Гость

    Подскажите пожалуйста еще с одним похожим нюансом.
    Как узнать цвет (в целочисленном формате) определенного пикселя графического файла (bmp и jpg).
    Помогите исходником.
     
  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); :)
     
  4. SOV

    SOV Гость

    Большое спасибо вам :)
     
  5. Гость

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

    sab0tage Гость

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

    Код (Text):
     
    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;
     
  7. Zuzlan

    Zuzlan Гость

    Поскольку цвет определяется тремя цветами (RGB), то было бы удобнее воспользоваться следующим:
    Код (Text):
    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
    Удобнее всего для этого - воспользоваться процедурой:

    Код (Text):
    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;

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

    Сам же я интересуюсь сравниванием изображений... Причем попиксельно не очень бы холтелось, потому как это отнимает много времени... Есть идеи?
     
  8. SOV

    SOV Гость

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

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

    Pradov Гость

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

    Zuzlan Гость

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

    zubr Гость

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

    Pradov Гость

    zubr )) Респект)Спасибо)))
    еси че напишу)
     
  13. Aim Destroyer

    Aim Destroyer Гость

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

    Zuzlan Гость

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

    Aim Destroyer Гость

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

    Zuzlan Гость

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

Поделиться этой страницей