2012-06-19 4 views
11

PNG 형식을 이해하려고합니다.주어진 PNG 이미지에서 픽셀 값을 추출하려고합니다.

89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 00 00 00 80 00 00 00 44 08 02 00 00 00 
C6 25 AA 3E 00 00 00 C2 49 44 41 54 78 5E ED D4 81 06 C3 30 14 40 D1 B7 34 DD FF FF 6F 
B3 74 56 EA 89 12 6C 28 73 E2 AA 34 49 03 87 D6 FE D8 7B 89 BB 52 8D 3B 87 FE 01 00 80 
00 00 10 00 00 02 00 40 00 00 08 00 00 01 00 20 00 00 04 00 80 00 00 10 00 00 02 00 40 
00 00 08 00 00 01 00 20 00 00 00 D4 5E 6A 64 4B 94 F5 98 7C D1 F4 92 5C 5C 3E CF 9C 3F 
73 71 58 5F AF 8B 79 5B EE 96 B6 47 EB F1 EA D1 CE B6 E3 75 3B E6 B9 95 8D C7 CE 03 39 
C9 AF C6 33 93 7B 66 37 CF AB BF F9 C9 2F 08 80 00 00 10 00 00 02 00 40 00 00 08 00 00 
01 00 20 00 00 04 00 80 00 00 10 00 00 02 00 40 00 00 08 00 00 01 00 20 00 00 8C 37 DB 
68 03 20 FB ED 96 65 00 00 00 00 49 45 4E 44 AE 42 60 82 

등가 자 :

이미지는 16 진수 편집기에서 here

에서 가져

enter image description here

, 그것은 다음과 같습니다

이 PNG 이미지를 고려

동일한 823,436,983,210는 HEX 편집기 스크린을 아래에 도시된다 : I은 헤더 부와 RGB의 화소 값을 추출하기 위해 화상을 리버스 엔지니어링하는 것을 시도하고

enter image description here

. 내가 PNG에 대해서도 here에 대해 읽었으며 지금까지이 이미지에 대해 다음과 같이 언급했습니다.

IHDR 청크는 반드시 FIRST로 나타나야합니다. 그것은 포함

Width:    4 bytes 
Height:    4 bytes 
Bit depth:   1 byte 
Color type:   1 byte 
Compression method: 1 byte 
Filter method:  1 byte 
Interlace method: 1 byte 

나는 순서대로 HEX 데이터를 읽기 시작하고 아래 :

1 최초의 8 바이트 :이 8 바이트 서명

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

에게 있습니다 HEX 편집기에서 볼 수있는 % PNG

올바른 PNG 이미지에는 IHDR이 있어야합니다. 청크, 하나 이상의 IDAT 청크 및 IEND 청크가 있습니다.

2 덩어리 : 길이

00 00 00 0D 

3 덩어리 : 청크 유형 IHDR입니다

49 48 44 52 

.

http://www.w3.org/TR/PNG-Chunks.html

4- 청크 : 이미지의 폭 (십진수 128)

00 00 00 80 

-5- 청크 : 이미지의 높이 (68 진수)

00 00 00 44 

6- 청크 : 비트 깊이 (1 바이트)

08 

7- 덩어리 : 색상 유형

02 

8 압축 방법

00 

9 필터 방법 :

00 

10 인터레이스 방식 : 다음 데이터 무엇

00 

11-?

C6 3E AA 25 00 00 00 C2

12-- IDAT

49 44 41 54

13- (IDAT 후)이 데이터 란 :

78 5E ED D4 81 06 C3 30 14 40 D1 B7 34 DD FF FF 6F B3 74 56 EA 89 12 6C 28 73 E2 AA 34 49 03 87 D6 FE D8 7B 89 BB 52 8D 3B 87 FE 01 00 80 00 00 10 00 00 02 00 40 00 00 08 00 00 01 00 20 00 00 04 00 80 00 00 10 00 00 02 00 40 00 00 08 00 00 01 00 20 00 00 00 D4 5E 6A 64 4B 94 F5 98 7C D1 F4 92 5C 5C 3E CF 9C 3F 73 71 58 5F AF 8B 79 5B EE 96 B6 47 EB F1 EA D1 CE B6 E3 75 3B E6 B9 95 8D C7 CE 03 39 C9 AF C6 33 93 7B 66 37 CF AB BF F9 C9 2F 08 80 00 00 10 00 00 02 00 40 00 00 08 00 00 01 00 20 00 00 04 00 80 00 00 10 00 00 02 00 40 00 00 08 00 00 01 00 20 00 00 8 C 37 68 03 20 DB FB ED 96 65 00 00 00 00

