![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Оптимизация кода
Вова © (2013-06-25 20:17:00)
Страницы: < 1 2 3 4 5 6 7 8 9 10 11 >
Есть процедура задачей которой является приведения пикселя любого цвета к цвету одного из диапазонов. Но скорость ее работы огорчает меня, можно ли ее как нибудь ускорить?
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