Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Получить RGB из пикселя TImage (который не TColor)??? [D7, WinXP]


terc ©   (2007-10-15 17:10:00) 

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

а если подробнее то моя прога должна различать темные и светлые пикселы  , а реальзовать я это хочу чтобы она сравнивала /  менше 125 значет темный больше. светлый и так какждый байт цвета  но проблем получить ргб не из TColor ных цветов .A имено если скопировать допустим в тИмаге фотку.


DVM   (2007-10-21 11:11:00) [1]

Вызов функции отнимает в среднем в 3 раза больше процессорного времени, чем тот же код , что внутри функции но примененный непосредственно. Это очень заметно как раз при обработке графики, когда один и тот же код может выполняться миллионы раз.


homm   (2007-10-21 09:08:00) [2]

> Вот и приведи примеры ф-ций, в которых можно выиграть на
> производительности за счет "неиспользования" вышеназванных
> ф-ций, а юзая напрямую их код

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

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;


Dimaxx   (2007-10-21 00:57:00) [3]


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

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


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


Вот и приведи примеры ф-ций, в которых можно выиграть на производительности за счет "неиспользования" вышеназванных ф-ций, а юзая напрямую их код. Я просто графикой не занимался глубоко - не приходилось по ходу работы...


homm   (2007-10-20 15:11:00) [4]

> А вот если GetBValue будет вызываться в цикле 1 млн. раз
> - тогда задумаешься, а есть ли смысл в ней? Тут согласен
> на 100%.

Тогда какой смысл противоречащему самому себе поста? Сказать, что ты согласен со мной на 100%?


Dimaxx   (2007-10-20 15:08:00) [5]


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

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

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

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   (2007-10-18 16:33:00) [6]

> [10] Dimaxx ©   (18.10.07 16:16)
> Ты имеешь в виду тратиться на вызовы функций и т.п. лабуду?

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


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

Просто бывает, что некоторые пишут то, что ты используешь потом незадумываясь. Я не GetGValue, а о функциях, в которых это может раельно повысить производительность.


Dimaxx   (2007-10-18 16:16:00) [7]

Ты имеешь в виду тратиться на вызовы функций и т.п. лабуду? Тогда да, [3] быстрее. Если нет - тада хз... Я как-то особо не задумывался над такими вопросами... :) Есть готовое - почему бы не использовать, а не изобретать велосипед.


homm   (2007-10-18 12:13:00) [8]

> [8] Dimaxx ©   (18.10.07 12:03)

Реализация одна и та же, а [3] все равно быстрее. Сам догадаешься почему?


Dimaxx   (2007-10-18 12:03:00) [9]


> а [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   (2007-10-16 10:23:00) [10]

> [4] terc   (15.10.07 19:35)
> спасиб я уже решил проблему GetRValue

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


Dimaxx   (2007-10-15 22:26:00) [11]


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

GetRValue, GetGValue, GetBValue.


Pong   (2007-10-15 21:11:00) [12]

Image1.Picture.LoadFromClipboardFormat()


terc   (2007-10-15 19:35:00) [13]

спасиб я уже решил проблему GetRValue
но возникла маленкая загвоздачка  способ загрузки из буфура

Image1.Picture.Assig(clipboard);      не пашет не подскажите как норм загружать ???


antonn   (2007-10-15 19:19:00) [14]

r:=byte(acolor);
g:=byte(acolor shr 8);
b:=byte(acolor shr 16);


terc   (2007-10-15 18:07:00) [15]

Jeer  понимаю что мой вопрос довольно бонален для профессионалов но Pixels  выдаёт свет формата tColor если в данном пиксели цвет не соотвествует формату выдаёт ошибку  .  

Расскажите пожалкйста по подробнее


Jeer   (2007-10-15 17:58:00) [16]

Пройти по F1 TImage свойствам и выйти на ScanLine или Pixels не судьба ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо