고성능 클라이언트 측 이미지 프로세싱

브라우저에서 이미지를 처리하는 것은 이제 표준 요구 사항입니다. 사진 편집기, 에셋 툴킷 또는 접근성 필터를 구축할 수도 있습니다. UI의 반응성을 유지하려면 낮은 지연 시간이 필요합니다.

간단한 작업 중 하나는 색상 반전입니다. 이는 RGB 값을 음수 값으로 뒤집는 것을 의미합니다. 4K 이미지에 표준 방식을 사용하면 하드웨어 병목 현상이 발생합니다.

문제점: 단순 반복

대부분의 개발자는 getImageData() 메서드를 사용합니다. 이 메서드는 Uint8ClampedArray를 반환합니다. 이 배열은 픽셀을 Red, Green, Blue, Alpha (RGBA) 채널로 저장합니다.

표준 루프는 다음과 같습니다:

이 방식은 작은 이미지에서는 잘 작동하지만, 4K 에셋에서는 실패합니다. 4K 이미지는 800만 개 이상의 픽셀을 가지고 있습니다. 표준 루프는 3,300만 번 이상의 개별 쓰기 작업을 수행합니다. 이는 메인 스레드를 차단하여 브라우저의 끊김 현상(stuttering)과 프레임 드롭을 유발합니다.

해결책: 32비트 버퍼 조작

픽셀을 네 개의 별개 채널로 취급하는 것을 중단할 수 있습니다. 대신, 데이터 버퍼 위에 Uint32Array를 덮어씌웁니다.

32비트 뷰를 사용하면 R, G, B, A를 하나의 정수로 그룹화할 수 있습니다. 이제 루프는 3,300만 번 대신 820만 번의 반복만 수행합니다. 픽셀당 4번이 아닌 1번의 연산만 처리하게 됩니다.

비트 연산 XOR를 통한 빠른 색상 반전

Alpha 채널을 건드리지 않고 색상을 반전시키려면 비트 XOR 연산자(^)를 사용하세요. 마스크로 0x00FFFFFF를 사용합니다.

작동 원리:

결과:

Pro Tip: Web Worker 사용하기 고해상도 파일을 많이 처리하는 경우, 32비트 연산조차 UI를 느리게 만들 수 있습니다. 로직을 Web Worker로 옮기세요. 버퍼를 전달할 때는 Transferable Objects를 사용하세요. 이렇게 하면 데이터 복사를 피하고 메인 스레드를 자유롭게 유지할 수 있습니다.

무거운 루프 사용을 중단하세요. 32비트 워드와 비트 플래그를 사용하여 가볍고 빠른 이미지 파이프라인을 구축하세요.

Source: https://dev.to/sharjeel360/high-performance-client-side-image-processing-optimizing-canvas-color-inversion-with-uint32array-1bgg