Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
15-1234336329
Германн
2009-02-11 10:12
2009.04.12
справочник по Си


15-1234169370
Maacheba
2009-02-09 11:49
2009.04.12
Indy писали индусы?


15-1234515144
Юрий Зотов
2009-02-13 11:52
2009.04.12
Черная пятница


15-1234213435
HellowDelphi
2009-02-10 00:03
2009.04.12
Как спроэктировать правельно таблицы?


15-1234441002
begin...end
2009-02-12 15:16
2009.04.12
Непятничная задачка для начинающих :)