Текущий архив: 2009.04.12;
Скачать: CL | DM;
Вниз
Получить RGB из пикселя TImage (который не TColor)??? Найти похожие ветки
← →
terc (2007-10-15 17:10) [0]как получть три заветный байта из допусти [10,10] пикселя компонента TImage .
а если подробнее то моя прога должна различать темные и светлые пикселы , а реальзовать я это хочу чтобы она сравнивала / менше 125 значет темный больше. светлый и так какждый байт цвета но проблем получить ргб не из TColor ных цветов .A имено если скопировать допустим в тИмаге фотку.
← →
Jeer © (2007-10-15 17:58) [1]Пройти по F1 TImage свойствам и выйти на ScanLine или Pixels не судьба ?
← →
terc (2007-10-15 18:07) [2]Jeer понимаю что мой вопрос довольно бонален для профессионалов но Pixels выдаёт свет формата tColor если в данном пиксели цвет не соотвествует формату выдаёт ошибку .
Расскажите пожалкйста по подробнее
← →
antonn © (2007-10-15 19:19) [3]r:=byte(acolor);
g:=byte(acolor shr 8);
b:=byte(acolor shr 16);
← →
terc (2007-10-15 19:35) [4]спасиб я уже решил проблему GetRValue
но возникла маленкая загвоздачка способ загрузки из буфура
Image1.Picture.Assig(clipboard); не пашет не подскажите как норм загружать ???
← →
Pong (2007-10-15 21:11) [5]Image1.Picture.LoadFromClipboardFormat()
← →
Dimaxx © (2007-10-15 22:26) [6]
> три заветный байта из допусти [10,10] пикселя компонента
> TImage
GetRValue, GetGValue, GetBValue.
← →
homm © (2007-10-16 10:23) [7]> [4] terc (15.10.07 19:35)
> спасиб я уже решил проблему GetRValue
а [3] быстрее.
← →
Dimaxx © (2007-10-18 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 © (2007-10-18 12:13) [9]> [8] Dimaxx © (18.10.07 12:03)
Реализация одна и та же, а [3] все равно быстрее. Сам догадаешься почему?
← →
Dimaxx © (2007-10-18 16:16) [10]Ты имеешь в виду тратиться на вызовы функций и т.п. лабуду? Тогда да, [3] быстрее. Если нет - тада хз... Я как-то особо не задумывался над такими вопросами... :) Есть готовое - почему бы не использовать, а не изобретать велосипед.
← →
homm © (2007-10-18 16:33) [11]> [10] Dimaxx © (18.10.07 16:16)
> Ты имеешь в виду тратиться на вызовы функций и т.п. лабуду?
Это не лабуда.
> Есть готовое - почему бы не использовать, а не изобретать
> велосипед.
Просто бывает, что некоторые пишут то, что ты используешь потом незадумываясь. Я не GetGValue, а о функциях, в которых это может раельно повысить производительность.
← →
Dimaxx © (2007-10-20 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 © (2007-10-20 15:11) [13]> А вот если GetBValue будет вызываться в цикле 1 млн. раз
> - тогда задумаешься, а есть ли смысл в ней? Тут согласен
> на 100%.
Тогда какой смысл противоречащему самому себе поста? Сказать, что ты согласен со мной на 100%?
← →
Dimaxx © (2007-10-21 00:57) [14]
> Тогда какой смысл противоречащему самому себе поста?
Смысл, что в контексте вопроса разницы между использованием ф-ций и юзанием их кода без вызова разницы никакой. Но ты сказал:
> о функциях, в которых это может раельно повысить производительность
Вот и приведи примеры ф-ций, в которых можно выиграть на производительности за счет "неиспользования" вышеназванных ф-ций, а юзая напрямую их код. Я просто графикой не занимался глубоко - не приходилось по ходу работы...
← →
homm © (2007-10-21 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 © (2007-10-21 11:11) [16]Вызов функции отнимает в среднем в 3 раза больше процессорного времени, чем тот же код , что внутри функции но примененный непосредственно. Это очень заметно как раз при обработке графики, когда один и тот же код может выполняться миллионы раз.
Страницы: 1 вся ветка
Текущий архив: 2009.04.12;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.011 c