14- IEND :

49 45 44 4E

15 마지막 4 바이트

AE 42 60 82 

다음은 무엇입니까?

위의 11, 13 및 15 점을 이해할 수 있습니까? 픽셀 값은 어디에 있습니까? 나는이 세부 사항을 알고 나면

, 나는 내 자신의 16 비트 PNG 이미지를 생성합니다 : 이미지는 (128 X 68 픽셀) 이러한 세부 사항을 알 수

목적 가지고있다. 나는 이미 픽셀 값을 가지고 있으므로 머리말 등을 소개하는 것이 내 일일 것이다.
이 작업을 수행 할 수있는 소프트웨어가 있는지는 잘 모른다.

내가 때문에 압축의 지금 이해 UPDATE, 나는 픽셀 값을 찾을 수 없을 것입니다.

OpenCV에서 파일을 작성하고 png로 저장할 수 있다는 생각이 들었습니다. 글쎄 지금 내 직접 질문 : 나는 그레이 스케일 16 비트 픽셀 값을 가지고 이진 파일이 있습니다. 이 OpenCV 16 비트 PNG로 쓸 수 있습니까?

답변

3

PNG 이미지가 실제로 무엇인지, 이미지가 실제로 파일에 표시되는 방법을 배우는 것은 흥미로울 수도 있지만 PNG 파일을 생성하기 위해 이것을 알 필요가 없습니다.

PNG는 무손실 압축을 사용하므로 픽셀 당 2 바이트를 얻지 못합니다.

프로그램에서 이미지를 생성하고 거기에있는 많은 라이브러리를 사용하여 PNG 형식으로 출력 할 수 있습니다. 예를 들어, OpenCV에서 이미지를 만든 다음 imWrite으로 출력 할 수 있습니다. 매개 변수 중 하나는 PNG로 출력 할 수 있습니다. 당신은 그레이 스케일 16 비트 픽셀 값이있는 경우


, 당신은 그들은 Mat에 넣을 수 있습니다.

그런 다음 IplImage에 그 변환 : Converting cv::Mat to IplImage*

그럼 당신이 할 수있는 파일로 출력이.

+0

방금 ​​Compression에 대해 알아 봤지만 정확한 픽셀 값을 얻지 못했습니다. 하지만 11과 15에 대해서 말해 줄 수 있어요? – gpuguy

+0

감사합니다, 당신의 대답은 나에게 매우 도움이됩니다. 나는 그것을 테스트하고 결과를 게시 할 것입니다. – gpuguy

+3

+1하지만 "너는 방금 시간 낭비했다"는 말에는 완전히 동의하지 않는다. 그럼에도 불구하고 PNG의 내부에 대해 배우는 것이 현재 작업에는 필요하지 않을 수도 있습니다. – leonbloy

3

그냥 완전성에 대한

11 - 다음 데이터 란 (eboix의 대답은 그 자리에 적합한)?

C6 3E AA 25 00 00 00 C2

각 청크는 CRC (4 바이트)가 종료되고, 그 길이 말해 4 바이트로 시작한다. 따라서 C6 25 AA 3E은 이전 청크 (IHDR)의 CRC이고 00 00 00 C2 (194)는 다음 (IDAT) 청크의 길이입니다.

마찬가지로, 마지막 4 바이트는 IEND 청크의 CRC입니다.

3

너무 신중하게 보지 않았지만 구조를 보면서 ...

Q11. C6 25 AA 3E = CRC32 00 00 00 C2 = 다음 청크의 크기

Q13. 이전에 언급 한 png 스펙을 확인하십시오. IDAT 체크는 이미 적용된 압축을 알고 있습니다.

15. AE 42 60 82 = CRC32

관련 문제