Высокопроизводительная обработка изображений на стороне клиента

Обработка изображений в браузере стала стандартным требованием. Вы можете создавать фоторедакторы, наборы инструментов для ресурсов или фильтры доступности. Чтобы интерфейс оставался отзывчивым, вам необходима низкая задержка.

Простая задача — инверсия цвета. Это означает замену значений RGB на их противоположные. Если использовать стандартный подход для 4K-изображений, вы столкнетесь с аппаратными ограничениями.

Проблема: наивная итерация

Большинство разработчиков используют метод getImageData(). Он возвращает Uint8ClampedArray. Этот массив хранит пиксели в виде каналов Red, Green, Blue и Alpha (RGBA).

Стандартный цикл выглядит так:

Это работает для небольших изображений, но не подходит для 4K-ресурсов. 4K-изображение содержит более 8 миллионов пикселей. Стандартный цикл выполняет более 33 миллионов отдельных операций записи. Это блокирует основной поток, вызывая подергивания браузера и пропуск кадров.

Решение: манипуляция 32-битными буферами

Вы можете перестать рассматривать пиксели как четыре отдельных канала. Вместо этого наложите Uint32Array поверх буфера данных.

Используя 32-битное представление, вы группируете R, G, B и A в одно целое число. Теперь ваш цикл выполняет всего 8,2 миллиона итераций вместо 33 миллионов. Вы обрабатываете одну операцию на пиксель вместо четырех.

Быстрая инверсия цвета через побитовый XOR

Чтобы инвертировать цвета, не затрагивая Alpha-канал, используйте оператор побитового XOR (^). Используйте маску 0x00FFFFFF.

Как это работает:

Результаты:

Совет профи: используйте Web Workers

Если вы обрабатываете много файлов высокого разрешения, даже 32-битные операции могут замедлить интерфейс. Перенесите логику в Web Worker. Используйте Transferable Objects для передачи буфера. Это позволит избежать копирования данных и освободит основной поток.

Перестаньте использовать тяжелые циклы. Используйте 32-битные слова и побитовые флаги для создания легких и быстрых конвейеров обработки изображений.

Источник: https://dev.to/sharjeel360/high-performance-client-side-image-processing-optimizing-canvas-color-inversion-with-uint32array-1bgg