TIFF에 포함된 lossless JPEG을 읽어서 변환할 수 있겠냐는 질문을 받았다.
모 장비에서 생성하는 엑스레이 파일이 그 포맷인 것 같았다.
이미 소스가 공개된 JPEG 바닥에 불가능한 건 없겠지만, 찾아보니 뭔가 이상한 점이 있었다.
lossless JPEG? 이거 적용한 파일을 내가 본 적이나 있었나? Arithmetic coded JPEG보다도 더 희귀한 존재 아니었나?
공부할 때나 들었던 전설 속의 존재 아니었나?
다행히 구글링을 통해 누군가가 이미 libjpeg 6b를 기준으로 lossless-jpeg를 지원하는 패치를 만들었다는 것을 확인했다.
아이고 감사하여라…
첫번째 단계는 TIFF에서 JPEG를 추출하는 것.
TIFF 태그 중에 참고할 부분은 0x0103(Compress)와 0x0111(Strip offset) 뿐이다.
Compress가 6 또는 7일 때가 JPEG이다. 참고로, 내가 받은 파일들은 이 값이 항상 7이었음.
두번째 단계는 libjpeg의 수정.
추출된 jpeg 파일을 패치가 적용된 libjpeg로 읽어보려니 컴파일이 잘 되지 않는다.
파일은 패치가 됐는데, 프로젝트 파일은 수정이 제대로 돼있지 않다.
이건 열심히 수작업으로 수정.
이렇게 수정하자 아래처럼 파일을 읽을 수 있었다.
세번째 단계는 16bpp 이미지에 대한 처리 보강.
내가 받은 파일들 중에는 8bpp 이미지 외에 16bpp 이미지도 있다.
libjpeg는 12bpp/16bpp 소스를 읽을 땐 알아서 8bpp로 downscale 해준다.
문제는 이 소스가 엉터리여서 0~65535의 범위 중에 0~4095 만을 사용한다는 것.
즉, 8bpp로 downscale 하면 0~15 만 사용하는 엉터리 파일이라 downscale 하기 전에 별도의 처리를 하거나 raw data를 읽어야 한다.
이런 부분을 적절히 처리하도록 수정해서 읽은 결과는 아래와 같다.