TIFF에 포함된 lossless JPEG을 읽어서 변환할 수 있겠냐는 질문을 받았다.

모 장비에서 생성하는 엑스레이 파일이 그 포맷인 것 같았다.


이미 소스가 공개된 JPEG 바닥에 불가능한 건 없겠지만, 찾아보니 뭔가 이상한 점이 있었다.

lossless JPEG? 이거 적용한 파일을 내가 본 적이나 있었나? Arithmetic coded JPEG보다도 더 희귀한 존재 아니었나?

공부할 때나 들었던 전설 속의 존재 아니었나?


다행히 구글링을 통해 누군가가 이미 libjpeg 6b를 기준으로 lossless-jpeg를 지원하는 패치를 만들었다는 것을 확인했다.

아이고 감사하여라…




첫번째 단계는 TIFF에서 JPEG를 추출하는 것.

TIFF 태그 중에 참고할 부분은 0x0103(Compress)0x0111(Strip offset) 뿐이다.

Compress6 또는 7일 때가 JPEG[각주:1]이다. 참고로, 내가 받은 파일들은 이 값이 항상 7이었음.


두번째 단계는 libjpeg의 수정.

추출된 jpeg 파일을 패치가 적용된 libjpeg로 읽어보려니 컴파일이 잘 되지 않는다.

파일은 패치가 됐는데, 프로젝트 파일은 수정이 제대로 돼있지 않다.

이건 열심히 수작업으로 수정.


이렇게 수정하자 아래처럼 파일을 읽을 수 있었다.



세번째 단계는 16bpp 이미지에 대한 처리 보강.

내가 받은 파일들 중에는 8bpp 이미지 외에 16bpp 이미지[각주:2]도 있다.


libjpeg는 12bpp/16bpp 소스를 읽을 땐 알아서 8bpp로 downscale 해준다.

문제는 이 소스가 엉터리여서 0~65535의 범위 중에 0~4095 만을 사용한다는 것.

즉, 8bpp로 downscale 하면 0~15 만 사용하는 엉터리 파일이라 downscale 하기 전에 별도의 처리를 하거나 raw data를 읽어야 한다.


이런 부분을 적절히 처리하도록 수정해서 읽은 결과는 아래와 같다.




  1. 6은 old-style JPEG, 7은 new-style JPEG [본문으로]
  2. 16bpp는 오로지 uncompress JPEG에서만 존재 [본문으로]
신고
  1. 2017.02.13 21:49

    비밀댓글입니다

+ Recent posts