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

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

Оптимизация кода


Страницы:   1 2 3 4 5 6 7 8 9 10 11

Вова ©   (2013-06-25 20:17:00) 

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


function almostEqual(a, b: byte): Boolean;
begin
 if ABS(a - b) < 10 then
   result := true
 else
   result := false;
end;

Function ConvertColorToRGBColorMap(color: LongInt; ColSel: String = 'None')
 : TColorWithName;
var
 RGBV: trgbcolor;
begin

 RGBV.red := color;
 RGBV.green := color shr 8;
 RGBV.blue := color shr 16;

 with RGBV do

   if almostEqual(red, green) and almostEqual(red, blue) and
     almostEqual(blue, green) then // тогда это серый или черный или белый
   begin
     if almostEqual(red, 255) then // белый
     begin
       result.color := RGB(255, 255, 255);
       result.Name := 'White';
     end
     else if red > 120 then
     begin
       result.color := RGB(190, 190, 190);
       result.Name := 'LightGray';
     end
     else if (red > 92) then // темно серый
     begin
       result.color := RGB(100, 100, 100);
       result.Name := 'DarkGray';
     end
     else
     begin
       result.color := RGB(0, 0, 0);
       result.Name := 'Black';
     end // черный
   end
   else
   begin
     if (red < green) and (red < blue) and almostEqual(green, blue) and
       (blue > 130) then
     begin
       result.color := RGB(0, 0, 255);
       result.Name := 'Blue';
     end // result:= rgb(0,255,255)//голубой
     else if (green < red) and (green < blue) and almostEqual(red, blue) and
       (red > 130) then
     begin
       result.color := RGB(255, 0, 255);
       result.Name := 'Pink';
     end // розовый
     else if (blue < green) and (blue < red) and almostEqual(green, red) and
       (green > 130) then
     begin
       result.color := RGB(255, 255, 0);
       result.Name := 'Yellow';
     end // желтый
     else if (red > green) and (red > blue) and (red > 130) then
     begin
       result.color := RGB(255, 0, 0);
       result.Name := 'Red';
     end // красный
     else if (blue > green) and (blue > red) and (blue > 130) then
     begin
       result.color := RGB(0, 0, 255);
       result.Name := 'Blue';
     end // синий
     else if (green > blue) and (green > red) and (green > 130) then
     begin
       result.color := RGB(0, 255, 0);
       result.Name := 'Green';
     end // зеленый
     else
     begin
       result.color := RGB(0, 0, 0);
       result.Name := 'Black';
     end
   end;

   if not (ColSel = 'None') then
     if not (ColSel = Result.Name) then
     begin
       result.color := RGB(255, 255, 255);
       result.Name := 'White'; //Если выборка только по одному цвету, то
       //все остальные цвета переводим в белый
     end
     else
     begin
       result.color := RGB(0, 0, 0);
       result.Name := 'Black'; //Если выборка только по одному цвету, то
       //этот цвет переводим в черный
     end

end;


Вова   (2013-07-01 18:25:00) [101]

вернее не перевернутые )


Вова   (2013-07-01 18:24:00) [102]

ну вот я и говорю, что нужно переделывать, чтоб шаблоны были перевернутые.


Sha   (2013-07-01 18:21:00) [103]

Шаблоы переворачивать один раз, картинку - постоянно.
Что выгоднее?
уууууу


Вова   (2013-07-01 18:19:00) [104]

ну когда я первый раз попробовал мне это дало лишних 10 миллисекунд, хотя там цикл был другой.

Переворачивать потому что у меня шаблоны то перевернутые, так что либо шаблоны переделывать, либо это переворачивать под шаблоны..


Sha   (2013-07-01 18:18:00) [105]

> купикселей, она встает по человечески по умолчанию

выпал в осадок


Sha   (2013-07-01 18:17:00) [106]

> и потом это все же перевернутая картинка )
> после переворачивания будет те же 10 мс

во-первых, нафига переворачивать?

во-вторых, ты вроде прогаммист, а программист может
перевернуть картинку в процессе обработки в том же цикле.


Sha   (2013-07-01 18:15:00) [107]

> но я как понял, 32 проще ) да и на 1 миллисекунду быстрее ))

быстрее будет раза 2,
причем развернутый цикл легко переделать из моей процедуры


Вова   (2013-07-01 18:13:00) [108]

и потом это все же перевернутая картинка ) после переворачивания будет те же 10 мс ) т.е. чтобы извлечь профит надо с такой же как в памяти работать.

правда у купикселей, она встает по человечески по умолчанию, так что не проверить ( кроме того купиксели работают с одинаковой скоростью и с 24 битами и с 32 (

ну я отягощен мыслью что все нужно переделывать )))


Sha   (2013-07-01 18:12:00) [109]

1. правильные цвета будут только после однократного конвертирования,
конвертирование отконвертированного все ломает.

2. эта битовая математика - сущий ад, может что и не доглядел - найди и исправь )


Вова   (2013-07-01 18:10:00) [110]

ну по скорости да, но я как понял, 32 проще ) да и на 1 миллисекунду быстрее ))


Вова   (2013-07-01 18:08:00) [111]

вместо желтого красный, появился голубой...


Sha   (2013-07-01 18:07:00) [112]

И че, ему все равно что колбасить, скорость процесса постоянна )

Ну, так все-таки разы? ))


Вова   (2013-07-01 18:05:00) [113]

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


Вова   (2013-07-01 18:01:00) [114]

хм.....да уж))


Sha   (2013-07-01 18:00:00) [115]

ShaConvert(p, tbmp2.Height, tbmp2.Width);


Вова   (2013-07-01 17:59:00) [116]


T := GetTickCount;

p:= tbmp2.ScanLine[tbmp2.Height-1];

for I := 0 to 1000 do
   ShaConvert(p, tbmp2.Height, tbmp2.Height*tbmp2.Width);
T := GetTickCount-T;


Вова   (2013-07-01 17:54:00) [117]

First chance exception at $006389F5. Exception class $C0000005 with message 'access violation at 0x006389f5: read of address 0x0444f000'. Process SDIAPP.exe (66676)


Sha   (2013-07-01 17:54:00) [118]

а высоту в строках, ширину в точках передал?


Sha   (2013-07-01 17:51:00) [119]

Ошибка-то какая?


Вова   (2013-07-01 17:50:00) [120]

оно компилицо, оно при выполнении вылетает с access violation


Страницы:   1 2 3 4 5 6 7 8 9 10 11

Наверх

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