현재 위치: > 최신 기사 목록> PNG 파일 헤더 : pack () + 파일 구조 분석

PNG 파일 헤더 : pack () + 파일 구조 분석

M66 2025-05-28

이미지 처리 분야에서 PNG (휴대용 네트워크 그래픽)는 널리 사용되는 무손실 압축 이미지 형식입니다. 파일 구조에는 각각의 특정 이미지 또는 메타 데이터 정보가 포함 된 여러 "청크"를 포함하여 명확한 사양이 있습니다. 이러한 구조를 이해하면 맞춤형 이미지 처리 도구를 개발하는 데 도움이 될뿐만 아니라 이진 데이터 운영 및 프로토콜 설계 학습에 큰 도움이 될 수 있습니다.

이 기사는 PHP의 Pack ()Unpack () 함수를 통해 PNG 파일의 헤더를 수동으로 구문 분석하고 해당 구조를 분석합니다. PHP는 웹 기반 언어이지만 이진 데이터를 처리하는 데 우수한 능력을 가지고 있습니다.

1. PNG 파일 구조의 개요

합법적 인 PNG 파일은 8 바이트 고정 서명으로 시작해야합니다.

 89 50 4E 47 0D 0A 1A 0A

다음은 하나 이상의 블록 (청크)이며 각 부분은 다음 부분으로 구성됩니다.

  • 길이 (4 바이트) - 데이터 부분의 길이

  • 블록 유형 (4 바이트) - 예를 들어 IHDR, IDAT, IEND 등과 같은 등.

  • 블록 데이터 (변수)

  • CRC 확인 (4 바이트)

2. PNG 파일 헤더를 구문 분석하려면 PHP를 사용하십시오

다음 예제 코드는 PNG 파일의 첫 번째 몇 바이트를 읽고 파일 헤더와 첫 번째 블록 (일반적으로 IHDR)을 추출합니다.

 <?php
$filename = 'https://m66.net/sample.png';

// 파일을 읽기 전에 33 바이트:8 바이트징후 + 4+4+13+4(IHDR 총 블록 길이)
$data = file_get_contents($filename, false, null, 0, 33);

if ($data === false || strlen($data) < 33) {
    die("읽을 수 없습니다 PNG 파일 또는 파일이 너무 작습니다。");
}

// 분석 PNG 징후
$signature = substr($data, 0, 8);
$expectedSignature = "\x89PNG\r\n\x1a\n";

if ($signature !== $expectedSignature) {
    die("이것은 유효한 것이 아닙니다 PNG 문서。");
}

echo "PNG 징후验证成功。\n";

// 분석第一个 Chunk(해야합니다 IHDR)
$chunkData = substr($data, 8);

// 사용 unpack 필드 추출
$unpacked = unpack("Nlength/A4type", substr($chunkData, 0, 8));
$length = $unpacked['length'];
$type = $unpacked['type'];

echo "첫 번째 블록 유형: $type\n";
echo "데이터 길이: $length\n";

// 발췌 IHDR 데이터
$ihdrData = substr($chunkData, 8, 13);

$ihdr = unpack("Nwidth/Nheight/CbitDepth/CcolorType/Ccompression/Cfilter/Cinterlace", $ihdrData);

echo "너비: {$ihdr['width']} px\n";
echo "높은: {$ihdr['height']} px\n";
echo "깊은: {$ihdr['bitDepth']}\n";
echo "색상 유형: {$ihdr['colorType']}\n";
echo "압축 방법: {$ihdr['compression']}\n";
echo "필터 방법: {$ihdr['filter']}\n";
echo "인터레이스 스캔: {$ihdr['interlace']}\n";
?>

3. 주요 기능 설명

짐 등에서 꺼내다()

Unpack ()는 이진 데이터를 PHP 배열로 구문 분석하는 데 사용됩니다. 형식 문자열을 사용하여 각 필드의 유형과 순서를 설명합니다. 예를 들어:

 unpack("Nlength/A4type", $binary);
  • nlength

  • a4type는 고정 길이 (4 바이트)의 ASCII 문자열 을 읽는 것을 의미합니다.

팩()

대신 Pack ()는 변수를 이진 형식으로 패키지 할 수 있습니다. 예를 들어, PNG 파일 헤더를 포장 할 때 다음을 사용할 수 있습니다.

 $signature = pack("C8", 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A);

이것은 PNG 파일 생성을 사용자 정의 할 때 매우 유용합니다.

4. 고급 분석

후속 PNG 블록 (예 : IDAT, iend 등)을 계속 구문 분석하려면 다음과 같이 각 블록을 루프합니다.

  1. 8 바이트 읽기 : 4 바이트 길이 + 4 바이트 유형

  2. 길이에 따라 해당 데이터 필드를 읽으십시오

  3. 4 바이트 CRC 확인을 건너 뜁니다

  4. Iend가 발생할 때까지 다음 블록을 계속 읽으십시오.

이 분석 방법은 또한 투명성 (TRN), 컬러 팔레트 (PLTE) 및 기타 블록과 같은보다 복잡한 PNG 특성에도 적용될 수 있습니다.

V. 결론

PHP의 Unpack ()Pack () 함수를 사용하면 PNG 파일을 낮은 수준의 방식으로 쉽게 구문 분석하고 기본 구조를 이해할 수 있습니다. 이 기술은 이미지 형식에 대한 심층적 인 이해, 맞춤형 이미지 처리 도구 작성 또는 관련 보안 도구를 개발하는 데 매우 유용합니다. 이러한 기술을 습득하면 매일 PHP 개발에서 더 편안하게 만들 수 있습니다.