2010-09-22 13 views
6

Có cách nào nhanh chóng để xác định xem một số tệp hình ảnh tùy ý có phải là tệp png hoặc tệp jpeg hoặc không có tệp nào trong số đó không?C++ - Phát hiện xem tệp có là PNG hay JPEG

Tôi khá chắc chắn có một số cách và những tệp này có thể có một số loại chữ ký của riêng chúng và có một số cách để phân biệt chúng.

Nếu có thể, bạn cũng có thể cung cấp tên của các thói quen tương ứng trong libpng/libjpeg/boost::gil::io.

Trả lời

2

Ngoài đề nghị Tim Yates' đọc những con số kỳ diệu "bằng tay", Boost GIL tài liệu nói:

  • png_read_image ném std::ios_base::failure nếu tệp không phải là tệp PNG hợp lệ.
  • jpeg_read_image ném std::ios_base::failure nếu tệp không phải là tệp JPEG hợp lệ.

Tương tự đối với các thói quen Boost GIL khác. Nếu bạn chỉ muốn loại, bạn có thể muốn thử chỉ đọc dimensions, thay vì tải toàn bộ tệp.

+0

Có một câu hỏi khác về SO nói jpeg_read_image không ném ngoại lệ. – jiggunjer

17

Nhìn vào số magic number ở đầu tệp. Từ trang Wikipedia:

Tệp hình ảnh JPEG bắt đầu bằng FF D8 và kết thúc bằng FF D9. Các tệp JPEG/JFIF chứa mã ASCII cho "JFIF" (4A 46 49 46) dưới dạng chuỗi bị chấm dứt null. Tệp JPEG/Exif chứa mã ASCII cho "Exif" (45 78 69 66) cũng như một chuỗi bị hủy, theo sau là siêu dữ liệu khác về tệp.

tập tin hình ảnh PNG bắt đầu với một chữ ký 8-byte trong đó xác định nội dung tập tin một tập tin PNG và cho phép phát hiện các vấn đề chuyển giao tập tin phổ biến: \ 211 P NG \ r \ n \ 032 \ n

3

Câu hỏi về cơ bản được trả lời bởi các câu trả lời ở trên, nhưng tôi nghĩ tôi sẽ thêm những điều sau: Nếu bạn cần xác định loại tệp ngoài "JPEG, PNG, khác", luôn có libmagic. Đây là những gì quyền hạn tiện ích Unix tập tin, đó là khá kỳ diệu thực sự, trên nhiều hệ điều hành hiện đại.