현재 버전: 작업 바이트 순서).
현재 호스트에서 일반적으로 사용되는 X86 및 ARM 프로세서는 호스트 바이트 순서라고 하는 작은 끝 모드입니다.
PNG 는 네트워크 바이트 순서를 사용합니다.
보통 트루컬러 사진은 최소한 빨강, 녹색, 파랑의 3 개 채널로 구성됩니다. 즉 픽셀당 3 바이트 이상의 공간을 차지합니다. 따라서 그림의 압축 효율은 매우 낮습니다.
그래서 우리는 팔레트를 만들고, 팔레트에 우리가 사용해야 할 색상을 미리 설정하며, 단지 팔레트의 색인 위치만 제공하면 나중에 사용할 수 있습니다.
그리고 팔레트가 너무 많은 공간을 차지하지 않도록 팔레트의 용량을 256 이내로 설정했습니다. 인덱스 위치는 256 을 초과하지 않습니다. 1 바이트만 있으면 됩니다. 즉, 1 바이트가 하나의 채널만 차지하므로 인덱스 모드에는 채널이 하나만 있습니다.
한 장의 사진은 많은 픽셀로 이루어져 있어 하나의 2 차원 배열로 볼 수 있다. 가로 행의 두 번째 픽셀마다, 세로 열의 두 번째 픽셀마다 등 몇 가지 특수 위치를 추출할 수 있습니다. 이렇게 하면 원본 이미지를 간결하고 왜곡적으로 표현할 수 있는 새로운 2 차원 배열이 형성됩니다. 이 추출 방법을 Pass 추출이라고 하며, 추출된 데이터는 인터리브되며 각 세그먼트마다 전체 그림의 축소판을 포함할 수 있습니다. 전체 이미지를 다시 조합하면 됩니다. 전체 데이터가 없어도 일부분만 있으면 축소판을 얻을 수 있습니다. 인터넷 전송에서 이미지 전송을 가속화하는 한 가지 방법이지만, 지금은 인터넷 속도가 너무 빨라서 거의 쓸모가 없다.
컬러 카드의 중간 영역은 흰색이고, 우리가 흰색 점이라고 부르는 것은 컬러 카드의 매개 변수입니다. 또 다른 매개변수는 색상 매핑 변환에 사용되는 기준입니다.
흰색 점의 좌표를 설정하여 중간 흰색 영역을 빨강, 녹색, 파랑으로 오프셋하여 색상 지도의 변경 정도를 조정할 수 있습니다.
PNG 사양에는 응용 프로그램 인터페이스가 규정되어 있지 않지만 원본 이미지, 표준 이미지, PNG 이미지 및 전달 이미지의 네 가지 이미지가 포함됩니다. 이 관계는 다음과 같습니다.
이진 인코딩이 차지하는 자릿수는 샘플 깊이입니다.
PNG 는 ICC 구성, sRGB 구성, 색상 참조 및 흰색 점 위치 구성이라는 세 가지 방법으로 색상 공간을 관리합니다.
ICC 구성은 유연하고 적응이 용이합니다. SRGB 구성에는 특정 색상 공간을 설정해야 하므로 더 많은 용량을 사용할 수 있습니다. 마지막은 더 정확하다. 처음 두 개의 경우 감마 값도 사용하는 것이 좋습니다.
우리는 표준 이미지를 PNG 이미지로 변환하는 몇 가지 방법이 필요하다. 프로세스는 다음과 같습니다.
투명 채널을 분리합니다. 실제로 많은 표준 이미지에는 투명 채널이 없습니다. 기본적으로 불투명으로 설정할 수 있으므로 채널이 절약됩니다.
서로 다른 픽셀 값의 수가 256 개 미만이고 샘플 깊이가 8 보다 작거나 같으면 색인을 만들 수 있습니다.
색상 견본의 깊이가 같고 각 채널의 값이 같은 경우 한 채널을 사용하여 모든 내용, 즉 회색 음영 이미지를 나타낼 수 있습니다.
알파 채널을 사용하지 않고 투명도를 나타내는 방법으로 배경 색상을 설정해야 합니다.
PNG 는 모든 깊이를 지원하지는 않으며 1, 2,4,8, 16 만 지원합니다. 이러한 숫자가 아니면 깊이를 소프트웨어에 의해 조정해야 합니다.
예를 들어, 원래의 깊이는 5 였는데, 지금은 8 로 바꿔야 합니다. 즉, 확장되었습니다.
채널 깊이가 다르면 조정할 최대 깊이를 선택합니다.
이 깊이 변환은 가역적입니다.
다음과 같은 다섯 가지 유형이 있습니다.
여기서는 두 가지 방법을 사용하여 파스를 추출합니다.
첫 번째는 아무것도 하지 않는다는 것을 의미하는 빈 방법이다. 그렇다면 왜 이렇게 고지식하게 이것을 방법으로 계산하는가? ) 을 참조하십시오
두 번째 방법에서는 여러 번 스캔하여 7 개의 축소된 이미지를 얻습니다. Adam7 알고리즘입니다 (심화 학습이 아닌 Adam 알고리즘).
하지만 이 알고리즘은 국내 웹사이트에서 거의 찾을 수 없고 위키피디아 (HTTPS://EN.Wikipedia.org/Wiki/ADAM7 _ Algorithm) 에서도 잘 알려져 있지 않다. 그래서 저는 여기서 간단히 한 마디 하겠습니다.
위의 축소 그림 (물론 원래 그림은 빈 방법으로 읽음) 을 한 줄 한 줄 한 줄 한 줄 한 줄 읽어보세요. 위의 추출을 생산량으로 바꾸는 것과 같은 많은 조작이 있을 수 있다. ) 을 참조하십시오
필터 배열 앞에 작성할 몇 가지 필터 유형이 있습니다.
인코딩과 암호화입니다.
인코딩된 데이터를 하나 이상의 블록으로 나눕니다.
표준 PNG 파일은 각각 길이, 이름, 데이터 본문 및 검사 코드의 네 부분으로 구성된 여러 블록으로 구성됩니다.
표준 PNG 정의에는 사용자 블록을 추가할 수 있는 18 블록 유형이 있습니다.
이들 18 블록 유형은 다음과 같습니다.
주요 블록:
IHDR (이미지 헤더 헤더 헤더), PLTE (팔레트), IDAT (이미지 데이터 이미지 내용), IEND (이미지 끝 파일 끝) 입니다.
보조 블록:
투명 연관: 투명 정보
색상 종속성: chrm (색도와 흰색 점), 감마 (감마 감마 값), iCCP (포함된 ICC 프로파일 포함된 ICC 개요), sBIT (유효 비트), sRGB (표준 RGB 색상 공간).
텍스트 관련: iTXt (국제 텍스트 데이터 인터내셔널리제이션 텍스트), Text (텍스트 데이터 텍스트), zTXt(zip 텍스트 데이터 압축 텍스트).
시간 종속성: 시간 (마지막 수정 시간)
기타: bKGD (배경색), hIST (히스토그램), pHYs (물리적 픽셀 크기), sPLT (권장 팔레트),
전송 오류 또는 파일 손상으로 인해 데이터 스트림의 대부분 또는 전부가 손상될 수 있습니다. 구문 오류, 잘못된 블록 또는 누락된 블록입니다.
이 두 가지 오류 처리 방법을 구분해야 합니다.
ISO/IEC 또는 PNG 그룹에 관련 확장을 제출하고, 새 블록 유형 및 텍스트 키워드를 등록하고, 새로운 필터링 알고리즘, 인터레이스 모드 알고리즘 및 압축 알고리즘을 확장할 수 있습니다.
데이터 흐름의 이진 구조입니다.
모든 PNG 데이터 스트림의 처음 8 자는137 80 78 78 713102610 입니다.
Bytes 는 b'\x89PNG\r\n\x 1a\n' 을 나타냅니다
이 서명은 뒤의 데이터가 모두 PNG 데이터 스트림임을 나타냅니다. 만약 네가 빈 문자를 만나면, 그들을 방해하지 마라, 너는 IEND 가 필요하다.
각 모듈은 다음 네 부분으로 구성됩니다.
이름 규약을 통해 PNG 디코더는 현재 블록의 용도를 인식할 수 없을 때 이름을 통해 관련 정보를 얻을 수 있습니다.
블록 이름에는 네 개의 숫자가 있습니다.
첫 번째는 보조이고, 소문자는 이 블록이 보조임을 나타내고, 대문자는 이 블록이 관건임을 나타낸다.
두 번째 숫자는 개인을 나타내고, 소문자는 이 블록이 비공개이며, 국제 표준 정의가 없음을 나타내며, 크기는 앞서 언급한 18 블록 유형을 나타냅니다.
세 번째 자리는 예약비트이고, 소문자는 블록이 폐기되었음을 나타내고, 대문자는 사용할 수 있음을 나타냅니다. (미래의 확장에 동의하는 데 사용됨)
네 번째는 복제 보안을 나타냅니다. 즉, 그림을 편집할 때 PNG 편집기에 안전하지 않은 데이터 블록이 나타나면 완전히 복제되지 않고 선택적으로 복제됩니다. 대문자는 PNG 편집기가 문제 없이 완전히 복사될 수 있음을 의미합니다.
자세한 내용은 crc32 알고리즘을 참조하십시오.
PNG 이미지는 스트리밍될 수 있기 때문에 파일의 끝을 읽지 않고도 PNG 브라우저에서 미리 볼 수 있습니다.
따라서 이미지 내용을 읽기 전에 인덱스 팔레트와 같은 것을 준비해야 합니다.
이미 4.3 장을 쓴 것 같아요?
4.4 장에서 쓴 바와 같이 다섯 가지 색상 유형이 있습니다.
색상 유형은 IHDR 에 기록됩니다.
회색 모드에서 밝기는 감마, sRGB, iCCP 에 따라 달라집니다. 그렇지 않으면 기계에 따라 달라집니다.
색상 견본이 반드시 광선 강도에 비례하는 것은 아니며 감마를 설정하여 조정할 수 있습니다.
값은 처음에는 0 으로, 팔레트에 1, 트루 컬러+2, 투명 채널에 4 를 추가하여 계산됩니다. 회색조에서는 색인을 사용할 수 없습니다.
투명도는 투명 채널 사용, tRNS 블록으로 투명 색상 정보 설정, 색인의 tRNS 에 알파 테이블 설정, 투명 채널 또는 tRNS 를 사용하지 않고 완전히 불투명하게 표현하는 네 가지 방법으로 표현할 수 있습니다.
투명 채널의 샘플링 깊이는 8 과 16 이고 투명 채널은 픽셀에 저장되어 완전 투명 및 완전 불투명을 나타냅니다. 투명도는 이미지의 전경색과 배경색을 결합하는 데 사용됩니다.
일부 일반 사진에는 투명도가 포함되어 있지 않으며 픽셀 값에 투명도가 곱해져 검정 배경과의 합성 단계가 미리 수행됩니다. 하지만 파푸아뉴기니는 그렇게 하지 않습니다.
Integer (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+ 물론 오른쪽 이동 알고리즘도 있습니다.
Paeth 알고리즘은 먼저 인접한 세 픽셀 (왼쪽, 위, 왼쪽) 의 선형 값을 계산한 다음 계산된 값에 가장 가까운 인접 픽셀을 선택하여 다시 계산합니다. 캐시를 오버플로하지 않도록 주의하십시오. 기능은 다음과 같습니다.
위의 필터링과 마찬가지로 기본값은 방법 0 입니다. 이 두 개는 IHDR 에 표기되어 있다.
물론 여기서는 zlib 압축을 사용합니다. 기본 레벨은 8 이고 압축된 바이트는 32768 을 초과하지 않습니다.
이 검증 값은 PNG 블록의 검증 값과 다르므로 혼동해서는 안 된다.
여러 개의 필터링된 행을 하나의 zlib 데이터 스트림으로 압축하여 여러 PNG 블록에 배치하고 여러 PNG 블록을 압축 해제하여 하나의 zlib 데이터 스트림을 얻습니다.
물론 비동기식 읽기도 포함됩니다. Zlib 데이터 흐름 자체는 중단될 수 있으며, 중단된 경우에도 이전에 배열된 데이터를 읽을 수 있으므로 인터레이스 패턴을 해석할 수 있습니다. 따라서 위의 파이썬 메소드에 대해 다음과 같이 향상되었습니다.
연속적인 읽기, 읽기 및 해석을 설정합니다.
다음은 18 PNG 사양 블록에 대한 소개입니다.
IHDR 은 PNG 데이터 스트림의 첫 번째 부분입니다. 구성은 다음과 같습니다.
따라서 IHDR 의 블록 길이는 13 이며 변경되지 않습니다.
팔레트는 배열 [n] [3] 으로 볼 수 있는 2 차원 배열이며 색상은 index n 으로 표시됩니다.
따라서 N 은 256 을 초과하지 않으며 PLTE 블록의 길이도 3 의 배수입니다.
어떤 경우든 팔레트는 8 비트 깊이입니다. 이미지가 1, 2,4 인 경우에도 팔레트는 8 입니다.
모든 IDAT 블록이 하나로 결합되면 하나의 zlib 데이터 스트림이 됩니다. [10 압축 ](# 10 압축) 을 참조하십시오.
이 데이터는 비어 있으며 PNG 데이터 스트림이 끝났음을 나타냅니다. 물론이 블록이 손상되면 괜찮습니다.
이것은 투명도 정보를 나타내는 블록으로, 다음과 같은 세 가지 구성 요소가 있습니다.
[회색 음영 모드] (이 회색 음영과 같은 모든 색상은 투명하게 간주됩니다.)
트루 컬러 모드 (투명 색상은 이 세 값으로 표시됨)
인덱스 모드 (인덱스 모드에서 tRNS 는 알파 테이블에 해당하며 인덱스만큼 크며 인덱스의 투명도를 나타냅니다.)
그레이스케일 모드와 트루 컬러 모드가 2 바이트로 표시되는 이유는 무엇입니까? 16 비트 깊이에 적응해야 하기 때문에 인덱스 패턴의 깊이는 항상 8 보다 작습니다.
이 모듈은 CIE 색도 공간을 설정하는 데 사용됩니다. 구성은 다음과 같습니다.
저장된 값은 실제 값의 100000 배입니다.
CIE 색도 공간은 빨강, 녹색, 파랑, 흰색 네 점으로 구성된 근시 삼각형을 구성하여 색상 편차의 정도를 설정하는 2 차원 이미지입니다.
이 블록에는 부호 없는 int 하나만 저장되며, 실제 감마 값을 얻으려면 값을 100000 으로 나누어야 합니다.
이 블록은 ICC 설명을 설정하는 데 사용됩니다.
PNG 는 고정 깊이만 지원합니다. 원래 그림의 깊이와 일치하지 않으면 강제로 확대 축소되지만 원래 정보가 유지되고 원래 그림이 복원됩니다. 그래서 일반적으로 사용하지 않습니다. 왜 표준 이미지를 비표준 이미지로 변환합니까? ) 을 참조하십시오
채널 번호마다 sBIT 길이가 다릅니다.
SRGB 색상 공간을 사용하면 이제 ICC 에서 설명할 수 없습니다. SRGB 에는 렌더링 의도를 나타내는 부호 없는 바이트가 하나만 포함되어 있습니다.
이 값의 의미는 다음과 같습니다.
SRGB 를 사용할 때는 감마 및 cHRM 을 사용하는 것이 좋습니다. 일부 장치는 sRGB 를 지원하지 않으므로 호환 가능합니다.
다음은 문자 메시지에 사용되는 키워드입니다. 키워드는 사실 그다지 중요하지 않다. 단지 정의일 뿐, 스스로 바꿀 수 있다. 그러나 이미지 소프트웨어 표준을 통해 읽을 수 있습니다.
텍스트는 다음 구성 요소로 구성됩니다.
물론 여기 압축 방식도 0 입니다. zlib 를 사용하여 뒤의 데이터를 압축 해제합니다.
국제 텍스트 데이터가 좀 높다.
언어 유형은 RCF-3066, ISO 646 및 ISO 639 를 참조하십시오.
배경 색상.
히스토그램은 팔레트에 있는 각 색상의 대략적인 사용 빈도를 제공합니다.
PNG 브라우저에서 팔레트의 모든 색상을 제공할 수 없는 경우 막대 그래프를 사용하면 유사한 팔레트를 만들 수 있습니다.
물론 소프트웨어 없이는 전체 팔레트를 제공할 수 없습니다.
이 블록은 화면에 있는 픽셀의 실제 크기를 나타내는 데 사용됩니다. 구조는 다음과 같습니다.
두 개의 셀 설명이 있습니다. False 이면 블록이 실제 값이 아닌 종횡비만 나타냅니다. True 는 미터 단위로 되어 있습니다. 즉, 한 단위는 1 미터이고 1 미터는 몇 픽셀을 포함합니다.
특정 채널 길이는 샘플의 깊이에 따라 결정됩니다. 16 의 깊이는 2 이고, 8 보다 작거나 같으면 1 이다.
팔레트 이름은 대/소문자를 구분하며 키워드 매개 변수에 의해 제한됩니다.
회색 음영 PNG 이미지에서 각 대상의 빨강, 녹색, 파랑 및 파랑 값은 일반적으로 동일하지만 필수 사항은 아닙니다.
각 빈도 값은 실제 빈도가 아닌 이미지의 픽셀 비율에 비례합니다.
여기서 세계를 사용할 때 (UTC).
뒤의 공식은 너무 복잡해서 됐어, 솔직히 말해.