2011-07-21 45 views
8

Tôi đang cố gắng viết bộ giải mã và bộ giải mã JPEG/JFIF từ đầu bằng C. Tôi đã thử viết một tệp JPEG mẫu, nhưng có vẻ như tôi không thể mở nó bằng cách sử dụng MS paint, Firefox. Nhưng tôi có thể giải mã nó bằng cách sử dụng JPEGsnoop (http://www.impulseadventure.com/photo/jpeg-snoop.html?ver=1.5.2) và http://nothings.org/stb_image.c. Tôi nghĩ rằng tệp JPEG mẫu tuân theo chuẩn JPEG/JFIF, tôi không biết tại sao các ứng dụng như MS sơn và Firefox không thể mở nó.Câu hỏi định dạng tập tin jpeg

Sau đây là cách mẫu JPEG trông giống như:

 

    SOI 
     APP0 segment 
     DQT segment (contains two quantization tables) 
     COM segment 
     SOF0 segment 
     DHT segment (contains four Huffman tables) 
     SOS segment 
     huffman encoded data 
    EOI 

Các tập tin JPEG mẫu có ba thành phần Y Cb Cr. Không có subsampling cho thành phần Cb Cr. Hai bảng lượng tử hóa đều được lấp đầy. The Four bảng Huffman trong phân khúc DHT đều giống hệt nhau, nó trông như thế này

 

     [0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0] 
     [0,1,2, ... , 254] 

Điều đó có nghĩa là tất cả các mã 8bits, vì vậy mã hóa Huffman không thực sự nén dữ liệu.

Các dữ liệu được mã hóa Huffman trông như thế này:

 

     [0x0000(DC) 0x0000(AC)](Y) 
     [0x0000(DC) 0x0000(AC)](Cb) 
     [0x0000(DC) 0x0000(AC)](Cr) for all (i, j) MCUs except (10, 10) 

     the data in (10, 10) MCU: 
     [0x0008(DC) 0x0000(DC), 0x0000(AC)](Y) 
     [0x0000(DC) 0x0000(AC)](Cb) 
     [0x0000(DC) 0x0000(AC)](Cr) 

bất cứ ai có thể cho tôi biết những gì là sai với tập tin JPEG mẫu này? cảm ơn.

Dưới đây là một liên kết đến tệp mẫu JPEG (ha.jpg) http://www.guoxiaoyong.net/ha.jpg

+1

Bạn có thể cung cấp liên kết đến tệp ví dụ không? –

+0

tại sao phải đóng? Các poster đã làm rất nhiều công việc, rõ ràng hỏi các câu hỏi và giải thích những gì họ đang làm. –

Trả lời

4

Tôi đã có một vấn đề tương tự năm trước với một số mã PNG (mặc dù tôi đã không viết nó từ đầu). Hóa ra mã của tôi có nhiều tiêu chuẩn hơn so với các thư viện của Windows, một số trình duyệt, v.v. Họ đã làm tốt trong các trường hợp điển hình, nhưng bị nghẹt thở trên những hình ảnh bất thường và giả tạo, ngay cả khi chúng hoàn toàn phù hợp với tiêu chuẩn. Một cách phổ biến để truy cập chúng là sử dụng chiều rộng pixel lẻ cho hình ảnh. Gần một nửa bộ thử nghiệm của tôi không thể xem được bằng Windows. (Đây là nhiều phiên bản trước đây, như Windows 95. Các codec Windows đã được cải thiện đáng kể.)

Tôi đã kết thúc việc xây dựng thư viện PNG nguồn mở và sử dụng nó làm triển khai tham chiếu của tôi. Miễn là các hình ảnh mà mã của tôi tạo ra có thể được phân tích bằng cách thực hiện tham chiếu và ngược lại, tôi gọi nó là tốt. Tôi cũng đã kiểm tra xem mã của tôi có thể hiển thị bất kỳ hình ảnh nào mà Windows có thể hiển thị hay không. Mỗi khi tôi tìm thấy một lỗi, tôi đã thêm hình ảnh vào bộ thử nghiệm của mình trước khi tôi sửa nó. Đó là đủ tốt cho dự án của tôi.

Bạn có thể làm tương tự. Tôi tin rằng có một thư viện JPEG nguồn mở được sử dụng rộng rãi như là một triển khai tham chiếu.

Nếu bạn thực sự muốn tìm hiểu lý do Firefox (hoặc bất kỳ điều gì) không thể mở hình ảnh của bạn, bạn có thể thử bắt đầu bằng một hình ảnh mở trong Firefox. Tăng dần các thay đổi nhỏ (ví dụ: với trình chỉnh sửa hex) để làm cho nó giống như hình ảnh bị lỗi. Điều đó có thể giúp bạn thu hẹp khía cạnh nào của hình ảnh của bạn là vấp phải ứng dụng. Phải thừa nhận rằng, một số bước có thể khó thử.

0

Tôi cho rằng tệp của bạn rất được mã hóa độc đáo. Tôi khuyên bạn nên tìm một tệp tham chiếu và cố gắng bắt chước cấu trúc đó. Ngoài ra, tôi sẽ sử dụng các bảng mẫu từ tiêu chuẩn. Dữ liệu Huffman của bạn có đầy các số không làm cho mọi giá trị DC bằng 0, tiếp theo là và Kết thúc khối.

Nếu bạn nhìn vào jpegsnoop, hình ảnh của bạn có hai màu nhưng phải đồng nhất. Tôi đoán là bạn không có đủ dữ liệu để mã hóa hình ảnh ở độ phân giải mà bạn đã chỉ định. Tôi tin rằng rất nhiều bộ giải mã sẽ giả định rằng nó có nghĩa là tệp của bạn bị hỏng.

0

Firefox, (và nhiều ứng dụng khác AFAIK) được dựa trên thư viện JPEG nguồn mở từ Independent JPEG group.

Bạn có thể tải xuống nguồn này, sau đó xem chính xác lý do và thời điểm không thích tệp của bạn.

Ngoài ra, điều này sẽ giúp bạn tiết kiệm lại bánh xe :-)

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