PNG(Portable Network Graphics)란?
비손실 그래픽 파일 포맷, GIF 파일에서 사용되는 L2W 데이터 압축 알고리즘이 특허가 걸려 자유롭게 사용이 불가능해지자 유니시스(미국IT기업)가 자유롭게 쓸 수 있는 PNG 포맷을 개발하였다.
파일 헤더(시그니처)
89 50 4E 47 0D 0A 1A 0A
◆ 통신 등 8비트 데이터를 지원하지 않는 시스템을 찾거나, 텍스트 파일과 구별하기 위해 사용
◆ ASCII 코드로 “PNG”, 16진수 편집기에서 구별하기 위해 사용
◆ DOS에서 TYPE 명령을 사용하였을때 출력을 멈추기 위해 사용 (EOF문자)
◆ Unix-style 줄바꿈으로. UniX-DOS 변환에서 줄바꿈시에 사용
PNG 파일 청크
헤더 뒤에는 이미지 내용을 담고 있는 청크가 온다. 청크는 아래와 같이 길이, 청크타입(이름),청크데이터,CRC 4가지로 구성된다.

청크타입(이름)이 대문자로 시작하면 중요 청크, 소문자로 시작하면 보조청크다.
중요 청크 : IHDR, IDAT, PLET, IEND
보조 청크 : tRNS, CHRM, gAMA, iCCP, sBIt, sRGB,iEXT ··· 등 수십개
IHDR
PNG파일 가장 앞에 오는 청크, PNG파일의 기본 정보를 저장한다.

IHDR 청크 데이터 내용
IHDR 청크 데이터는 항상 13바이트이며 아래와 같은 내용을 가지고 있다.
width(가로, 4byte), height(세로, 4byte), Bit depth(한 픽셀이 차지하는 비트 양, 1byte),
Color Type(색의 유형, 1byte)*, Compression method(압축방법, 1byte),
Filter method(필터링 방식,1byte), interlace method(인터레이스 이용유무,1byte)**
*

** 인터레이스 메소드란 웹페이지 등 이미지를 표시할 때 이미지 로딩이 완료되기전 해상도가 낮은 이미지를 보여주기 위해 사용됨, (0 인터레이스 미사용, 1 Adam7 인터레이스 사용)
IDAT
실제 이미지 데이터가 들어가는 부분, 여러개의 IDAT가 존재할 수도 있으며 IDAT가 여러개인 경우 모든 IDAT가 다 있어야 정상 출력이 가능하다

IDAT 청크 데이터 내용
IDAT 이미지 데이터 블럭 , 마지막 블럭 유무 (1byte) , Little-endian 블럭 크기 (2byte),
PNG 이미지데이터(크기 가변), 필터 (1byte), IDAT 이미지 데이터 블럭
PLET
IHDR에서 color type이 indexed color일 경우 필요한 청크, 팔레트 범위를 지정해주는 청크다.

PLET 청크 데이터 내용
0번 팔레트 RGB 값 {Red(1byte),Green(1byte),Blue(1byte)}
1번 팔레트 RGB 값 {Red(1byte),Green(1byte),Blue(1byte)}
2번 팔레트 RGB 값 {Red(1byte),Green(1byte),Blue(1byte)}
··· 반복
+ {}안에 들어가는 값 (0=Black, 255=Red), (0=Black, 255=Green), (0=Black, 255=Blue)
0이면 검정 255에 가까울수록 각 원래의 색(R,G,B)가 나온다
IEND
이미지 파일의 끝을 표시하는 청크

단순히 파일의 끝을 알리는 청크이기 때문에 청크데이터가 없으며, 항상 0바이트이다.
보조 청크 한줄 설명(자세한 설명을 보고 싶으면 www.w3.org/TR/png 으로…)
tRNS : IHDR에서 색의 유형이 indextype 일 경우 사용되는 청크, 투명색을 지정한다
cHRM : 빨간색의 CIE 1931 x,y 색도 공간을 지정하는데 사용 (CIE 1931 위키백과 링크)
gAMA : 감마 값을 지정
iCCP : 해당 청크가 있을경우 ICC/ISO_150761-1에서 정의한 ICC 색범위를 사용
sbit : 원래의 유효 비트 수를 정의한다
sRGB : 해당 청크가 있을 경우 SRGB 색범위를 사용
cICP : 사진 디코더가 이미지를 랜더링 할때 필요한 함수를 저장하는 청크
mDCV : 사진을 랜더링(출력)할때 디스플레이에서 필요한 메타데이터를 저장
cLLi : 특정 디스플레이에서 톤 매핑을 위해 사용하는 청크
tEXt: 텍스트 데이터를 저장하는 청크
zTXT : tEXt 청크와 기능은 동일하나 텍스트를 압축할때 사용하는 청크
iTxt : 국제 텍스트 데이터 (UTF-8)을 사용하는 텍스트를 저장할때 사용
bKGD : 이미지를 표시 할 때 기본 배경색을 지정하는 청크
hIST : 팔레트에 있는 각 색상의 대략적인 사용빈도를 알려주는 청크
pHYs : 이미지 표시를 위해 의도적으로 지정한 픽셀 크기 또는 비율을 저장하는 청크
sPLT : 사진 출력을 위해 디코더에게 팔레트 관련으로 제한하는 청크 (제한이라 무시될 수도 있음)
eXIF : 카메라가 촬영하는 시간, 위치 등 메타데이터를 저장하는 청크
tIME : 이미지 최종 수정 시간을 기록하는 청크
애니메이션(움직이는) PNG 관련 청크
acTL : 해당 이미지가 애니메이션(움직이는) 사진임을 선언하는 청크
fcTL : 프레임에 관한 메타데이터 청크
fdat : 각 프레임의 실제 데이터가 들어가 있는 청크
참고 문서
https://mineeeee.tistory.com/m/entry/PNG-파일구조
https://yooniia.tistory.com/m/48
https://bgm2020.tistory.com/5
https://ko.m.wikipedia.org/wiki/PNG
https://m.blog.naver.com/PostView.naver?blogId=gnsehfvlr&logNo=220733132744&proxyReferer=&noTrackingCode=true
https://www.w3.org/TR/PNG-Chunks.html