Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Ближайший цвет из 256-цветной палитры! Добавлено: 26.02.03 18:54  

Автор вопроса:  Страшный Сон

У меня теперь такая ситуатион сложилась: есть 256-цветная палитра. И есть функция, которая находит ближайший цвет к любому, выраженному в обычном, 24-битном виде.

 

Private Function NearestColor(COLOR&) As Byte
Dim RGBB(1) As RGBS, I As Integer, Amnt(255) As Integer, RI As Byte, Nam As Integer
RGBB(0) = AntiRGB(COLOR)
For I = 0 To 255
    RGBB(1) = AntiRGB(Pale(I))
    Amnt(I) = MG(RGBB(0).cR - RGBB(1).cR) + MG(RGBB(0).cG - RGBB(1).cG) + MG(RGBB(0).cB - RGBB(1).cB)
Next I
Nam = 32767
For I = 0 To 255
    If Amnt(I) <= Nam Then Nam = Amnt(I): RI = I
Next I
NearestColor = RI
End Function

Эта функция возвращает индекс ближайшего цвета. Работает нормально, только уж больно медленно.

Подскажите, можно ли её как-нить ускорить? Убрать циклы?

Ответить

  Ответы Всего ответов: 5  

Номер ответа: 1
Автор ответа:
 Страшный Сон



Вопросов: 46
Ответов: 848
 Профиль | | #1 Добавлено: 01.03.03 13:53
Почему-то в графических редакторах подобная процедура выполняется в сотни раз быстрее.

Ответить

Номер ответа: 2
Автор ответа:
 Воронков Василий



Вопросов: 1
Ответов: 90
 Профиль | | #2 Добавлено: 03.03.03 11:48

Графические редакторы не на бейсике пишутся. Попробуй foreach, а вообще случай по-моему тяжелый.

Ответить

Номер ответа: 3
Автор ответа:
 Страшный Сон



Вопросов: 46
Ответов: 848
 Профиль | | #3 Добавлено: 03.03.03 14:28

А тут без разницы - на Бейсике-не на Бейсике, тут, видимо, в редакторах всякие хитроумные формулы применяют.  

Ответить

Номер ответа: 4
Автор ответа:
 Воронков Василий



Вопросов: 1
Ответов: 90
 Профиль | | #4 Добавлено: 03.03.03 15:27

Разница есть. Подобный алгоритм скомпилированный на бейсике работает в 4-5 раз медленнее, чем скомп. на одном из компиляторов С. А если писать на асме, то во все 10 раз. Чем "ниже" язык, тем быстрее.

Попробуй может использовать массивы. Я уже забыл, как в бейсике пишутся массивы, но тут по идее хватит обычного одномерного. Что-нить вроде

int[] R = new int[255];

for (int i=0; i<256;i++) // Однократно заполняешь массив

{R[i]=i;}

Или перебирай все операторы для создания циклов - может, ускорится. (WHILE/WEND, DO/LOOP...)

Ответить

Номер ответа: 5
Автор ответа:
 Страшный Сон



Вопросов: 46
Ответов: 848
 Профиль | | #5 Добавлено: 03.03.03 21:24

Почти вся медленность Бейсика из-за того, что он при каждой операции отлавливает возможные ошибки, а если в Advanced Optimizations поустанавливать флажки, производительность программы в некоторых случаях увеличивается в 10 раз. Но этого мне не хватает. Ещё можно провести такую проверку: Допустим, 640*480=307200, это количество пикселей в моей картинке. На каждый пиксел приходится куча операций, несколько тысяч. Соответственно, чтобы находить ближайшие цвета в таких картинках по одной штуке в секунду, нужно иметь какую-нибудь многопроцессорную супермашину, так что я думаю, надо что-то придумать пошустрее.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам