프로젝트 중 큰 용량의 JPEG 파일을 다룰 필요가 있어, 64-bit를 지원하는 JPEG 라이브러리를 조사한 내용 공유합니다.
고객사에서는 카메라에서 제공하는 이미지의 해상도가 높아짐(16384 x 29300)에 따라 64-bit 애플리케이션으로 마이그레이션을 계획했고, 성공적으로 완료했습니다.
JPEG 라이브러리
그 과정 중 검토한 JPEG 라이브러리는 다음과 같습니다.
- TJPEGImage(VCL 내장 JPEG 라이브러리)
- libJPEG-Turbo
- Intel IJL / IPP(IJL 64-bit 미지원, IPP 상용)
고객사의 기존 프로젝트에서는 IJL을 이용해 JPEG을 다뤘지만, IJL은 개발이 중단되었고 64-bit를 지원하지 않아 검토 대상에서 제외되었습니다.(IPP로 통합되어 상용으로 판매 중)
TJPEGImage
TJPEGImage는 VCL에 내장된 라이브러리로 32-bit, 64-bit를 모두 지원합니다.
별도의 라이브러리 파일(*.dll 등)을 배포할 필요가 없고, 클래스 단위로 제공되고 매우 익숙합니다.
(단, 성능이 좋지 않다는 평가를 검색을 통해 확인하였습니다. 내부적으로 libJPEG으로 구현된 것으로 알고 있습니다.)
libJPEG-Turbo
libJPEG-Turbo는 SIMD 명령어를 사용해 JPEG 압축과 해제를 가속화 하는 JPEG 이미지 코덱입니다.
공식 웹사이트에서는 libJPEG 보다 2~6배 이상 빠르다고 합니다.
(크롬, 리눅스, 안드로이드 등에서 libJPEG 대신 libJPEG-Turbo를 사용)
델파이 연동은 아래 오픈소스들을 참고했습니다.
- https://code.google.com/archive/p/delphi-libjpeg-turbo/
- http://www.dev-center.de/header/libjpeg?cat=header&file=libjpeg
JPEG 라이브러리 성능 테스트
테스트 대상은 JPEG 파일 크기별 3종으로 진행했습니다.
- 작은 사이즈(1600x1200)
- 큰 사이즈(16384x12200)
- 매우 큰 사이즈(16384x29300)
32-bit와 64-bit 애플리케이션으로 진행했습니다.(32-bit 애플리케이션에서 매우 큰 사이즈는 메모리 부족으로 진행할 수 없었습니다.)
기존 라이브러리와 비교하기 위해 32-bit에서 IJL도 진행했습니다.
테스트 코드는 JPEG 파일을 TBitmap으로 불러오거나 반대로 저장하도록 작성했습니다.(고객사에서 픽셀단위로 이미지 프로세싱 진행)
참고로,
TJPEGImage의 Performace 속성을 jpBestSpeed로 설정했습니다. jpBestQuality로 설정 시 3~4배의 성능 차이가 발생합니다.)
JPEG 품질은 모두 75로 설정 했습니다.
테스트 환경
- 개발도구 : 델파이 10.3.1
- OS : 윈도우 10 64bit(MacOS의 VM위에서 운용)
- 메모리 : 8GB
테스트 결과
JPEG 불러오기(Load)
Load 과정에서는 예상외로, TJPEGImage의 성능이 좋다는 결과를 확인했습니다.
32-bit 큰 이미지의 경우 libJPEG-Turbo 대비 40%(2028 : 1137) 성능향상을 확인 했습니다.
IJL과 libJPEG-Turbo은 약 10%의 성능차이를 확인할 수 있습니다.
64-bit 환경에서도 TJPEGImage가 libJPET-Turbo 대비 큰 이미지의 경우 30%, 매우 큰 이미지의 경우 약 17% 가량 성능이 좋은 것으로 확인했습니다.
JPEG 저장(Save)
저장하는 과정은 libJPEG-Turbo가 TJPEGImage 보다 속도가 빨랐습니다.
특히 32-bit의 큰 이미지의 경우, 유독 TJPEGImage의 성능이 매우 좋지 않은 결과가 나왔습니다.(libJPEG-Turbo 대비 약 5배의 시간 소요)
TJPEGImage의 내부 로직을 살펴본 결과 이미지의 행(Row)의 메모리를 한번에 복사하는 과정에서 시간을 많이 소요했습니다.(해결방법은 찾지 못했습니다.)
64-bit에서 저장은 libJPEG-Turbo가 TJPEGImage 대비 20~30% 속도가 빨랐습니다.
총평
JPEG 불러오기에서는 TJPEGImage가 JPEG 저장에서는 libJPEG-Turbo가 앞선 성능을 확인할 수 있었습니다.
문제는 32-bit 큰 이미지 저장 시 TJPEGImage가 매우 좋지 않은 성능을 보여, 최종 선택은 libJPEG-Turbo로 진행했습니다.
해당 이슈만 없다면, TJPEGImage도 좋은 선택일 것 같습니다.
만약, JPEG을 빠르게 다룰 필요가 있다면, 위 테스트 내용과 첨부된 테스트 코드를 이용해 여러분 환경에 맞도록 테스트 진행 후 선정해 보시기 바랍니다.
테스트 코드