![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Получить 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 не судьба ?