-
как получть три заветный байта из допусти [10,10] пикселя компонента TImage .
а если подробнее то моя прога должна различать темные и светлые пикселы , а реальзовать я это хочу чтобы она сравнивала / менше 125 значет темный больше. светлый и так какждый байт цвета но проблем получить ргб не из TColor ных цветов .A имено если скопировать допустим в тИмаге фотку.
-
Пройти по F1 TImage свойствам и выйти на ScanLine или Pixels не судьба ?
-
Jeer понимаю что мой вопрос довольно бонален для профессионалов но Pixels выдаёт свет формата tColor если в данном пиксели цвет не соотвествует формату выдаёт ошибку .
Расскажите пожалкйста по подробнее
-
r:=byte(acolor); g:=byte(acolor shr 8); b:=byte(acolor shr 16);
-
спасиб я уже решил проблему GetRValue но возникла маленкая загвоздачка способ загрузки из буфура
Image1.Picture.Assig(clipboard); не пашет не подскажите как норм загружать ???
-
Image1.Picture.LoadFromClipboardFormat()
-
> три заветный байта из допусти [10,10] пикселя компонента > TImage
GetRValue, GetGValue, GetBValue.
-
> [4] terc (15.10.07 19:35) > спасиб я уже решил проблему GetRValue
а [3] быстрее.
-
> а [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;
-
> [8] Dimaxx © (18.10.07 12:03)
Реализация одна и та же, а [3] все равно быстрее. Сам догадаешься почему?
-
Ты имеешь в виду тратиться на вызовы функций и т.п. лабуду? Тогда да, [3] быстрее. Если нет - тада хз... Я как-то особо не задумывался над такими вопросами... :) Есть готовое - почему бы не использовать, а не изобретать велосипед.
-
> [10] Dimaxx © (18.10.07 16:16) > Ты имеешь в виду тратиться на вызовы функций и т.п. лабуду?
Это не лабуда.
> Есть готовое - почему бы не использовать, а не изобретать > велосипед.
Просто бывает, что некоторые пишут то, что ты используешь потом незадумываясь. Я не GetGValue, а о функциях, в которых это может раельно повысить производительность.
-
> функциях, в которых это может раельно повысить производительность
Ну мне кажется, что в данном случае потери производительности не будет, ибо код абсолютно одинаков, да и на вызов функции не особо много тратится тактов. Например, код: 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%.
-
> А вот если GetBValue будет вызываться в цикле 1 млн. раз > - тогда задумаешься, а есть ли смысл в ней? Тут согласен > на 100%.
Тогда какой смысл противоречащему самому себе поста? Сказать, что ты согласен со мной на 100%?
-
> Тогда какой смысл противоречащему самому себе поста?
Смысл, что в контексте вопроса разницы между использованием ф-ций и юзанием их кода без вызова разницы никакой. Но ты сказал:
> о функциях, в которых это может раельно повысить производительность
Вот и приведи примеры ф-ций, в которых можно выиграть на производительности за счет "неиспользования" вышеназванных ф-ций, а юзая напрямую их код. Я просто графикой не занимался глубоко - не приходилось по ходу работы...
-
> Вот и приведи примеры ф-ций, в которых можно выиграть на > производительности за счет "неиспользования" вышеназванных > ф-ций, а юзая напрямую их код
А программированием занимаешся? Должен знать что вызов функции — не самая дешевая операция. 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); 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));
end;
-
Вызов функции отнимает в среднем в 3 раза больше процессорного времени, чем тот же код , что внутри функции но примененный непосредственно. Это очень заметно как раз при обработке графики, когда один и тот же код может выполняться миллионы раз.
|