Rust로 구현한 이미지 압축 라이브러리 libwce, 성능과 코드 가독성을 동시에!
JPEG, WebP 등 기존 이미지 코덱의 복잡성을 벗어나, 웨이블릿 코덱의 핵심인 엔트로피 레이어(Entropy Layer)를 Rust로 구현
BPC(Bit-Plane Count) 코딩 방식을 사용하여 이미지 데이터를 압축하며, 런타임 성능을 최적화
다양한 압축 모드(Compression Mode)를 제공하여 이미지 품질과 압축률 간의 균형을 조절 가능
코드 가독성(Code Readability)을 높여, 웨이블릿 코덱 연구 및 커스터마이징을 용이하게 함
libwce의 핵심: BPC 코딩(BPC Coding)
libwce는 이미지 압축을 위해 BPC(Bit-Plane Count) 코딩 방식을 사용한다. 이미지 데이터를 웨이블릿 변환(Wavelet Transform)을 거쳐 얻은 계수를 압축하는 데 초점을 맞춘다. 특히, 각 계수를 4개씩 묶어 BPC 값을 계산하고, 이 값을 기반으로 압축을 수행한다. RUNNING, ZERO 예측자(Predictor)를 활용하여 압축 효율을 높이고, 다양한 압축 모드를 제공하여 이미지 품질과 압축률 간의 균형을 조절한다.
성능 벤치마크 및 압축률 분석
저자는 libwce를 사용하여 다양한 품질 설정(preset)에서 이미지 압축 성능을 측정했다. near-lossless, balanced, aggressive, very lossy 등 4가지 프리셋(preset)을 통해 압축률과 PSNR(Peak Signal-to-Noise Ratio) 값을 비교 분석했다. 예를 들어, near-lossless 설정에서는 1.52x 압축률에 49.06dB의 PSNR을, very lossy 설정에서는 10.11x 압축률에 21.62dB의 PSNR을 기록했다. 이는 libwce가 트레이드오프(Trade-offs)를 통해 다양한 압축 요구사항을 충족할 수 있음을 보여준다.
라이브러리 구조 및 설계 특징
libwce는 단일 Rust 파일(Single Rust File)로 구성되어 있으며, 외부 의존성 없이 stdlib만 사용한다. 이는 코드의 가독성(Readability)을 높이고, 라이브러리 사용 및 수정의 편의성을 제공한다. 또한, 라이브러리는 무상태(Stateless)로 설계되어, I/O나 전역 변수를 사용하지 않고, 호출자가 제공하는 버퍼만을 사용한다. 이러한 설계는 libwce를 다른 이미지 처리 파이프라인에 쉽게 통합할 수 있도록 한다.
스트림 손상 테스트 및 복원력
libwce는 압축된 비트스트림의 무결성(Integrity)을 검증하기 위해 다양한 테스트를 수행했다. 256개의 임의 비트 반전(bitflip) 및 바이트 스크램블(byte scramble) 테스트, 300개의 절단 지점(truncation point) 테스트, 그리고 다양한 Adversarial Case를 통해 libwce의 복원력을 확인했다. 모든 테스트에서 libwce는 문제없이 디코딩을 완료하여, 데이터 손실(Data Loss)에 대한 강인함을 입증했다.