Конференция "Media" » Получить RGB из пикселя TImage (который не TColor)??? [D7, WinXP]
 
  • terc (15.10.07 17:10) [0]
    как получть три заветный байта из допусти [10,10] пикселя компонента  TImage  .

    а если подробнее то моя прога должна различать темные и светлые пикселы  , а реальзовать я это хочу чтобы она сравнивала /  менше 125 значет темный больше. светлый и так какждый байт цвета  но проблем получить ргб не из TColor ных цветов .A имено если скопировать допустим в тИмаге фотку.
  • Jeer © (15.10.07 17:58) [1]
    Пройти по F1 TImage свойствам и выйти на ScanLine или Pixels не судьба ?
  • terc (15.10.07 18:07) [2]
    Jeer  понимаю что мой вопрос довольно бонален для профессионалов но Pixels  выдаёт свет формата tColor если в данном пиксели цвет не соотвествует формату выдаёт ошибку  .  

    Расскажите пожалкйста по подробнее
  • antonn © (15.10.07 19:19) [3]
    r:=byte(acolor);
    g:=byte(acolor shr 8);
    b:=byte(acolor shr 16);
  • terc (15.10.07 19:35) [4]
    спасиб я уже решил проблему GetRValue
    но возникла маленкая загвоздачка  способ загрузки из буфура

    Image1.Picture.Assig(clipboard);      не пашет не подскажите как норм загружать ???
  • Pong (15.10.07 21:11) [5]
    Image1.Picture.LoadFromClipboardFormat()
  • Dimaxx © (15.10.07 22:26) [6]

    > три заветный байта из допусти [10,10] пикселя компонента
    >  TImage

    GetRValue, GetGValue, GetBValue.
  • homm © (16.10.07 10:23) [7]
    > [4] terc   (15.10.07 19:35)
    > спасиб я уже решил проблему GetRValue

    а [3] быстрее.
  • Dimaxx © (18.10.07 12:03) [8]

    > а [3] быстрее.

    Реализация одна и та же.

    function GetRValue(rgb: DWORD): Byte;
    begin
     Result := Byte(rgb);
    end;

    function GetGValue(rgb: DWORD): Byte;
    begin
     Result := Byte(rgb shr 8);
    end;

    function GetBValue(rgb: DWORD): Byte;
    begin
     Result := Byte(rgb shr 16);
    end;

  • homm © (18.10.07 12:13) [9]
    > [8] Dimaxx ©   (18.10.07 12:03)

    Реализация одна и та же, а [3] все равно быстрее. Сам догадаешься почему?
  • Dimaxx © (18.10.07 16:16) [10]
    Ты имеешь в виду тратиться на вызовы функций и т.п. лабуду? Тогда да, [3] быстрее. Если нет - тада хз... Я как-то особо не задумывался над такими вопросами... :) Есть готовое - почему бы не использовать, а не изобретать велосипед.
  • homm © (18.10.07 16:33) [11]
    > [10] Dimaxx ©   (18.10.07 16:16)
    > Ты имеешь в виду тратиться на вызовы функций и т.п. лабуду?

    Это не лабуда.


    > Есть готовое - почему бы не использовать, а не изобретать
    > велосипед.

    Просто бывает, что некоторые пишут то, что ты используешь потом незадумываясь. Я не GetGValue, а о функциях, в которых это может раельно повысить производительность.
  • Dimaxx © (20.10.07 15:08) [12]

    > функциях, в которых это может раельно повысить производительность

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

    Например, код:

    var
     B1,B2: byte;
     C: TColor;

    begin
    (1)  C:=$00FFAABB;
    (2)  B1:=GetBValue(C);
    (3)  B2:=Byte(C shr 16);



    на ассемблере выглядит так:

    1) mov esi,$00FFAABB
    2) mov eax,esi
       call GetBValue
       mov eax,ebx
    3) mov eax,esi
       shr eax,$10
       mov [$004054D4],al



    Содержимое ф-ции GetBValue содержит единственную команду shr eax,$10. Значит, во первом случае тратится время на call и ret. Имхо, при нынешней производительности процов данной погрешностью можно пренебречь. Это в данном случае. А вот если GetBValue будет вызываться в цикле 1 млн. раз - тогда задумаешься, а есть ли смысл в ней? Тут согласен на 100%.
  • homm © (20.10.07 15:11) [13]
    > А вот если GetBValue будет вызываться в цикле 1 млн. раз
    > - тогда задумаешься, а есть ли смысл в ней? Тут согласен
    > на 100%.

    Тогда какой смысл противоречащему самому себе поста? Сказать, что ты согласен со мной на 100%?
  • Dimaxx © (21.10.07 00:57) [14]

    > Тогда какой смысл противоречащему самому себе поста?

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


    > о функциях, в которых это может раельно повысить производительность


    Вот и приведи примеры ф-ций, в которых можно выиграть на производительности за счет "неиспользования" вышеназванных ф-ций, а юзая напрямую их код. Я просто графикой не занимался глубоко - не приходилось по ходу работы...
  • homm © (21.10.07 09:08) [15]
    > Вот и приведи примеры ф-ций, в которых можно выиграть на
    > производительности за счет "неиспользования" вышеназванных
    > ф-ций, а юзая напрямую их код

    А программированием занимаешся? Должен знать что вызов функции — не самая дешевая операция.

    procedure SwapChanels(BMP: TBitmap);
    type
     ADWORD = array [0..0] of DWORD;
    var
     i, j: Integer;
     Pix: DWORD;
     Line: ^ADWORD;
    begin
     for i := 0 to BMP.Height-1 do begin
       Line := BMP.ScanLine[i];
       for j := 0 to BMP.Width-1 do begin
         Pix := Line[j];
         Line[j] := GetBValue(Pix) + (GetGValue(Pix) shl 8) + (GetRValue(Pix) shl 16);    // 1200 mSec
         //Line[j] := byte(Pix shr 16) + (byte(Pix shr 8) shl 8) + (byte(Pix) shl 16);    // 300 mSec
       end;
     end;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    type
     ADWORD = array [0..0] of DWORD;
    var
     i, T: Integer;
    begin
     Image1.Picture.Bitmap := TBitmap.Create;
     Image1.Picture.Bitmap.LoadFromFile('C:\1.bmp');
     Image1.Picture.Bitmap.PixelFormat := pf32bit;

     T := GetTickCount;
     for i := 0 to 99 do
       SwapChanels(Image1.Picture.Bitmap);
     ShowMessage(IntToStr(GetTickCount-T));

     //BMP.Free;
    end;

  • DVM © (21.10.07 11:11) [16]
    Вызов функции отнимает в среднем в 3 раза больше процессорного времени, чем тот же код , что внутри функции но примененный непосредственно. Это очень заметно как раз при обработке графики, когда один и тот же код может выполняться миллионы раз.
 
Конференция "Media" » Получить RGB из пикселя TImage (который не TColor)??? [D7, WinXP]
Есть новые Нет новых   [134431   +10][b:0][p:0.002]