PNG(이동식 네트워크 그래픽) 사양(제2판)
2003년 11월 10일 W3C에서 공식적으로 권장함
현재 버전: 작업 바이트 순서).
현재 호스트에서 흔히 사용하는 X86 및 ARM 프로세서는 호스트 바이트 순서라고 하는 리틀 엔디안 모드입니다.
PNG는 네트워크 바이트 순서를 사용합니다.
일반적인 트루 컬러 사진은 빨간색, 녹색, 파란색의 최소 3개 채널로 구성됩니다. 이는 각 픽셀이 3바이트 이상의 공간을 차지한다는 의미입니다. 이런 식으로 이미지의 압축 효율성은 매우 낮습니다.
따라서 팔레트를 구축하고 팔레트에서 사용해야 할 색상을 미리 설정해 두고 나중에 사용할 때는 팔레트의 인덱스 위치만 제공하면 됩니다.
그리고 팔레트가 너무 많은 공간을 차지하지 않도록 팔레트 용량을 256 이내로 설정했습니다. 인덱스 위치는 256을 초과하지 않으며 이를 표현하는 데 1바이트만 필요합니다. 1바이트는 1채널만 차지하므로 인덱스 모드에서는 1채널만 있습니다.
이미지는 수많은 픽셀로 구성되어 있어 2차원 배열이라고 볼 수 있습니다. 가로 행마다 한 픽셀씩 추출하고 세로 열마다 한 픽셀씩 추출하는 등 여러 특수 위치를 추출할 수 있습니다. 이는 단순화된 왜곡으로 원본 이미지를 표현할 수 있는 새로운 2차원 배열을 형성합니다. 이러한 추출 방법을 패스 추출이라고 합니다. 추출 후 형성된 데이터는 인터리브되며 각 세그먼트에는 전체 이미지의 썸네일이 포함될 수 있습니다. 재조합만으로도 완전한 이미지가 생성될 수 있으며, 완전한 데이터가 없더라도 일부만 썸네일을 얻을 수 있습니다. 네트워크 전송에서 이미지 전송 속도를 높이는 방법이지만, 지금은 네트워크 속도가 매우 빠르기 때문에 거의 쓸모가 없습니다.
컬러맵의 가운데 부분은 흰색으로, 이를 화이트 포인트라고 부르며 컬러맵의 매개변수이다. 또 다른 매개변수는 컬러맵의 변환에 사용되는 베이스입니다.
흰색 점의 좌표를 설정하여 가운데 흰색 영역을 변경하고 빨간색, 녹색, 파란색 방향으로 이동하여 컬러맵의 변화 정도를 조정할 수 있습니다.
PNG 사양은 애플리케이션 인터페이스를 지정하지 않지만 원본 이미지, 표준 이미지, PNG 이미지, 전달 이미지의 네 가지 유형의 이미지를 다룹니다. 관계는 다음과 같습니다.
이진 인코딩이 차지하는 비트 수가 샘플 깊이입니다.
PNG에는 ICC 구성 사용, sRGB 구성 사용, 채도 참조 및 흰색 점 위치 구성 사용 등 세 가지 색상 공간 관리 방법이 있습니다.
ICC 구성은 더 유연하고 적응하기 쉽습니다. sRGB 구성은 특정 색상 공간을 설정해야 하며 더 많은 용량을 차지할 수 있습니다. 처음 두 개도 감마 값을 사용하는 것이 좋습니다.
표준 이미지를 PNG 이미지로 변환하려면 몇 가지 방법을 사용해야 합니다. 프로세스는 다음과 같습니다.
투명 채널을 분리합니다. 실제로 많은 표준 이미지에는 투명 채널이 없으므로 기본적으로 투명도가 없는 것으로 설정하고 하나의 채널을 저장할 수 있습니다.
서로 다른 픽셀 값의 수가 256개 미만이고 샘플 깊이가 8보다 작거나 같으면 인덱스 구축을 시작할 수 있습니다.
색상 샘플 깊이가 일정하고 각 채널의 값이 동일한 경우 하나의 채널을 사용하여 모두, 즉 회색조 이미지를 표현할 수 있습니다.
알파채널을 사용하지 않고 투명도를 표현하는 방법으로 배경색 설정이 필요하다.
PNG는 모든 깊이를 지원하는 것은 아니며 1, 2, 4, 8, 16만 지원합니다. 이 숫자가 아닌 경우 소프트웨어를 통해 깊이를 조정해야 합니다.
예를 들어 원래 깊이는 5였는데 이제 확장하려면 8로 변경해야 합니다.
채널마다 깊이가 다른 경우 조정할 최대 깊이를 선택합니다.
이 깊이 변환은 되돌릴 수 있습니다.
비밀번호에는 5가지 유형이 있습니다.
패스 추출에는 두 가지 방법이 있습니다.
첫 번째는 아무것도 하지 않는 빈 메소드입니다. (그렇다면 왜 이렇게 경직되고 이것을 하나의 방법으로 간주해야 합니까?)
두 번째 방법은 여러 번의 스캔을 통해 7개의 축소된 이미지를 얻는 것입니다. 즉, Adam7 알고리즘입니다(딥러닝의 Adam 알고리즘이 아닙니다).
하지만 이 알고리즘은 국내 웹사이트에서는 거의 찾아볼 수 없으며, 위키피디아(https://en.wikipedia.org/wiki/Adam7_algorithm)에서의 소개도 그다지 명확하지 않습니다. 그래서 여기서는 간략하게 이야기하겠습니다.
위에서 얻은 축소된 이미지를 읽고(물론 빈 메소드는 원본 이미지를 읽습니다) 한 줄씩 다시 읽습니다. (여기서는 위의 추출을 산출물로 바꾸는 등 많은 작업이 있을 수 있습니다.)
필터 유형은 여러 가지가 있으며 필터 유형은 필터 배열 앞에 기록됩니다.
인코딩과 암호화입니다.
인코딩된 데이터를 하나 이상의 블록으로 나눕니다.
표준 PNG 파일은 여러 블록으로 구성되며 각 블록은 길이, 이름, 데이터 본문, 검사 코드의 네 부분으로 구성됩니다.
표준 PNG 정의에는 18가지 블록 유형이 있으며 사용자 정의 블록을 추가할 수도 있습니다.
이러한 18개 블록 유형은 다음과 같습니다.
주요 블록:
IHDR(이미지 헤더 파일 헤더), PLTE(팔레트 팔레트), IDAT(이미지 데이터(이미지 content), IEND(이미지 끝 파일 끝)
보조 블록:
투명도 관련: tRNS(투명도 정보)
색상 관련: cHRM(색도 및 흰색) 포인트 색도 및 백색점), gAMA(감마 감마 값), iCCP(임베디드 ICC 프로필 임베디드 ICC 개요), sBIT(유효 비트 유효 비트), sRGB(표준 RGB 색 공간 표준 RGB 색 공간)
텍스트 관련: iTXt(국제 텍스트 데이터 국제화 텍스트), tEXt(텍스트 데이터 텍스트), zTXt(zip 텍스트 데이터 압축 텍스트)
시간 관련: tIME(마지막 수정 시간(최근 수정 시간)
p>
기타: bKGD(배경색), hIST(히스토그램), PHYs(물리적 픽셀 크기), sPLT(추천 팔레트),
전송 오류 또는 파일 손상으로 인해 대부분 또는 전부가 손상됩니다. 데이터 스트림, 구문 오류, 유효하지 않은 블록 또는 누락된 블록.
두 가지 오류 처리 방법을 구별해야 합니다.
ISO/IEC 또는 PNG 그룹에 관련 확장을 제출하고, 새로운 블록 유형 및 텍스트 키워드를 등록하고, 새로운 필터링 알고리즘, 인터리브 모드 알고리즘 및 압축 알고리즘을 확장할 수 있습니다.
데이터 스트림의 바이너리 구조입니다.
모든 PNG 데이터 스트림의 처음 8자는 137 80 78 78 71 13 10 26 10
바이트 단위로 b'\x89PNG\r\n\x1a\n입니다. '
이 서명은 다음 데이터가 모두 PNG 데이터 스트림임을 나타냅니다. 완료하려면 IEND가 필요합니다.
각 블록은 다음 네 부분으로 구성됩니다.
이름 규칙을 사용하면 PNG 디코더가 현재 블록의 목적을 식별할 수 없는 경우에도 이름을 통해 관련 정보를 얻을 수 있습니다.
블록 이름은 4자리 숫자로 구성됩니다.
첫 번째 숫자는 보조를 나타내고, 소문자는 이 블록이 보조 블록임을 나타내고, 대문자는 이 블록이 키 블록임을 나타냅니다.
두 번째 숫자는 프라이빗(Private)을 나타내고, 소문자는 해당 블록이 프라이빗(Private) 블록으로서 국제 표준에 정의되지 않았음을 나타내며, 크기는 앞서 언급한 18가지 블록 유형을 나타냅니다.
세 번째 비트는 예약된 비트입니다. 소문자는 블록이 폐기되었음을 나타내고 대문자는 사용할 수 있음을 나타냅니다. (향후 확장에 동의하는 데 사용됨)
네 번째 숫자는 복사 보안을 나타냅니다. 즉, PNG 편집기가 이미지 편집 시 안전하지 않은 데이터 블록을 발견하면 오히려 완전히 복사하지 않습니다. 선택적이며 대문자는 PNG 편집기가 문제에 대해 걱정하지 않고 완전히 복사할 수 있음을 의미합니다.
자세한 내용은 crc32 알고리즘을 참조하세요.
PNG 이미지는 스트리밍 방식으로 읽을 수 있으므로 읽을 필요가 없습니다. 파일 끝까지 브라우저에서 미리 봅니다.
따라서 이미지 내용을 읽기 전에 팔레트 색인화 등 몇 가지 준비 사항이 필요합니다.
4.3장에서 쓴 것 같은데요?
4.4장에서 썼듯이 색상 유형은 5가지가 있습니다.
색상 유형은 IHDR로 기록됩니다.
그레이스케일 모드에서 밝기는 gAMA, sRGB, iCCP에 따라 달라지거나 이러한 기능이 없는 경우에는 기기에 따라 달라집니다.
색상 샘플은 반드시 빛의 강도에 비례하지는 않으며 gAMA 설정을 통해 조정할 수 있습니다.
값은 다음과 같이 계산됩니다. 처음에는 0, 팔레트 사용 시 1, 트루 컬러 사용 시 2, 투명도 채널 사용 시 4를 더합니다. 회색조에서는 인덱싱을 사용할 수 없습니다.
투명도를 표현하는 방법에는 투명도 채널을 사용하는 방법, tRNS 블록을 사용하여 투명 색상 정보를 설정하는 방법, 인덱스의 tRNS에 알파 테이블을 설정하는 방법, 투명도 채널을 사용하지 않거나 tRNS를 사용하는 방법 등 4가지가 있습니다. 완전한 불투명도를 나타냅니다.
투명 채널의 샘플 깊이는 8과 16입니다. 투명 채널은 픽셀에 저장되어 있으며 이는 완전히 투명하다는 의미이며 완전히 불투명하다는 의미입니다. 투명도는 이미지의 전경색과 배경색을 결합하는 데 사용됩니다.
일부 일반 사진에는 투명도가 포함되어 있지 않으며 픽셀 값에 투명도를 곱하고 검정색을 배경으로 미리 합성 단계를 수행하지만 PNG는 이를 수행하지 않습니다.
정수(int)는 다중 비트 바이트이고, short는 2, int는 4, long은 8입니다.
PNG는 MSB가 높은 순서이고 LSB가 낮은 순서인 네트워크 바이트 순서를 사용합니다.
즉, 개별 픽셀이 서로 촘촘하게 묶인 각 PNG 이미지의 행입니다.
깊이가 8 미만인 경우 스캔 라인의 끝은 불완전한 바이트일 수 있으며 이러한 사용되지 않은 바이트는 처리되지 않습니다.
필터는 압축된 데이터의 압축성을 향상할 수 있으며 되돌릴 수 있습니다. PNG는 스캔라인 데이터 필터링을 허용합니다. 즉, 필터링이 필요하지 않습니다.
필터링 후 바이트 순서는 필터링 전과 동일하지만, 필터링 유형에 따라 시작 부분에 바이트 표시가 추가됩니다.
길이가 늘어나지 않으면 필터링이 없다는 뜻입니다. 구체적인 필터링 방법은 뒤에서 설명하겠습니다.
인터레이스 모드는 CRT 모니터에서 네트워크 이미지의 로딩 속도를 향상시킬 수 있습니다. 즉, 네트워크가 없고 CRT 모니터가 없으면 인터레이스 모드는 쓸모가 없습니다.
[4.5.2 패스 추출](#4.5.2 패스 추출) 참조
Adam7의 특성상 너비나 높이가 5 미만인 이미지는 썸네일이 부족합니다. (다섯 번째 열에 2개, 다섯 번째 행에 3개)
필터링의 목적은 압축률을 높이는 것입니다. 필터링 방법은 고유하지 않습니다. 인터레이스 모드에서는 모든 축소 이미지가 동일한 필터 방법을 사용해야 합니다. 비인터레이스 모드에서는 이미지가 하나만 있고 방법도 하나만 있습니다.
이 표준은 메소드 번호 0을 정의하고 다른 번호는 미래를 위해 예약되어 있습니다. 방법 0에는 5가지 유형의 필터가 포함되어 있으며 각 스캔 라인에 서로 다른 필터 유형을 사용할 수 있습니다.
PNG 사양은 필터 유형을 요구하지 않습니다. 구체적인 선택 방법은 나중에 설명합니다.
필터는 바이트 기반이며 픽셀, 채널 또는 깊이와 관련이 없습니다. 필터링할 바이트를 제공하면 됩니다.
다음은 여러 매개변수의 정의입니다.
Org()는 원래 바이트 값을 나타냅니다.
Flt()는 필터링된 값을 나타냅니다.
Rc()는 재구성된 값을 나타냅니다.
Paeth() [9.4 필터 유형 4](#9.4 필터 유형 4)를 참조하세요.
이전 픽셀이 없으면 대신 0을 사용합니다. 이전 라인이 없는 각 썸네일의 첫 번째 라인도 0으로 대체됩니다.
필터링을 사용하기 때문에 재구성 시 이 순서대로 계산을 수행해야 합니다.
필터의 입력 및 출력 값은 부호 없는 바이트입니다.
세 가지 유형의 필터 0, 1, 2는 매우 간단하며 열/행을 하나씩 빼기만 하면 됩니다.
하지만 세 번째 유형에서는 Flt(x) = Org(x) - Floor((Org(a) Org(b)) / 2), Org(a) Org(b)에 오버플로가 있습니다. 이 경우 바이트 연산을 사용할 수 없으며 짧거나 그 이상의 비트여야 합니다. 물론 오른쪽 이동 알고리즘도 있습니다.
Paeth 알고리즘은 먼저 인접한 3개의 픽셀(왼쪽, 위, 왼쪽 위)의 선형 값을 계산하고, 계산된 값에 가장 가까운 인접 픽셀을 선택하여 다시 계산합니다. 캐시가 오버플로되지 않도록 주의하세요. 기능은 다음과 같습니다.
위 필터링과 마찬가지로 기본값은 메서드 0입니다. 이 두 가지는 IHDR로 표시되어 있습니다.
물론 여기서는 기본 레벨 8을 사용하여 zlib 압축이 사용되며 압축된 바이트는 32768을 초과하지 않습니다.
이 검사값은 PNG 블록의 검사값과 다르므로 둘을 혼동하면 안 됩니다.
필터링된 여러 줄은 zlib 데이터 스트림으로 압축되고 여러 PNG 블록에 배치됩니다. 여러 PNG 블록은 압축이 풀려 zlib 데이터 스트림을 얻습니다.
물론 여기에는 비동기 읽기도 포함됩니다. zlib 데이터 스트림 자체가 중단되더라도 이전에 정렬된 데이터를 계속 읽을 수 있습니다. 따라서 위의 Python 방법은 다음과 같이 개선되었습니다.
읽는 동안 구문 분석하는 연속 읽기를 구축하세요.
다음은 18개의 PNG 사양 블록에 대한 소개입니다.
IHDR은 PNG 데이터 스트림의 첫 번째 블록입니다. 구성은 다음과 같습니다.
따라서 IHDR 블록 길이는 13이며 변경되지 않습니다.
팔레트는 2차원 배열로, 색상을 표현하기 위해 인덱스 n을 사용하는 Array[n][3]으로 간주할 수 있습니다.
따라서 n은 256을 초과할 수 없으며 PLTE 블록의 길이도 3의 배수이다.
어쨌든 팔레트의 깊이는 8비트입니다. 이미지의 깊이가 1, 2, 4이더라도 팔레트는 여전히 8입니다.
결합된 모든 IDAT 블록은 zlib 데이터 스트림입니다. [10 압축](#10 압축)을 참조하세요.
이 데이터는 비어 있어 PNG 데이터 스트림이 종료되었음을 나타냅니다. 물론 이 블록이 손상되더라도 괜찮습니다.
이것은 세 가지 구성 요소로 구성된 투명도 정보를 나타내는 블록입니다:
회색조 모드(이 회색조와 동일한 색상은 투명한 것으로 간주됩니다)
트루 컬러 모드 (이 세 가지 값은 투명한 색상을 나타냅니다)
인덱스 모드 (인덱스 모드에서 tRNS는 알파 테이블과 동일합니다. 이 테이블은 인덱스만큼 크며 인덱스의 투명도에 해당합니다)
그레이스케일 모드와 트루 컬러 모드가 2바이트로 표시되는 이유는 16비트 깊이에 적응해야 하고 인덱스 모드 깊이가 항상 8보다 작거나 같기 때문입니다.
이 블록은 CIE 색 공간을 설정하는 데 사용됩니다. 구성은 다음과 같습니다.
저장된 값은 실제 값의 100000배입니다.
CIE 색도 공간은 2차원 이미지로, 빨간색, 녹색, 파란색, 흰색의 4개 점으로 구성되어 원을 둘러싸는 근시 삼각형을 구성하여 색상 이동 정도를 설정합니다.
이 블록은 부호 없는 int만 저장하며 실제 감마 값을 얻으려면 해당 값을 100000으로 나누어야 합니다.
이 블록은 ICC 설명을 설정하는 데 사용됩니다.
PNG는 고정 깊이만 지원합니다. 원본 이미지의 깊이가 일치하지 않으면 강제로 크기가 조정되지만 원본 이미지를 복원하기 위해 원본 정보가 여기에 유지됩니다. (그래서 일반적으로 사용되지 않는데 표준 이미지를 비표준 이미지로 변환해야 하는 이유는 무엇입니까?)
채널 번호마다 sBIT 길이가 다릅니다.
sRGB 색 공간을 사용하면 현재 ICC를 사용하여 이를 설명할 수 없습니다. sRGB에는 렌더링 의도를 나타내는 부호 없는 바이트가 하나만 포함되어 있습니다.
값의 의미는 다음과 같습니다.
sRGB 사용 시에는 gAMA, cHRM을 사용하는 것이 좋습니다. 일부 기기에서는 sRGB를 지원하지 않으므로 용도에 맞게 사용할 수 있기 때문입니다. 호환성.
위는 텍스트 정보에 사용되는 키워드입니다. 키워드는 실제로 그다지 중요하지 않으며 단지 정의일 뿐이며 스스로 변경할 수 있습니다. 그러나 위의 사항을 충족하는 것은 이미지 소프트웨어 표준으로 읽을 수 있습니다.
tEXt에는 다음 구성 요소가 포함되어 있습니다.
물론 여기서 압축 방법도 0입니다. zlib를 사용하여 후속 데이터의 압축을 풉니다.
국제 텍스트 데이터, 약간 고급 .
언어 유형은 RCF-3066, ISO 646 및 ISO 639를 참조하세요.
배경색입니다.
히스토그램은 팔레트에 있는 각 색상의 대략적인 사용 빈도를 제공합니다.
PNG 브라우저가 팔레트의 모든 색상을 제공할 수 없는 경우 히스토그램은 사용할 유사한 팔레트를 만드는 데 도움이 될 수 있습니다.
물론 현재 완전한 색상 팔레트를 제공하지 않는 소프트웨어는 없습니다.
이 블록은 화면의 실제 픽셀 크기를 나타내는 데 사용됩니다. 구조는 다음과 같습니다:
두 가지 단위 사양이 있습니다. False인 경우 이 블록은 실제 값이 아닌 길이와 너비의 비율만 나타냅니다. 즉, 단위는 미터입니다. 즉, 1단위는 1미터이고, 1단위는 1미터입니다. 미터에는 몇 개의 픽셀이 포함됩니까?
특정 채널 길이는 샘플 깊이에 따라 결정됩니다. 깊이가 16이면 2개를 의미하고, 깊이가 8 이하는 1개를 의미합니다.
팔레트 이름은 대소문자를 구분하며 키워드 인수와 동일한 제한 사항이 적용됩니다.
회색조 PNG 이미지에서 각 메쉬는 일반적으로 동일한 빨간색, 녹색, 파란색 및 파란색 값을 갖지만 필수는 아닙니다.
각 주파수 값은 실제 주파수가 아닌 이미지의 픽셀 비율에 비례합니다.
여기서는 세계시(UTC)를 사용합니다
다음 수식은 너무 복잡하니 잊어버리고 그냥 하세요