JP2KAK – 카카두 기반 JPEG2000 드라이버
드라이버 단축 이름
JP2KAK
빌드 의존성
카카두(Kakadu) 라이브러리
GDAL은 카카두 라이브러리 기반 드라이버를 이용해서 JPEG2000 JP2 및 JPC 압축 이미지(ISO/IEC 15444-1) 형식 대부분을 읽어올 수 있고, 새 이미지를 작성할 수도 있습니다. 기존 이미지의 제자리(in place) 업데이트는 지원하지 않습니다.
JPEG2000 파일 포맷은 밴드(구성요소)를 1개 이상 가지고 있는 8비트 및 16비트 이미지의 손실 및 비손실 압축을 지원합니다. GeoJP2™ 메커니즘을 통해 JP2 파일 안에 GeoTIFF 스타일 좌표계와 지리참조 정보를 내장시킬 수도 있습니다. JPEG2000 파일은 전통적인 JPEG 압축 및 JPEG JFIF 포맷과는 상당히 다른 포맷과 압축 메커니즘을 사용합니다. 같은 그룹이 뚜렷이 다른 새 압축 메커니즘을 개발했습니다. JPEG2000은 웨이블릿 압축 기반입니다.
이 페이지에 문서화된 JPEG2000 (JP2KAK) 드라이버는 상용 카카두(Kakadu) 라이브러리를 기반으로 구현되었습니다. 카카두는 지리공간 및 일반 영상 커뮤니티에서 광범위하게 사용되는 고품질/고성능 JPEG2000 라이브러리입니다. 하지만 무료가 아니기 때문에, GDAL을 빌드하는 사용자가 카카두 라이브러리의 사용 권한을 구매하고 그에 맞춰 환경설정하지 않는 이상, 일반적으로 소스로부터 JP2KAK 드라이버 지원을 포함하는 GDAL을 빌드할 수는 없습니다.
이미지를 읽어올 때 이 드라이버는 밴드를 바이트형(부호 없는 8비트), 부호 있는/부호 없는 16비트, 부호 있는/부호 없는 32비트로 표현할 것입니다. 입력 파일이 GeoJP2™ 파일이라면 지리참조와 좌표계 정보도 사용할 수 있을 것입니다. YCbCr 색 공간에 색상 인코딩된 파일은 RGB로 자동 변환할 것입니다. 색상표 이미지도 지원합니다.
JPEG2000 파일로부터 XMP 메타데이터를 추출할 수 있고, xml:XMP 메타데이터 도메인에 추출한 메타데이터를 XML 원본(raw) 내용으로 저장할 것입니다.
드라이버 케이퍼빌리티
CreateCopy() 지원
이 드라이버는 GDALDriver::CreateCopy()
작업을 지원합니다.
지리참조 작업 지원
이 드라이버는 지리참조 작업을 지원합니다.
VirtualIO 지원
이 드라이버는 virtual I/O operations (/vsimem/, etc.) 를 지원합니다.
환경설정 옵션
JP2KAK 드라이버는 다음 런타임 환경설정 옵션 을 지원합니다. 이 옵션들을 사용하면 드라이버의 습성을 변경할 수 있습니다.
JP2KAK_THREADS=n: 카카두 라이브러리의 기본 규칙을 따라 멀티코어 컴퓨터 상에서는 기본적으로 멀티스레딩을 활용하려 시도할 것입니다. 추가 스레드를 사용하지 않으려면 이 옵션의 값을 0으로 설정하면 됩니다. 또는 특정값을 설정하면 요청한 개수만큼의 작업자 스레드를 생성할 것입니다.
JP2KAK_FUSSY=YES/NO: 이 옵션을 YES로 설정하면 JPEG2000 데이터 스트림의 문제점을 퍼지(fuzzy)하게 리포트합니다. 기본값은 NO입니다.
JP2KAK_RESILIENT=YES/NO: 이 옵션을 YES로 설정하면 성능/속도를 희생하더라도 카카두 라이브러리가 잘못 생성된 JPEG2000 데이터 파일을 최대한 허용하도록 강제합니다. 특히 “패킷 헤더 뒤에 와야 할 EPH 마커를 찾을 수 없습니다”라는 오류 메시지가 발생하거나, 순차(sequence) 플래그를 활성화하고 탄력적(resilient)으로 실행해야 한다는 의미의 오류 메시지가 발생하는 경우 이 옵션이 필요할 것입니다.
지리참조 작업
내부(GeoJP2 또는 GMLJP2 경계 상자), 월드 파일 .j2w/.wld 사이드카 파일, 또는 PAM(Persistent Auxiliary metadata) .aux.xml 사이드카 파일 등 서로 다른 소스들로부터 지리참조 정보를 얻을 수 있습니다. 기본적으로 PAM, GeoJP2, GMLJP2, WORLDFILE 순서대로 파일을 수집합니다. (첫 항목을 가장 우선합니다.)
GDAL 2.2버전부터, GDAL_GEOREF_SOURCES 환경설정 옵션으로 (또는 GEOREF_SOURCES 열기 옵션으로) 사용할 수 있는 소스와 그 우선 순위를 변경할 수 있습니다. 이 옵션의 값은 PAM, GEOJP2, GMLJP2, (GEOJP2, GMLJP2로 가는 단축 키인) INTERNAL, WORLDFILE, NONE이라는 키워드를 쉼표로 구분한 목록입니다. 목록의 첫 항목이 가장 우선되는 소스입니다. 목록에 없는 소스는 무시할 것입니다.
예를 들어 이 옵션을 “WORLDFILE,PAM,INTERNAL”로 설정하면 PAM이나 내부 JP2 경계 상자보다 잠재적인 월드 파일의 지리변형 행렬을 우선할 것입니다. “PAM,WORLDFILE,GEOJP2”로 설정하면 설정된 소스를 이용하고 GMLJP2 경계 상자는 무시할 것입니다.
열기 옵션
다음과 같은 열기 옵션을 사용할 수 있습니다:
1BIT_ALPHA_PROMOTION=YES/NO: 1비트 알파 채널을 8비트로 승격시켜야 할지 여부를 선택합니다. 기본값은 YES입니다.
GEOREF_SOURCES=string: (GDAL 2.2 이상 버전) 사용할 수 있는 지리참조 소스와 그 우선 순위를 정의합니다. 지리참조 작업 단락을 참조하십시오.
생성 문제점
JPEG2000 파일은 기존 데이터셋에서 복사해오는 CreateCopy() 메커니즘을 통해서만 생성할 수 있습니다.
JPEG2000 오버뷰는 이미지의 수학적 서술의 일부로서 유지됩니다. 오버뷰를 개별 프로세스로 작성할 수는 없지만, 이미지를 읽어올 때 일반적으로 이미지가 2의 거듭제곱 인자 여러 개의 오버뷰 수준을 가지고 있는 것으로 표현될 것입니다.
생성 옵션들:
CODEC=JP2/J2K: 사용할 코덱을 지정합니다. 지정하지 않는 경우, 파일 확장자를 기반으로 추정합니다. 확장자를 식별할 수 없는 경우 기본값은 JP2입니다.
QUALITY=n: 압축 용량 비율을 비압축 이미지 용량의 백분율로 설정합니다. 기본값은 20으로, 산출 이미지 용량이 비압축 이미지 용량의 20%여야 한다는 뜻입니다. 여러 요인에 따라 실제 최종 이미지 용량이 설정한 값과 정확히 일치하지 않을 수도 있습니다. 값을 100으로 설정하면 비손실 압축 알고리즘을 이용할 것입니다. 일반적인 이미지 데이터의 경우, 65를 초과하는 값을 지정한다면 차라리 QUALITY=100을 사용하는 편이 나을 수도 있습니다. 비손실 압축이 손실 압축보다 더 나은 압축률을 보일 수도 있기 때문입니다.
BLOCKXSIZE=n: 타일 너비를 설정합니다. 기본값은 20000입니다.
BLOCKYSIZE=n: 타일 높이를 설정합니다. 기본값은 이미지 높이입니다.
FLUSH=TRUE/FALSE: 파일 작성 시 증분(incremental) 플러시 작업을 활성화/비활성화합니다. RLPC 및 LRPC 부호기(corder)를 사용하는 경우 FALSE로 설정해야 합니다. 대용량 이미지 작성 시 FALSE로 설정하면 아주 많은 메모리를 사용할 수도 있습니다. 기본값은 TRUE입니다.
GMLJP2=YES/NO: JPEG2000 사양의 OGC GML을 준수하는 GML 경계 상자가 파일에 포함되어야 하는지를 선택합니다. GMLJP2V2_DEF를 사용하지 않는 이상, GMLJP2 경계 상자의 버전은 1일 것입니다. 기본값은 YES입니다.
GMLJP2V2_DEF=filename: OGC GML-in-JPEG2000 버전 2.0 사양을 준수하는 GML 경계 상자가 파일에 포함되어야 하는지를 선택합니다. filename 이 GMLJP2 v2 경계 상자를 어떻게 작성해야 할지 정의하는 JSON 콘텐츠를 가진 파일을 가리켜야만 합니다. JSON 환경설정 파일의 문법에 대해서는 JP2OpenJPEG 드라이버 문서에 있는 GMLJP2v2 정의 파일 단락 을 참조하십시오. JSON 콘텐츠를 그때 그때 처리해서(inline) 문자열로 직접 전송할 수도 있습니다. filename을 그냥 YES로 설정하면, 최소한의 인스턴스만 빌드할 것입니다.
GeoJP2=YES/NO: GeoJP2 (GeoTIFF-in-JPEG2000) 사양을 준수하는 UUID/GeoTIFF 경계 상자가 파일에 포함되어야 하는지를 선택합니다. 기본값은 YES입니다.
LAYERS=n: 생성하는 레이어 개수를 제어합니다. 이때 레이어는 해상도 레이어와 비슷하지만, 정확하게는 아닙니다. 기본값은 12로 대부분의 상황에서 잘 작동합니다.
ROI=xoff,yoff,xsize,ysize: 더 높은 데이터 품질로 처리해야 할 관심 영역(region of interest)이 될 영역을 선택합니다. 총량(amount)을 더 잘 제어하기 위해 아래 나오는 여러 “R” 플래그를 사용할 수도 있습니다. 예를 들면 “ROI=0,0,100,100”을 설정하는 경우, “Rweight=7”을 설정하면 이미지의 좌상단 100x100 영역을 나머지 이미지보다 훨씬 높은 품질로 인코딩할 것입니다.
다음 생성 옵션들은 카카두 라이브러리에 단단히 얽매여 있으며, 고급 사용자만을 위한 것으로 간주됩니다. 다음 옵션들의 의미를 더 잘 이해하고 싶다면 카카두 문서를 읽어보십시오.
Corder: 기본값은 “PRCL”입니다.
Cprecincts: 기본값은 “{512,512},{256,512},{128,512},{64,512},{32,512},{16,512},{8,512},{4,512},{2,512}” 입니다.
ORGgen_plt: 기본값은 “yes”입니다.
ORGgen_tlm: 카카두 라이브러리 기본값을 사용합니다.
ORGtparts: 카카두 라이브러리 기본값을 사용합니다.
Cmodes: 카카두 라이브러리 기본값을 사용합니다.
Clevels: 카카두 라이브러리 기본값을 사용합니다.
Rshift: 카카두 라이브러리 기본값을 사용합니다.
Rlevels: 카카두 라이브러리 기본값을 사용합니다.
Rweight: 카카두 라이브러리 기본값을 사용합니다.
Qguard: 카카두 라이브러리 기본값을 사용합니다.
Creversible: 이 옵션을 설정하지 않고 QUALITY를 99.5이상으로 설정하는 경우 “yes”로 설정하십시오. 그렇지 않은 경우 “false”로 설정하십시오.
Sprofile: 카카두 라이브러리 기본값을 사용합니다.
RATE: 카카두 라이브러리 기본값을 사용합니다. 압축된 (헤더 포함) 비트의 총 개수와 가장 큰 수평 및 수직 이미지 구성요소 크기 사이의 비율이라는 의미로 표현된 하나 이상의 비트레이트입니다. 최종 품질 레이어가 압축된 비트를 전부 포함해야 한다는 사실을 보여주기 위해 목록의 첫 번째 비트레이트 자리에 대시(“-“)를 사용할 수도 있습니다. C레이어(Clayer)를 사용하지 않는 경우, 레이어 개수를 이 옵션에 지정한 레이트 개수로 설정합니다. 품질 레이어의 실제 개수를 지정하기 위해 C레이어를 사용하는 경우, 다음 조건들 가운데 하나는 반드시 참이어야만 합니다: 1) 이 옵션에 지정한 레이트 개수가 지정한 레이어 개수와 동일한 경우 또는 2) 이 인자를 사용해서 레이트 1개 또는 2개를 지정한 경우. 레이트 2개를 지정한 경우, 레이어 개수가 2개 이상이어야만 하며 그 사이에 오는 레이어에는 대략 로그 간격의 비트레이트를 할당할 것입니다. 레이트 1개만 지정한 경우, 내부 휴리스틱이 하한을 결정하고 전체 범위에 걸쳐 레이어 레이트들의 사이를 로그 간격으로 띄울 것입니다. 레이트들은 ASC 순서여야 합니다.
카카두의 알려진 문제점들
7.8버전에서 알파 채널 쓰기
카카두 7.8버전은 jp2_channels::set_opacity_mapping에 알파 채널을 가진 이미지를 작성하는 경우 오류를 일으킬 수 있는 버그를 가지고 있습니다. 7.9버전으로 업그레이드해주십시오.
Error: GdalIO: Error in Kakadu File Format Support: Attempting to
create a Component Mapping (cmap) box, one of whose channels refers to
a non-existent image component or palette lookup table. (code = 1)
일부 플랫폼에서 kdu_get_num_processors가 항상 0을 반환
윈도우/맥이 아닌 (예: 리눅스) 플랫폼에 설치할 때, 카카두가 kdu_arch.cpp에 unistd.h를 포함시키지 않을 수도 있습니다. 즉 _SC_NPROCESSORS_ONLN 및 _SC_NPROCESSORS_CONF가 정의되지 않아 kdu_get_num_processors가 항상 0을 반환한다는 뜻입니다. 따라서 JP2KAK 드라이버가 기본적으로 작업자 스레드를 생성하지 못 하게 될 수도 있습니다.
참고
gdal/frmts/jp2kak/jp2kakdataset.cpp
로 구현되었습니다.7.5버전 이전의 카카두 배포판을 사용하는 경우, 예를 들어 카카두 7.3.2버전이라면 다음과 같이 GDAL을 환경설정하고 컴파일해야 합니다:
CXXFLAGS="-DKDU_MAJOR_VERSION=7 -DKDU_MINOR_VERSION=3 -DKDU_PATCH_VERSION=2"
JP2OpenJPEG – OpenJPEG 라이브러리 기반 JPEG2000 드라이버 드라이버로 대체할 수 있습니다.