Ну со взятием цвета пикселей понятно...
Что у тебя входит в предобработку?
Как реализовано сейчас?
У меня есть несколько теоретических идей по этому поводу, могу подeлиться:
*Предобработка*
Обрабатываем необходимые картинки 1 раз, при запуске некого ресурса, в директории которого файлы с картинками.
В предобработку входит составление карты цветов пикселей в шестнадцатеричном виде с последующим сохранение в файлы ( синхронизированные с картинками ) или бд, в виде сериализованного массива.
При последующих запусках проверяем наличие карт пикселей для определенных картинок, если нет, то возвращаемся на шаг назад, если есть, то грузим в память эти карты ( loadstring ).
Далее, мы должны составить однонаправленный граф зависимостей для картинок. С помощью него будем определять, что и из чего вырезать.
Далее проходимся по картам пикселей, которые теперь представлены в виде обычных многомерных массивов, вырезаем необходимые цвета, пишем новую карту ( в заранее созданный массив ).
Новая карта готова, на основе ее рисуем новую картинку ( dxSetPixelColor ), которую сохраняем в память и на диск.
Теперь мы можем при проходе по графу зависимостей или просто при запуске ресурса, мы можем проверять наличие готовых обработанных картинок на диске и загонять их в память.
*Использование*
Далее, после всех обработок, картинки должны быть сохранены в памяти клиента ( в течении сессии ) и на диске ( всегда ).
Для отрисовки просто забираем текстуру из памяти и работаем уже с готовой текстурой.
*Профиты*
Обработка только при 1 заходе на сервер ( при последующих, уже все сохранено ).
Подвисание на момент обработки можно замылить использую псевдо-потоки ( читай lua coroutine ).
Как уже говорил, это теория...