QOI(이미지 포맷)

QOI (image format)
꽤 괜찮은 이미지
Qoi-logo-black.svg
파일 이름 확장자
.qoi
매직 넘버qoif(4 바이트, ASCII)
개발자도미니크 사블롭스키
초기 릴리즈2021년 11월 24일
최신 릴리즈
1.0
2022년 1월 5일; 11개월 전(2022-01-05)
포맷의 종류무손실 비트맵 이미지 포맷
표준.사양
오픈 포맷?네.
프리 포맷?네.
웹 사이트qoiformat.org

Quiet OK Image Format (QOI)는 도미닉 사블류스키가 발명한 24비트 (RGB당 8비트)또는 32비트 (8비트 알파 채널 RGBA에서 8비트)컬러 래스터 (비트맵)이미지의 무손실 이미지 압축 사양입니다.[1]

묘사

목적은 구현이 용이한 PNG보다 빠르고 무손실 오픈 소스 압축 방식을 만드는 것이었습니다.타사 YouTube 동영상은 PNG 및 QOI [2]압축 수행 방법을 설명합니다.방송과 비디오에 기재된 수치는 PNG와 비교하여 20~50배 빠른 인코딩과 3~4배 빠른 디코딩 속도를 나타내고 있으며 압축 크기는 PNG와 [1]비슷합니다.저자는 이 명세서를 퍼블릭 도메인(CC0)에 기부했다.

소프트웨어 및 언어 지원

QOI는 ImageMagick,[3] IrfanView(버전 4.60 [4]이후) 및 FFmpeg(버전 5.1 [5]이후)에서 기본적으로 지원됩니다.

커뮤니티 메이드 플러그인GIMP, 페인트에서 사용할 수 있습니다.NETXnView MP.[6]

또한 Rust, Python, Java, C++, C#[7] 등의 다양한 언어에 대한 구현도 있습니다.프로젝트의 Git(Hub) 저장소 README에서 전체 목록을 찾을 수 있습니다.

파일 형식

헤더

QOI 파일은 14바이트의 헤더와 그 뒤에 임의의 수의 데이터 "청크" 및 8바이트의 엔드 마커로 구성됩니다.

