Rust와 WebAssembly로 이미지 크기 상한선에... 노트

Rust와 WebAssembly로 이미지 크기 상한선에 도달하기

많은 이미지 도구는 품질 슬라이더를 제공하지만, 정부 규제는 종종 특정 파일 크기 제한 이하의 파일을 요구하며, 이는 다른 문제입니다. 품질과 파일 크기 간의 관계는 복잡하며, 다양한 이미지 속성과 인코더 설정에 따라 달라집니다. 이 프로젝트는 출력 파일 크기가 대상 바이트 제한 이하이거나 같다는 불변성을 가진 HEIC 변환기를 만드는 것을 목표로 했습니다. 브라우저 기반 구현은 효율성을 위해 WebAssembly로 컴파일된 Rust를 사용합니다. 핵심 설계 선택은 이미지를 한 번만 디코딩하고, 미리 보기, 회전 및 변환을 위한 불필요하고 비용이 많이 드는 디코딩 작업을 피하기 위해 제한된 이미지 객체를 유지하는 것이었습니다.시스템은 "정확한 크기"를 상한선으로 정의하며, 이는 파일이 대상 크기 이하이거나 같다는 것을 의미하며, 정확히 특정 바이트 수가 아님을 의미합니다. 이는 모든 비교를 위해 대상을 내부적으로 바이트로 변환함으로써 사용자 인터페이스에서 KB 측정의 모호성을 피합니다. JPEG 변환의 경우, 알고리즘은 보호된 범위 내에서 최적의 품질 설정을 찾기 위해 이진 탐색을 사용합니다. 이 탐색은 최소 품질로 먼저 인코딩하고, 너무 크면 크기를 조정하고 다시 검색함으로써 최적화됩니다.초기 JPEG 인코딩이 너무 크면, 시스템은 이미지 영역을 기반으로 새로운 스케일을 추정하고 크기 조정 전에 작은 여백을 적용한 후 고품질 필터를 사용하여 크기를 조정합니다. PNG 변환은 무손실이므로 품질 조절 기능이 없으며, 대신 치수가 조정됩니다. 여기에는 대형 사진에 대한 초기 다운스케일링, 인코딩 및 비교, 그리고 바이트 예산을 더 많이 활용하기 위한 잠재적인 "성장" 단계가 포함됩니다.JPEG 또는 무손실 PNG로의 변환은 다른 바이트 대상으로의 압축과 분리되어 명확한 사용자 의도를 보장합니다. 색상 정보, 특히 ICC 프로파일은 가능한 경우 변환 및 압축 중에 보존됩니다. WebAssembly 계약은 간단하게 설계되었으며, 이미지 바이트와 함께 명시적인 메타데이터를 반환하여 UI 코드를 압축 로직과 분리합니다. 마지막으로, 시스템은 실제 HEIC 파일로 테스트되어 불변성(출력 바이트 <= 대상 바이트), 품질 하한선, 치수 및 기타 메트릭이 충족되는지 확인하여 페이지에서 데이터 유출을 방지합니다.