2012-06-19 70 views
11

Cố gắng hiểu định dạng PNG.Cố gắng trích xuất các giá trị pixel từ một hình ảnh PNG cụ thể

xem xét ảnh PNG này:

enter image description here

Các hình ảnh được lấy từ here

Trong Hex Editor, nó trông như thế này:

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 

ký tự tương đương:

‰PNG........IHDR...€...D.....Æ%ª>...ÂIDATx^íÔ..Ã[email protected]Ñ·4Ýÿÿo³tVê‰.l(sâª4I.‡ÖþØ{‰ 
»R.;‡þ..€[email protected] ....€[email protected] ...Ô^jdK”õ˜|Ñô’\\>Ïœ?sqX_¯ 
‹y[î–¶GëñêÑζãu;湕.ÇÎ.9ɯÆ3“{f7Ï«¿ùÉ/.€[email protected] ....€[email protected] ..Œ7Ûh. 
ûí–e....IEND®B`‚ 

Cùng được trình bày ở sau Ảnh chụp màn hình của HEX Editor:

enter image description here

Tôi cố gắng để thiết kế đối chiếu hình ảnh này để trích xuất các phần header và các giá trị pixel RGB. Tôi đọc về số PNG và cũng là here và cho đến nay tôi đã lưu ý những điều sau về Hình ảnh này:

Đoạn IHDR phải xuất hiện FIRST. Nó chứa:

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 

Dưới đây Tôi bắt đầu đọc dữ liệu HEX theo thứ tự:

1- Đầu tiên 8-byte: Đây là 8-Byte chữ ký

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

Tương tự như vậy là:% PNG như có thể thấy trong HEX Editor

Hình ảnh PNG hợp lệ phải chứa IHDR đoạn, một hoặc nhiều đoạn IDAT và đoạn IEND.

2- Chunk: Chiều dài

00 00 00 0D 

3-Chunk: Chunk Loại

49 48 44 52 

Đó là IHDR.

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

4- Chunk: Chiều rộng của hình ảnh (trong số thập phân 128)

00 00 00 80 

5- Chunk: Chiều cao của hình ảnh (trong số thập phân 68)

00 00 00 44 

6- Đoạn: BIT DEPTH (1 byte)

08 

7- Chunk: Loại Màu

02 

8- phương pháp nén

00 

9- phương pháp lọc:

phương pháp

10 Interlace:

00 

11- dữ liệu sau là gì?

C6 25 AA 3E 00 00 00 C2

12-- IDAT

13- dữ liệu này (sau khi IDAT) là gì:

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 00 00 00 00 00 00 00 00 00 00 00 00 00 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

14- IEND:

49 45 4E 44

15 Bài 4 byte

AE 42 60 82 

đây là những gì?

Một số người có thể giúp tôi hiểu, điểm 11, 13 và 15 ở trên không? Và giá trị Pixel ở đâu? Image là có (128 x 68 pixel)

Mục đích của việc biết những chi tiết này:

Khi tôi biết những chi tiết này, tôi sẽ tạo ra 16 bit PNG hình ảnh của riêng tôi. Tôi đã có giá trị pixel, vì vậy công việc của tôi sẽ là giới thiệu tiêu đề, v.v.
Tôi không biết liệu có phần mềm nào có thể thực hiện công việc này hay không.

CẬP NHẬT

Tôi hiểu bây giờ bởi vì nén, tôi sẽ không thể xác định vị trí các giá trị pixel.

Tôi có ý tưởng rằng tôi có thể viết một tệp trong OpenCV và lưu nó dưới dạng png. Giờ thì câu hỏi trực tiếp của tôi là: Tôi có một tệp nhị phân có giá trị 16 bit pixel màu xám. Tôi có thể viết điều này trong OpenCV dưới dạng PNG 16 bit không?

Trả lời

3

Mặc dù có thể thú vị khi biết về hình ảnh PNG thực sự là gì và cách hình ảnh thực sự được thể hiện trong tệp, bạn không cần biết điều này để tạo tệp PNG.

Lưu ý rằng PNG sử dụng nén không mất dữ liệu, điều đó có nghĩa là bạn sẽ không nhận được hai byte cho mỗi pixel.

Bạn có thể tạo hình ảnh của mình trong một chương trình và xuất nó ở định dạng PNG bằng cách sử dụng nhiều thư viện có ở đó. Ví dụ: bạn có thể tạo hình ảnh của mình trong OpenCV và sau đó xuất nó bằng imWrite. Một trong các tham số có thể làm cho nó xuất ra PNG.


Nếu bạn có giá trị pixel 16 bit màu xám, thì bạn có thể đặt chúng vào Mat.

Sau đó chuyển đổi đó để một IplImage: Converting cv::Mat to IplImage*

Sau đó, bạn có thể xuất nó vào một tập tin.

+0

Tôi vừa nhận thấy về Nén, vì vậy tôi không thể nhận được các giá trị Pixel chính xác. Nhưng bạn có thể cho tôi biết khoảng 11 và 15 không? – gpuguy

+0

Cảm ơn, câu trả lời của bạn rất hữu ích đối với tôi. Tôi sẽ kiểm tra nó và sau đó đăng kết quả. – gpuguy

+3

+1 Nhưng tôi không hoàn toàn đồng ý với "Bạn chỉ lãng phí thời gian của bạn". Việc tìm hiểu về các phần bên trong của PNG có thể không cần thiết cho công việc hiện tại của bạn, nhưng nó vẫn là học tập. – leonbloy

3

Chỉ cần cho đầy đủ (trả lời eboix là ngay tại chỗ)

11- dữ liệu sau là gì?

C6 25 AA 3E 00 00 00 C2

Mỗi đoạn kết thúc bằng một CRC (4 byte), và bắt đầu với 4 byte mà nói chiều dài của nó. Vì vậy, C6 25 AA 3E là CRC của đoạn trước đó (IHDR) và 00 00 00 C2 (194) là chiều dài của đoạn (IDAT) sau.

Tương tự, 4 byte cuối cùng là CRC của đoạn IEND.

3

Tôi không nhìn quá cẩn thận nhưng nhìn vào cấu trúc ...

Q11. C6 25 AA 3E = CRC32 00 00 00 C2 = Kích thước của đoạn tiếp theo

Q13. kiểm tra thông số png bạn đã nói đến trước đó trông giống như đoạn IDAT mà bạn đã biết nén áp dụng cho nó!

Q15. AE 42 60 82 = CRC32

Các vấn đề liên quan