qoi_module {      마술[4]; // 매직바이트 "qoif"     uint32_t ; // 이미지 폭(픽셀)(BE)     uint32_t 높이; // 이미지 높이(픽셀)(BE)     uint8_t 채널; // 3 = RGB, 4 = RGBA     uint8_t 색공간; // 0 = sRGB(선형 알파 포함) // 1 = 모든 채널 선형 }; 

색공간 필드와 채널필드는 순수하게 정보를 제공합니다.데이터 청크의 부호화 방법은 변경되지 않습니다.

부호화

이미지는 행별로 왼쪽에서 오른쪽으로, 위에서 아래로 인코딩됩니다.디코더와 인코더의 선두는{r: 0, g: 0, b: 0, a: 255}이전 픽셀 값으로 지정합니다.모든 픽셀이 지정된 경우 이미지가 완성됩니다.width * height커버되어 있습니다.픽셀은 다음과 같이 인코딩됩니다.

  • 이전 픽셀의 런렝스 부호화(QOI_OP_RUN)
  • 이전에 본 픽셀 배열에 대한 색인(QOI_OP_INDEX)
  • r,g,b의 이전 픽셀 값과 비교한 차이(QOI_OP_DIFF또는QOI_OP_LUMA)
  • 전체 r, g, b 또는 r, g, b, a 값(QOI_OP_RGB또는QOI_OP_RGBA)

색상 채널은 알파 채널("사전 증배되지 않은 알파")과 사전 증배되지 않는 것으로 가정합니다.A 러닝array[64](초기화 제로)는, 인코더와 디코더에 의해서 보관 유지됩니다.인코더 및 디코더가 본 각 화소는 색값의 해시함수에 의해 형성된 위치에 배치된다.

인코더에서 인덱스의 픽셀 값이 현재 픽셀과 일치할 경우 이 인덱스 위치는 다음과 같이 스트림에 기록됩니다.QOI_OP_INDEX. 인덱스의 해시 함수는 다음과 같습니다.

인덱스 위치 = (r * 3 + g * 5 + b * 7 + a * 11) % 64 

각 청크는 2비트 또는 8비트 태그로 시작하고 그 뒤에 다수의 데이터 비트가 이어집니다.청크의 비트 길이는 8로 나눌 수 있습니다. 즉, 모든 청크가 바이트 정렬됩니다.이러한 데이터 비트로 인코딩된 모든 값은 왼쪽에 최상위 비트가 있습니다.8비트 태그는 2비트 태그보다 우선합니다.디코더는 먼저 8비트 태그가 있는지 확인해야 합니다.바이트 스트림의 끝은 7로 표시됩니다.0x00바이트 뒤에 싱글이 이어집니다.0x01바이트.

가능한 청크는 다음과 같습니다.

┌─ QOI_OP_RGB ────┬─────────┬─────────┬─────────┐      바이트[0]      바이트[1]  바이트[2]  바이트[3]   7 6 5 4 3 2 1 0  7 .. 0   7 .. 0   7 .. 0   │─────────────────┼─────────┼─────────┼─────────│  1 1 1 1 1 1 1 0    빨간.     초록의    파랑색    └─────────────────┴─────────┴─────────┴─────────┘ 8-조금 태그 b111110 (254) 8-조금 빨간. 채널. 가치 8-조금 초록의 채널. 가치 8-조금 파랑색 채널. 가치 

알파 값은 이전 픽셀에서 변경되지 않습니다.

┌─ QOI_OP_RGBA ───┬─────────┬─────────┬─────────┬─────────┐      바이트[0]      바이트[1]  바이트[2]  바이트[3]  바이트[4]   7 6 5 4 3 2 1 0  7 .. 0   7 .. 0   7 .. 0   7 .. 0   │─────────────────┼─────────┼─────────┼─────────┼─────────│  1 1 1 1 1 1 1 1    빨간.     초록의    파랑색     알파   └─────────────────┴─────────┴─────────┴─────────┴─────────┘ 8-조금 태그 b1111111 (255) 8-조금 빨간. 채널. 가치 8-조금 초록의 채널. 가치 8-조금 파랑색 채널. 가치 8-조금 알파 채널. 가치 
┌─ QOI_OP_INDEX ──┐      바이트[0]       7 6 5 4 3 2 1 0  │────┼────────────│ 0 0  색인       (범위: 0..63) └────┴────────────┘ 2-조금 태그 b00 6-조금 색인 안으로  색. 색인 배열: 0..63 

유효한 인코더는 2개 이상 연속해서 발행할 수 없습니다.QOI_OP_INDEX같은 인덱스로 이동합니다. QOI_OP_RUN대신 사용해야 합니다.

┌─ QOI_OP_DIFF ───┐     바이트[0]        7 6 5 4 3 2 1 0  │────┼───┼───┼────│  0 1닥터 dg  db  (범위: 64 .. 127) └────┴───┴───┴────┘ 2-조금 태그 b01 2-조금 빨간. 채널. 차이 부터  이전의 화소 -2..1 2-조금 초록의 채널. 차이 부터  이전의 화소 -2..1 2-조금 파랑색 채널. 차이 부터  이전의 화소 -2..1 

현재 채널 값과의 차이는 랩어라운드 조작을 사용하고 있기 때문에1 - 2255가 됩니다만,255 + 10이 됩니다.

값은 바이어스 2의 부호 없는 정수로 저장됩니다. 예: -2는 0으로 저장됩니다.b001은 3으로 저장됩니다(b11). 알파 값은 이전 픽셀과 변경되지 않습니다.

┌─ QOI_OP_LUMA ───┬─────────────────┐     바이트[0]        바이트[1]          7 6 5 4 3 2 1 0  7 6 5 4 3 2 1 0  │────┼────────────┼────────┼────────│ 1 0  다르다 초록의 닥터 - dg db - dg  (바이트[0] 범위: 128 .. 191) └────┴────────────┴────────┴────────┘ 2-조금 태그 b10 6-조금 초록의 채널. 차이 부터  이전의 화소 -32..31 4-조금 빨간. 채널. 차이 마이너스 초록의 채널. 차이 -8..7 4-조금 파랑색 채널. 차이 마이너스 초록의 채널. 차이 -8..7 

녹색 채널은 일반적인 변경 방향을 나타내기 위해 사용되며 6비트로 인코딩됩니다.빨간색 및 파란색 채널(dr 및 db)은 녹색 채널 차이를 기반으로 합니다.예:

dr_dg = (cur_px.r - prev_px.r) - (cur_px.g - prev_px.g) db_dg = (cur_px.b - prev_px.b) - (cur_px.g - prev_px.g) 

현재 채널 값과의 차이는 랩어라운드 조작을 사용하고 있기 때문에10 - 13253이 됩니다만,250 + 71이 됩니다.

값은 녹색 채널의 경우 32, 빨간색 및 파란색 채널의 경우 8의 바이어스를 갖는 부호 없는 정수로 저장됩니다.알파 값은 이전 픽셀에서 변경되지 않습니다.

┌─ QOI_OP_RUN ────┐      바이트[0]       7 6 5 4 3 2 1 0  │────┼────────────│ 1 1  달려.         (범위: 192 .. 253) └────┴────────────┘ 2-조금 태그 b11 6-조금 달려.-길이 반복.  이전의 화소: 1..62  111101   32 16 8 4 1 

길이는 -1의 바이어스로 저장됩니다.런렝스 63 및 64 (에 주의해 주세요)b111110그리고.b111111)는, 에 의해서 점유되고 있기 때문에, 불법입니다.QOI_OP_RGB그리고.QOI_OP_RGBA태그를 지정합니다.[8]

레퍼런스

  1. ^ a b "Lossless Image Compression in O(n) Time". Phoboslab.org. 2021-10-24. Retrieved May 1, 2022.
  2. ^ 를 클릭합니다Reducible (March 3, 2022). "How PNG Works: Compromising Speed for Quality". YouTube.com. Retrieved May 1, 2022..
  3. ^ "ImageMagick - Image Formats". Retrieved May 4, 2022.
  4. ^ "History of IrfanView Changes/Versions". www.irfanview.com. Retrieved 2022-05-10.
  5. ^ "FFmpeg Changelog - Gitweb". ffmpeg.org. Retrieved 2022-07-13.
  6. ^ James Hein. "Moving images to the next level". Bangkok Post. Retrieved April 1, 2022.
  7. ^ Simon Sharwood. "Developer creates 'Quite OK Image Format' – but it performs better than just OK". The Register.
  8. ^ Szablewski, Dominic (2022-01-05). "The Quite OK Image Format Specification" (PDF). Retrieved 2022-06-05. Public Domain이 문서에는 퍼블릭 도메인에 있는 이 소스로부터의 텍스트가 포함되어 있습니다.

외부 링크