Cách lấy thuộc tính hình ảnh trong Python

Việc sử dụng hàng loạt điện thoại thông minh — về cơ bản là máy tính di động, giàu cảm biến, nhận biết vị trí, luôn kết nối mạng — đã mang đến cho chúng ta hai hậu quả lớn mà tác động của chúng đối với quyền riêng tư và bảo mật vẫn chưa được hiểu đầy đủ

Show
  1. Nhiều người hơn bao giờ hết có một chiếc máy ảnh thường nằm trong tầm tay
  2. Theo mặc định, ảnh được chụp bằng các máy ảnh này có thể tiết lộ thông tin nhạy cảm và nhiều người dùng không biết rằng điều đó đang xảy ra

Ngoài dữ liệu ảnh, ảnh chụp bằng điện thoại thông minh và máy ảnh kỹ thuật số hiện đại còn chứa siêu dữ liệu, đây là thông tin bổ sung về ảnh. Siêu dữ liệu này được lưu trữ ở định dạng có tên EXIF, viết tắt của định dạng Tệp hình ảnh có thể thay đổi, là tiêu chuẩn liên tục phát triển cho thông tin được thêm vào bản ghi âm và hình ảnh kỹ thuật số

Trong ảnh, EXIF ​​có thể bao gồm các thông tin như

  • Kích thước và mật độ pixel của ảnh
  • Kiểu dáng và kiểu dáng của thiết bị được sử dụng để chụp ảnh
  • Thu phóng, khẩu độ, đèn flash và các cài đặt máy ảnh khác khi chụp ảnh
  • Hướng của thiết bị khi chụp ảnh
  • Khi bức ảnh được chụp
  • Bức ảnh được chụp ở đâu
  • Camera quay về hướng nào
  • Độ cao mà ảnh được chụp

Siêu dữ liệu này hữu ích cho việc sắp xếp, lập danh mục và tìm kiếm thông qua ảnh, đó là lý do tại sao tiêu chuẩn EXIF ​​​​được xác định. Tuy nhiên, nó cũng đưa ra những lo ngại về quyền riêng tư và bảo mật mà nhiều người dùng không tính đến

Một trong những câu chuyện cảnh báo sớm nhất về EXIF ​​là sự cố quyền riêng tư năm 2012 liên quan đến người sáng lập công ty chống vi-rút John McAfee. Đây là khoảng thời gian thú vị trong cuộc đời của McAfee, khi anh trốn tránh cơ quan thực thi pháp luật trong khi vẫn trả lời phỏng vấn độc quyền, được săn đón nhiều cho các nhà báo. Một nhà báo may mắn được phỏng vấn đã quyết định thể hiện sự may mắn của mình bằng cách đăng một bức ảnh của McAfee mà không xóa dữ liệu EXIF ​​của nó trước. Dữ liệu đó đã cho biết vị trí của anh ta và dẫn đến việc anh ta bị bắt

Bạn có thể biết nhiều câu chuyện gần đây về việc cơ quan thực thi pháp luật đã bắt giữ những kẻ tình nghi sử dụng ảnh được đăng lên một trang web truyền thông xã hội mà không đề phòng "xóa" dữ liệu EXIF ​​của họ trong quá trình tải lên

Tôi nghi ngờ bạn là nhà phát triển có ý thức bảo mật, có lẽ bạn đang tự hỏi mình những câu hỏi như thế này

  • Làm cách nào tôi có thể lập trình phát hiện và đọc siêu dữ liệu EXIF ​​​​từ ảnh?
  • Làm cách nào tôi có thể thay đổi, thêm hoặc xóa siêu dữ liệu EXIF ​​theo chương trình?

Nếu bạn có Python 3. 6 trở lên được cài đặt trên máy tính, bạn có thể tìm hiểu qua các bài tập thực hành bên dưới. Chúng sẽ bao gồm một số gói Python mà bạn có thể kết hợp vào ứng dụng của mình để trích xuất, thêm, thay đổi hoặc xóa dữ liệu EXIF ​​​​khỏi ảnh. Trên đường đi, bạn sẽ không chỉ sử dụng các kỹ năng lập trình của mình mà còn thực hiện một số công việc thám tử.

Mô-đun exif

Có một số mô-đun Python có thể truy cập dữ liệu EXIF ​​​​trong ảnh kỹ thuật số. Đối với bài viết này, chúng tôi sẽ tập trung vào exif. API của nó rất Pythonic đến nỗi nó gần như là một phần của ngôn ngữ chứ không phải là một mô-đun

Để cài đặt exif, hãy sử dụng

image_members = []

for image in images:
    image_members.append(dir(image))

for index, image_member_list in enumerate(image_members):
    print(f"Image {index} contains {len(image_member_list)} members:")
    print(f"{image_member_list}\n")
6 bằng cách nhập thông tin sau vào dòng lệnh

pip install exif

Nếu việc nhập lệnh này cho bạn thông báo lỗi, hãy thử sử dụng lệnh

image_members = []

for image in images:
    image_members.append(dir(image))

for index, image_member_list in enumerate(image_members):
    print(f"Image {index} contains {len(image_member_list)} members:")
    print(f"{image_member_list}\n")
7 để thay thế.
image_members = []

for image in images:
    image_members.append(dir(image))

for index, image_member_list in enumerate(image_members):
    print(f"Image {index} contains {len(image_member_list)} members:")
    print(f"{image_member_list}\n")
8 là phiên bản của
image_members = []

for image in images:
    image_members.append(dir(image))

for index, image_member_list in enumerate(image_members):
    print(f"Image {index} contains {len(image_member_list)} members:")
    print(f"{image_member_list}\n")
6, trình quản lý gói Python, dành riêng cho Python 3

Nếu bạn không duy trì bất kỳ mã Python 2 nào nhưng phải sử dụng

image_members = []

for image in images:
    image_members.append(dir(image))

for index, image_member_list in enumerate(image_members):
    print(f"Image {index} contains {len(image_member_list)} members:")
    print(f"{image_member_list}\n")
8 để cài đặt các gói Python, thì bạn nên cân nhắc nâng cấp bản cài đặt Python của mình

Đang tải ảnh và kiểm tra chúng để tìm dữ liệu EXIF

Hãy làm cho exif hoạt động. Hãy xem xét hai bức ảnh này, được đặt tên là cây cọ 1. jpg và cây cọ 2. jpg

Giả sử bạn đã được hỏi những câu hỏi này

  1. Những bức ảnh này được chụp trên cùng một thiết bị hay hai thiết bị khác nhau?
  2. Bức ảnh nào được chụp đầu tiên?
  3. Những bức ảnh này được chụp ở đâu?

Để trả lời những câu hỏi này, chúng tôi sẽ tải dữ liệu từ các tệp ảnh này vào các đối tượng exif

Image 0 contains 53 members:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'color_space', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'digital_zoom_ratio', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_datestamp', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'light_source', 'make', 'max_aperture_value', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']

Image 1 contains 68 members:
['<unknown EXIF tag 316>', '<unknown EXIF tag 322>', '<unknown EXIF tag 323>', '<unknown EXIF tag 42080>', '_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_dest_bearing', 'gps_dest_bearing_ref', 'gps_horizontal_positioning_error', 'gps_img_direction', 'gps_img_direction_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'gps_speed', 'gps_speed_ref', 'has_exif', 'lens_make', 'lens_model', 'lens_specification', 'make', 'maker_note', 'metering_mode', 'model', 'offset_time', 'offset_time_digitized', 'offset_time_original', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'scene_type', 'sensing_method', 'shutter_speed_value', 'software', 'subject_area', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
1 và sau đó sử dụng các đối tượng đó để kiểm tra siêu dữ liệu EXIF

from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]

Mã mở từng tệp dưới dạng chỉ đọc. Nó đọc dữ liệu của tệp ở định dạng nhị phân thành một đối tượng tệp, sau đó nó sử dụng để khởi tạo một đối tượng exif

Image 0 contains 53 members:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'color_space', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'digital_zoom_ratio', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_datestamp', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'light_source', 'make', 'max_aperture_value', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']

Image 1 contains 68 members:
['<unknown EXIF tag 316>', '<unknown EXIF tag 322>', '<unknown EXIF tag 323>', '<unknown EXIF tag 42080>', '_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_dest_bearing', 'gps_dest_bearing_ref', 'gps_horizontal_positioning_error', 'gps_img_direction', 'gps_img_direction_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'gps_speed', 'gps_speed_ref', 'has_exif', 'lens_make', 'lens_model', 'lens_specification', 'make', 'maker_note', 'metering_mode', 'model', 'offset_time', 'offset_time_digitized', 'offset_time_original', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'scene_type', 'sensing_method', 'shutter_speed_value', 'software', 'subject_area', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
1. Cuối cùng, nó đặt các đối tượng
Image 0 contains 53 members:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'color_space', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'digital_zoom_ratio', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_datestamp', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'light_source', 'make', 'max_aperture_value', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']

Image 1 contains 68 members:
['<unknown EXIF tag 316>', '<unknown EXIF tag 322>', '<unknown EXIF tag 323>', '<unknown EXIF tag 42080>', '_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_dest_bearing', 'gps_dest_bearing_ref', 'gps_horizontal_positioning_error', 'gps_img_direction', 'gps_img_direction_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'gps_speed', 'gps_speed_ref', 'has_exif', 'lens_make', 'lens_model', 'lens_specification', 'make', 'maker_note', 'metering_mode', 'model', 'offset_time', 'offset_time_digitized', 'offset_time_original', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'scene_type', 'sensing_method', 'shutter_speed_value', 'software', 'subject_area', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
1 vào một mảng để chúng ta có thể lặp lại chúng, thực hiện các thao tác tương tự trên siêu dữ liệu EXIF ​​của mỗi ảnh

Hãy thực hiện thao tác đầu tiên của chúng tôi trên mỗi bức ảnh. xác nhận rằng chúng thực sự chứa dữ liệu EXIF. Chúng tôi sẽ làm điều này bằng cách kiểm tra từng thuộc tính

Image 0 contains 53 members:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'color_space', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'digital_zoom_ratio', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_datestamp', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'light_source', 'make', 'max_aperture_value', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']

Image 1 contains 68 members:
['<unknown EXIF tag 316>', '<unknown EXIF tag 322>', '<unknown EXIF tag 323>', '<unknown EXIF tag 42080>', '_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_dest_bearing', 'gps_dest_bearing_ref', 'gps_horizontal_positioning_error', 'gps_img_direction', 'gps_img_direction_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'gps_speed', 'gps_speed_ref', 'has_exif', 'lens_make', 'lens_model', 'lens_specification', 'make', 'maker_note', 'metering_mode', 'model', 'offset_time', 'offset_time_digitized', 'offset_time_original', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'scene_type', 'sensing_method', 'shutter_speed_value', 'software', 'subject_area', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
1 của đối tượng
Image 0 contains 53 members:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'color_space', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'digital_zoom_ratio', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_datestamp', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'light_source', 'make', 'max_aperture_value', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']

Image 1 contains 68 members:
['<unknown EXIF tag 316>', '<unknown EXIF tag 322>', '<unknown EXIF tag 323>', '<unknown EXIF tag 42080>', '_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_dest_bearing', 'gps_dest_bearing_ref', 'gps_horizontal_positioning_error', 'gps_img_direction', 'gps_img_direction_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'gps_speed', 'gps_speed_ref', 'has_exif', 'lens_make', 'lens_model', 'lens_specification', 'make', 'maker_note', 'metering_mode', 'model', 'offset_time', 'offset_time_digitized', 'offset_time_original', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'scene_type', 'sensing_method', 'shutter_speed_value', 'software', 'subject_area', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
5. Đối với mọi hình ảnh chứa dữ liệu EXIF, chúng tôi sẽ sử dụng thuộc tính
Image 0 contains 53 members:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'color_space', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'digital_zoom_ratio', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_datestamp', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'light_source', 'make', 'max_aperture_value', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']

Image 1 contains 68 members:
['<unknown EXIF tag 316>', '<unknown EXIF tag 322>', '<unknown EXIF tag 323>', '<unknown EXIF tag 42080>', '_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_dest_bearing', 'gps_dest_bearing_ref', 'gps_horizontal_positioning_error', 'gps_img_direction', 'gps_img_direction_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'gps_speed', 'gps_speed_ref', 'has_exif', 'lens_make', 'lens_model', 'lens_specification', 'make', 'maker_note', 'metering_mode', 'model', 'offset_time', 'offset_time_digitized', 'offset_time_original', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'scene_type', 'sensing_method', 'shutter_speed_value', 'software', 'subject_area', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
7 của
Image 0 contains 53 members:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'color_space', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'digital_zoom_ratio', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_datestamp', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'light_source', 'make', 'max_aperture_value', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']

Image 1 contains 68 members:
['<unknown EXIF tag 316>', '<unknown EXIF tag 322>', '<unknown EXIF tag 323>', '<unknown EXIF tag 42080>', '_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_dest_bearing', 'gps_dest_bearing_ref', 'gps_horizontal_positioning_error', 'gps_img_direction', 'gps_img_direction_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'gps_speed', 'gps_speed_ref', 'has_exif', 'lens_make', 'lens_model', 'lens_specification', 'make', 'maker_note', 'metering_mode', 'model', 'offset_time', 'offset_time_digitized', 'offset_time_original', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'scene_type', 'sensing_method', 'shutter_speed_value', 'software', 'subject_area', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
1 để hiển thị phiên bản EXIF ​​mà nó đang sử dụng

for index, image in enumerate(images):
    if image.has_exif:
        status = f"contains EXIF (version {image.exif_version}) information."
    else:
        status = "does not contain any EXIF information."
    print(f"Image {index} {status}")

Khi chạy, mã này tạo ra các kết quả sau

Image 0 contains EXIF (version 0220) information.
Image 1 contains EXIF (version 0232) information.

Bây giờ chúng ta biết rằng cả hai bức ảnh đều chứa thông tin EXIF ​​và sử dụng các phiên bản EXIF ​​khác nhau. Rất có khả năng những bức ảnh này được chụp trên các máy ảnh khác nhau

Siêu dữ liệu EXIF ​​​​nào có sẵn trong mỗi ảnh?

Hãy coi EXIF ​​là cấu trúc dữ liệu khóa-giá trị tương tự như từ điển Python. Các cặp khóa-giá trị EXIF ​​được gọi là thẻ và mỗi thẻ có thể chứa giá trị chuỗi hoặc số. Có hàng chục thẻ trong tiêu chuẩn EXIF ​​​​hiện tại (phiên bản 2. 32) và bất kỳ ai — từ nhà sản xuất điện thoại thông minh và máy ảnh đến nhiếp ảnh gia — đều có thể tự do thêm

Dưới đây là danh sách đầy đủ các thẻ EXIF ​​mà bạn có thể tìm thấy trong ảnh kỹ thuật số. Nó bao gồm các thẻ không có trong tiêu chuẩn EXIF, nhưng được cung cấp bởi một số thiết bị hoặc phần mềm

EXIF là một trong những định dạng không chính thức mà các nhà sản xuất chọn và chọn những tính năng mà họ sẽ triển khai. Điều này có nghĩa là ảnh do các máy ảnh và điện thoại thông minh khác nhau tạo ra sẽ có các bộ thẻ EXIF ​​khác nhau

Nhìn chung, bạn có thể tin tưởng vào việc điện thoại thông minh nhúng một số thẻ EXIF ​​thường được sử dụng vào ảnh chúng chụp, bao gồm kiểu dáng và kiểu dáng của điện thoại thông minh, ngày và giờ chụp ảnh, địa điểm chụp điện thoại và các thông tin phổ biến khác.

Do sự khác biệt giữa các thiết bị và sự sẵn có của các công cụ để chỉnh sửa dữ liệu EXIF, một trong những điều đầu tiên bạn nên làm khi làm việc với dữ liệu EXIF ​​của ảnh là xem những thẻ nào có sẵn

Các đối tượng

Image 0 contains 53 members:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'color_space', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'digital_zoom_ratio', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_datestamp', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'light_source', 'make', 'max_aperture_value', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']

Image 1 contains 68 members:
['<unknown EXIF tag 316>', '<unknown EXIF tag 322>', '<unknown EXIF tag 323>', '<unknown EXIF tag 42080>', '_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_dest_bearing', 'gps_dest_bearing_ref', 'gps_horizontal_positioning_error', 'gps_img_direction', 'gps_img_direction_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'gps_speed', 'gps_speed_ref', 'has_exif', 'lens_make', 'lens_model', 'lens_specification', 'make', 'maker_note', 'metering_mode', 'model', 'offset_time', 'offset_time_digitized', 'offset_time_original', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'scene_type', 'sensing_method', 'shutter_speed_value', 'software', 'subject_area', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
1 do mô-đun exif cung cấp hiển thị các thẻ EXIF ​​dưới dạng thuộc tính của đối tượng đó. Điều này có nghĩa là bạn có thể sử dụng hàm tích hợp sẵn của Python trên một đối tượng
Image 0 contains 53 members:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'color_space', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'digital_zoom_ratio', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_datestamp', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'light_source', 'make', 'max_aperture_value', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']

Image 1 contains 68 members:
['<unknown EXIF tag 316>', '<unknown EXIF tag 322>', '<unknown EXIF tag 323>', '<unknown EXIF tag 42080>', '_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_dest_bearing', 'gps_dest_bearing_ref', 'gps_horizontal_positioning_error', 'gps_img_direction', 'gps_img_direction_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'gps_speed', 'gps_speed_ref', 'has_exif', 'lens_make', 'lens_model', 'lens_specification', 'make', 'maker_note', 'metering_mode', 'model', 'offset_time', 'offset_time_digitized', 'offset_time_original', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'scene_type', 'sensing_method', 'shutter_speed_value', 'software', 'subject_area', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
1 để xem nó có những thẻ EXIF ​​nào

Đoạn mã sau hiển thị danh sách các thành viên của mỗi đối tượng

Image 0 contains 53 members:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'color_space', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'digital_zoom_ratio', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_datestamp', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'light_source', 'make', 'max_aperture_value', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']

Image 1 contains 68 members:
['<unknown EXIF tag 316>', '<unknown EXIF tag 322>', '<unknown EXIF tag 323>', '<unknown EXIF tag 42080>', '_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_dest_bearing', 'gps_dest_bearing_ref', 'gps_horizontal_positioning_error', 'gps_img_direction', 'gps_img_direction_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'gps_speed', 'gps_speed_ref', 'has_exif', 'lens_make', 'lens_model', 'lens_specification', 'make', 'maker_note', 'metering_mode', 'model', 'offset_time', 'offset_time_digitized', 'offset_time_original', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'scene_type', 'sensing_method', 'shutter_speed_value', 'software', 'subject_area', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
1 trong danh sách hình ảnh cây cọ của chúng ta

image_members = []

for image in images:
    image_members.append(dir(image))

for index, image_member_list in enumerate(image_members):
    print(f"Image {index} contains {len(image_member_list)} members:")
    print(f"{image_member_list}\n")

Bạn sẽ thấy đầu ra sau

Image 0 contains 53 members:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'color_space', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'digital_zoom_ratio', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_datestamp', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'light_source', 'make', 'max_aperture_value', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']

Image 1 contains 68 members:
['<unknown EXIF tag 316>', '<unknown EXIF tag 322>', '<unknown EXIF tag 323>', '<unknown EXIF tag 42080>', '_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_dest_bearing', 'gps_dest_bearing_ref', 'gps_horizontal_positioning_error', 'gps_img_direction', 'gps_img_direction_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'gps_speed', 'gps_speed_ref', 'has_exif', 'lens_make', 'lens_model', 'lens_specification', 'make', 'maker_note', 'metering_mode', 'model', 'offset_time', 'offset_time_digitized', 'offset_time_original', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'scene_type', 'sensing_method', 'shutter_speed_value', 'software', 'subject_area', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']

Như bạn có thể thấy, trong khi cả hai đối tượng

Image 0 contains 53 members:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'color_space', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'digital_zoom_ratio', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_datestamp', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'light_source', 'make', 'max_aperture_value', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']

Image 1 contains 68 members:
['<unknown EXIF tag 316>', '<unknown EXIF tag 322>', '<unknown EXIF tag 323>', '<unknown EXIF tag 42080>', '_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_dest_bearing', 'gps_dest_bearing_ref', 'gps_horizontal_positioning_error', 'gps_img_direction', 'gps_img_direction_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'gps_speed', 'gps_speed_ref', 'has_exif', 'lens_make', 'lens_model', 'lens_specification', 'make', 'maker_note', 'metering_mode', 'model', 'offset_time', 'offset_time_digitized', 'offset_time_original', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'scene_type', 'sensing_method', 'shutter_speed_value', 'software', 'subject_area', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
1 đều có rất nhiều phần tử chung, thì hình ảnh 1 chứa nhiều hơn một vài phần tử so với hình ảnh 0. Điều này có nghĩa là hình ảnh 1 có nhiều thẻ EXIF ​​hơn hình ảnh 0. Đây là một chỉ báo rõ ràng rằng hình ảnh 0 và hình ảnh 1 được chụp trên các thiết bị khác nhau

Bạn có thể sử dụng các bộ Python để xác định các thành viên mà hình ảnh 0 và hình ảnh 1 có điểm chung

common_members = set(image_members[0]).intersection(set(image_members[1]))
common_members_sorted = sorted(list(common_members))
print("Image 0 and Image 1 have these members in common:")
print(f"{common_members_sorted}")

Chạy mã này tạo ra kết quả này

Image 0 and Image 1 have these members in common:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'make', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']

Nếu bạn đã xem tên của các thẻ EXIF ​​trong tài liệu (danh sách các thẻ EXIF ​​tiêu chuẩn hoặc danh sách mở rộng), bạn có thể nhận thấy rằng các tên thẻ EXIF ​​nằm trong

common_members = set(image_members[0]).intersection(set(image_members[1]))
common_members_sorted = sorted(list(common_members))
print("Image 0 and Image 1 have these members in common:")
print(f"{common_members_sorted}")
3 trong khi các thuộc tính EXIF ​​trong các đối tượng exif
Image 0 contains 53 members:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'color_space', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'digital_zoom_ratio', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_datestamp', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'light_source', 'make', 'max_aperture_value', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']

Image 1 contains 68 members:
['<unknown EXIF tag 316>', '<unknown EXIF tag 322>', '<unknown EXIF tag 323>', '<unknown EXIF tag 42080>', '_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_dest_bearing', 'gps_dest_bearing_ref', 'gps_horizontal_positioning_error', 'gps_img_direction', 'gps_img_direction_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'gps_speed', 'gps_speed_ref', 'has_exif', 'lens_make', 'lens_model', 'lens_specification', 'make', 'maker_note', 'metering_mode', 'model', 'offset_time', 'offset_time_digitized', 'offset_time_original', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'scene_type', 'sensing_method', 'shutter_speed_value', 'software', 'subject_area', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
1 nằm trong
common_members = set(image_members[0]).intersection(set(image_members[1]))
common_members_sorted = sorted(list(common_members))
print("Image 0 and Image 1 have these members in common:")
print(f"{common_members_sorted}")
5. Điều này là do các tác giả của mô-đun exif đang cố gắng tuân theo Hướng dẫn về Phong cách Python và đã thiết kế
Image 0 contains 53 members:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'color_space', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'digital_zoom_ratio', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_datestamp', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'light_source', 'make', 'max_aperture_value', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']

Image 1 contains 68 members:
['<unknown EXIF tag 316>', '<unknown EXIF tag 322>', '<unknown EXIF tag 323>', '<unknown EXIF tag 42080>', '_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_dest_bearing', 'gps_dest_bearing_ref', 'gps_horizontal_positioning_error', 'gps_img_direction', 'gps_img_direction_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'gps_speed', 'gps_speed_ref', 'has_exif', 'lens_make', 'lens_model', 'lens_specification', 'make', 'maker_note', 'metering_mode', 'model', 'offset_time', 'offset_time_digitized', 'offset_time_original', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'scene_type', 'sensing_method', 'shutter_speed_value', 'software', 'subject_area', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
1 để chuyển đổi tên thẻ EXIF ​​​​thành tên thuộc tính Pythonic

Các thành viên không phải EXIF ​​​​của lớp _______1 của exif

Hầu hết, nhưng không phải tất cả, các thành viên của bất kỳ phiên bản

Image 0 contains 53 members:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'color_space', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'digital_zoom_ratio', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_datestamp', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'light_source', 'make', 'max_aperture_value', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']

Image 1 contains 68 members:
['<unknown EXIF tag 316>', '<unknown EXIF tag 322>', '<unknown EXIF tag 323>', '<unknown EXIF tag 42080>', '_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_dest_bearing', 'gps_dest_bearing_ref', 'gps_horizontal_positioning_error', 'gps_img_direction', 'gps_img_direction_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'gps_speed', 'gps_speed_ref', 'has_exif', 'lens_make', 'lens_model', 'lens_specification', 'make', 'maker_note', 'metering_mode', 'model', 'offset_time', 'offset_time_digitized', 'offset_time_original', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'scene_type', 'sensing_method', 'shutter_speed_value', 'software', 'subject_area', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
1 nào sẽ là các thuộc tính tương ứng với các thẻ EXIF ​​​​trong hình ảnh. Tuy nhiên, có một số thành viên làm việc với siêu dữ liệu EXIF. Chúng được liệt kê trong bảng dưới đây

Thành viên lớp Mô tả
common_members = set(image_members[0]).intersection(set(image_members[1]))
common_members_sorted = sorted(list(common_members))
print("Image 0 and Image 1 have these members in common:")
print(f"{common_members_sorted}")
9thuộc tính
Image 0 and Image 1 have these members in common:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'make', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
0Xóa thẻ EXIF ​​được chỉ định bởi thuộc tính chuỗi khỏi hình ảnh.
Image 0 and Image 1 have these members in common:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'make', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
1Xóa tất cả các thẻ EXIF ​​​​khỏi hình ảnh.
Image 0 and Image 1 have these members in common:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'make', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
2thuộc tính, mặc định=None
Image 0 and Image 1 have these members in common:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'make', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
0Trả về giá trị cho thẻ EXIF ​​được chỉ định bởi thuộc tính chuỗi. Nếu thẻ không có sẵn hoặc có chứa giá trị, thẻ sẽ trả về giá trị được chỉ định bởi đối số từ khóa
Image 0 and Image 1 have these members in common:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'make', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
4.
Image 0 and Image 1 have these members in common:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'make', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
5 Trả về dữ liệu hiện tại cho hình ảnh, định dạng để ghi vào tệp nhị phân.
Image 0 and Image 1 have these members in common:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'make', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
6Trả về dữ liệu nhị phân cho hình thu nhỏ của hình ảnh.
Image 0 contains 53 members:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'color_space', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'digital_zoom_ratio', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_datestamp', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'light_source', 'make', 'max_aperture_value', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']

Image 1 contains 68 members:
['<unknown EXIF tag 316>', '<unknown EXIF tag 322>', '<unknown EXIF tag 323>', '<unknown EXIF tag 42080>', '_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_dest_bearing', 'gps_dest_bearing_ref', 'gps_horizontal_positioning_error', 'gps_img_direction', 'gps_img_direction_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'gps_speed', 'gps_speed_ref', 'has_exif', 'lens_make', 'lens_model', 'lens_specification', 'make', 'maker_note', 'metering_mode', 'model', 'offset_time', 'offset_time_digitized', 'offset_time_original', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'scene_type', 'sensing_method', 'shutter_speed_value', 'software', 'subject_area', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
5Một giá trị Boolean trả về
Image 0 and Image 1 have these members in common:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'make', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
8 nếu hình ảnh hiện chứa siêu dữ liệu EXIF.
Image 0 and Image 1 have these members in common:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'make', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
9thuộc tính, giá trị_______23_______0Đặt giá trị cho thẻ EXIF ​​được chỉ định bởi thuộc tính chuỗi. Nếu thẻ không có sẵn hoặc có chứa giá trị, thẻ sẽ trả về giá trị được chỉ định bởi đối số từ khóa
Image 0 and Image 1 have these members in common:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'make', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
4

Chúng tôi sẽ đề cập đến hầu hết các thuộc tính và phương thức này trong bài viết này

Nhận thông tin ảnh cơ bản

Hãy trả lời câu hỏi đầu tiên về những bức ảnh này. Chúng được chụp trên cùng một thiết bị hay hai thiết bị khác nhau?

Kiểu dáng và kiểu dáng của thiết bị được sử dụng để chụp ảnh

Cả hai hình ảnh đều có thẻ

for index, image in enumerate(images):
    print(f"Device information - Image {index}")
    print("----------------------------")
    print(f"Make: {image.make}")
    print(f"Model: {image.model}\n")
2 và
for index, image in enumerate(images):
    print(f"Device information - Image {index}")
    print("----------------------------")
    print(f"Make: {image.make}")
    print(f"Model: {image.model}\n")
3, vì vậy, hãy sử dụng những thẻ đó để xác định loại thiết bị nào được sử dụng để chụp những bức ảnh này

for index, image in enumerate(images):
    print(f"Device information - Image {index}")
    print("----------------------------")
    print(f"Make: {image.make}")
    print(f"Model: {image.model}\n")

Đây là kết quả của đoạn mã trên

Device information - Image 0
----------------------------
Make: motorola
Model: motorola one hyper

Device information - Image 1
----------------------------
Make: Apple
Model: iPhone 12 Pro

Điều này xác nhận rằng các bức ảnh được chụp bằng các thiết bị khác nhau và hiện chúng tôi đã biết chi tiết cụ thể

Thông tin bổ sung và tùy chọn về các thiết bị

Hãy thu thập thêm một số thông tin về các thiết bị được sử dụng để chụp ảnh, cụ thể là chi tiết về ống kính và phiên bản hệ điều hành của chúng

Không phải tất cả các thiết bị đều báo cáo loại ống kính trong siêu dữ liệu EXIF ​​của chúng, vì vậy chúng tôi sẽ sử dụng phương pháp

for index, image in enumerate(images):
    print(f"Device information - Image {index}")
    print("----------------------------")
    print(f"Make: {image.make}")
    print(f"Model: {image.model}\n")
5 của
Image 0 contains 53 members:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'color_space', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'digital_zoom_ratio', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_datestamp', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'light_source', 'make', 'max_aperture_value', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']

Image 1 contains 68 members:
['<unknown EXIF tag 316>', '<unknown EXIF tag 322>', '<unknown EXIF tag 323>', '<unknown EXIF tag 42080>', '_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_dest_bearing', 'gps_dest_bearing_ref', 'gps_horizontal_positioning_error', 'gps_img_direction', 'gps_img_direction_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'gps_speed', 'gps_speed_ref', 'has_exif', 'lens_make', 'lens_model', 'lens_specification', 'make', 'maker_note', 'metering_mode', 'model', 'offset_time', 'offset_time_digitized', 'offset_time_original', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'scene_type', 'sensing_method', 'shutter_speed_value', 'software', 'subject_area', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
1, tương tự như phương pháp
for index, image in enumerate(images):
    print(f"Device information - Image {index}")
    print("----------------------------")
    print(f"Make: {image.make}")
    print(f"Model: {image.model}\n")
5 được sử dụng bởi từ điển Python. Giống như phương thức
for index, image in enumerate(images):
    print(f"Device information - Image {index}")
    print("----------------------------")
    print(f"Make: {image.make}")
    print(f"Model: {image.model}\n")
5 của từ điển Python, phương thức
for index, image in enumerate(images):
    print(f"Device information - Image {index}")
    print("----------------------------")
    print(f"Make: {image.make}")
    print(f"Model: {image.model}\n")
5 được cung cấp bởi đối tượng
Image 0 contains 53 members:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'color_space', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'digital_zoom_ratio', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_datestamp', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'light_source', 'make', 'max_aperture_value', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']

Image 1 contains 68 members:
['<unknown EXIF tag 316>', '<unknown EXIF tag 322>', '<unknown EXIF tag 323>', '<unknown EXIF tag 42080>', '_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_dest_bearing', 'gps_dest_bearing_ref', 'gps_horizontal_positioning_error', 'gps_img_direction', 'gps_img_direction_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'gps_speed', 'gps_speed_ref', 'has_exif', 'lens_make', 'lens_model', 'lens_specification', 'make', 'maker_note', 'metering_mode', 'model', 'offset_time', 'offset_time_digitized', 'offset_time_original', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'scene_type', 'sensing_method', 'shutter_speed_value', 'software', 'subject_area', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
1 của exif xử lý khéo léo trường hợp khóa đã cho không tồn tại

Đoạn mã dưới đây sử dụng

for index, image in enumerate(images):
    print(f"Device information - Image {index}")
    print("----------------------------")
    print(f"Make: {image.make}")
    print(f"Model: {image.model}\n")
5 để cố gắng truy cập các phiên bản ống kính và hệ điều hành được sử dụng để chụp ảnh. Nếu một thuộc tính cụ thể không tồn tại, giá trị của nó sẽ được hiển thị là “Không xác định”

from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
0

Đây là đầu ra của nó

from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
1

Lưu ý rằng điện thoại được sử dụng để chụp ảnh 0 (Motorola One Hyper), không cung cấp thuộc tính

Device information - Image 0
----------------------------
Make: motorola
Model: motorola one hyper

Device information - Image 1
----------------------------
Make: Apple
Model: iPhone 12 Pro
1,
Device information - Image 0
----------------------------
Make: motorola
Model: motorola one hyper

Device information - Image 1
----------------------------
Make: Apple
Model: iPhone 12 Pro
2,
Device information - Image 0
----------------------------
Make: motorola
Model: motorola one hyper

Device information - Image 1
----------------------------
Make: Apple
Model: iPhone 12 Pro
3 hoặc
Device information - Image 0
----------------------------
Make: motorola
Model: motorola one hyper

Device information - Image 1
----------------------------
Make: Apple
Model: iPhone 12 Pro
4. Nếu chúng tôi đã cố gắng truy cập chúng trực tiếp (ví dụ:
Device information - Image 0
----------------------------
Make: motorola
Model: motorola one hyper

Device information - Image 1
----------------------------
Make: Apple
Model: iPhone 12 Pro
5), kết quả sẽ là lỗi. Phương pháp
for index, image in enumerate(images):
    print(f"Device information - Image {index}")
    print("----------------------------")
    print(f"Make: {image.make}")
    print(f"Model: {image.model}\n")
5 cho phép chúng tôi cung cấp một giá trị thay thế cho các thuộc tính không tồn tại đó

Ngày và giờ chụp ảnh

câu hỏi tiếp theo là. bức ảnh nào được chụp đầu tiên?

Chúng ta có thể tìm hiểu bằng cách xem thuộc tính

Device information - Image 0
----------------------------
Make: motorola
Model: motorola one hyper

Device information - Image 1
----------------------------
Make: Apple
Model: iPhone 12 Pro
7 của mỗi ảnh, ghi rõ ngày và giờ ảnh được chụp. Bộ xử lý trong điện thoại thông minh đủ nhanh để ghi lại chính xác phần giây khi chụp ảnh và phần đó được lưu trữ trong thuộc tính
Device information - Image 0
----------------------------
Make: motorola
Model: motorola one hyper

Device information - Image 1
----------------------------
Make: Apple
Model: iPhone 12 Pro
8

Một số điện thoại cũng ghi thuộc tính

Device information - Image 0
----------------------------
Make: motorola
Model: motorola one hyper

Device information - Image 1
----------------------------
Make: Apple
Model: iPhone 12 Pro
9 mà chúng tôi có thể sử dụng để xác định phần bù của
from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
00 so với UTC

Đoạn mã sau hiển thị ngày và giờ mỗi bức ảnh được chụp. Nếu ảnh bao gồm dữ liệu bù thời gian, thì mã cũng sẽ hiển thị giá trị đó

from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
2

Đây là kết quả

from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
3

Như bạn có thể thấy từ đầu ra, ảnh 0 được chụp trước và ảnh 1 được chụp sau 13 giây

Xác định vị trí ảnh được chụp

Máy ảnh kỹ thuật số đã ghi ngày và giờ vào ảnh ngay từ đầu, nhưng phải đến khi điện thoại thông minh ghi lại vị trí chụp ảnh mới trở nên phổ biến. Trong phần này, chúng ta sẽ xem xét việc truy cập các tọa độ GPS trong siêu dữ liệu của ảnh, định dạng các tọa độ đó và làm cho các tọa độ đó dễ hiểu hơn bằng cách định vị chúng trên bản đồ và chuyển đổi chúng thành tên của quốc gia, khu vực và thành phố nơi

Lấy tọa độ GPS của ảnh

Định dạng EXIF ​​chỉ định một số thẻ bắt đầu bằng “gps”, chứa thông tin vị trí địa lý hữu ích, bao gồm kinh độ và vĩ độ nơi chụp ảnh

from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
4

Đây là đầu ra cho đoạn mã trên

from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
5

Lưu ý rằng các thuộc tính

from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
01 và
from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
02 trả về vĩ độ và kinh độ dưới dạng một bộ gồm ba giá trị, đó là

  1. độ
  2. Phút (1/60 độ)
  3. Giây (1/60 phút hoặc 1/3600 độ)

Vĩ độ chỉ định khoảng cách góc từ đường xích đạo, có thể là bắc hoặc nam. Thuộc tính

from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
03 chỉ ra hướng này, đó là
from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
04 hoặc
from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
05

Kinh độ chỉ định khoảng cách góc từ kinh tuyến, có thể là hướng đông hoặc hướng tây. Thuộc tính

from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
06 chỉ ra hướng này, đó là
from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
07 hoặc
from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
08

Bạn có thể nhận thấy sự khác biệt nhỏ giữa các tọa độ được báo cáo trong ảnh. Điều này được mong đợi; . Sự khác biệt về tọa độ được báo cáo bởi điện thoại là theo thứ tự một phần giây, có nghĩa là khoảng 25 feet hoặc 7. 6 mét

Định dạng vĩ độ và kinh độ

Hãy xác định một vài hàm để định dạng thông tin kinh độ và vĩ độ được trả về bởi

Image 0 contains 53 members:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'color_space', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'digital_zoom_ratio', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_datestamp', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'light_source', 'make', 'max_aperture_value', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']

Image 1 contains 68 members:
['<unknown EXIF tag 316>', '<unknown EXIF tag 322>', '<unknown EXIF tag 323>', '<unknown EXIF tag 42080>', '_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_dest_bearing', 'gps_dest_bearing_ref', 'gps_horizontal_positioning_error', 'gps_img_direction', 'gps_img_direction_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'gps_speed', 'gps_speed_ref', 'has_exif', 'lens_make', 'lens_model', 'lens_specification', 'make', 'maker_note', 'metering_mode', 'model', 'offset_time', 'offset_time_digitized', 'offset_time_original', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'scene_type', 'sensing_method', 'shutter_speed_value', 'software', 'subject_area', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
1 thành các định dạng tiêu chuẩn

  • Độ, phút và giây. Ở định dạng này, vĩ độ của hình ảnh 0 sẽ được viết là 28. 0° 0. 0' 1. 56"N
  • Độ thập phân. Ở định dạng này, vĩ độ của hình ảnh 0 sẽ được viết là 28. 000433333333334. Các vĩ độ phía bắc và kinh độ phía đông được biểu thị bằng các giá trị dương, trong khi các vĩ độ phía nam và kinh độ phía tây được biểu thị bằng các giá trị âm

Đây là định nghĩa cho các chức năng đó, cũng như một số mã sử dụng chúng

from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
6

Đây là đầu ra

from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
7

Hiển thị vị trí ảnh trên bản đồ

Bạn có thể không biết vĩ độ và kinh độ của nhà mình, ngay cả khi làm tròn đến độ gần nhất. Có một số cách đơn giản để chuyển đổi dữ liệu vị trí EXIF ​​thành thứ gì đó dễ hiểu hơn đối với con người

Một cách là sử dụng mô-đun trình duyệt web tích hợp của Python để mở tab trình duyệt mới cho từng ảnh, sử dụng phiên bản thập phân của tọa độ EXIF ​​​​của mỗi ảnh làm tham số cho URL Google Maps. Chúng ta sẽ tạo một hàm tiện ích có tên là

from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
10 để thực hiện điều này

from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
8

Khi bạn chạy nó, hai tab trình duyệt mới sẽ mở ra và mỗi tab sẽ hiển thị Google Map cho biết nơi chụp ảnh tương ứng

Hiển thị thành phố, khu vực và quốc gia nơi ảnh được chụp

Một cách khác để hiển thị vị trí của ảnh là sử dụng mã hóa địa lý ngược, đây là quá trình chuyển đổi tọa độ địa lý thành địa chỉ hoặc tên của một địa điểm. Để làm được điều này, chúng ta cần cài đặt hai mô-đun Python

  • reverse_geocoder, một trình mã hóa địa lý ngược ngoại tuyến đơn giản sử dụng các bảng nội bộ để chuyển đổi một tập hợp tọa độ thành một tập hợp tên thành phố và tiểu bang/tỉnh và mã quốc gia. Cài đặt cái này bằng cách nhập
    from exif import Image
    
    with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
        palm_1_image = Image(palm_1_file)
        
    with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
        palm_2_image = Image(palm_2_file)
        
    images = [palm_1_image, palm_2_image]
    11 trên dòng lệnh
  • pycountry, một tiện ích tra cứu quốc gia mà chúng tôi sẽ sử dụng để chuyển đổi mã quốc gia thành tên tương ứng của chúng. Cài đặt cái này bằng cách nhập
    from exif import Image
    
    with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
        palm_1_image = Image(palm_1_file)
        
    with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
        palm_2_image = Image(palm_2_file)
        
    images = [palm_1_image, palm_2_image]
    12 trên dòng lệnh

Khi bạn đã cài đặt các mô-đun ở trên, hãy sử dụng đoạn mã sau để chuyển đổi tọa độ ảnh thành thứ gì đó dễ nhận biết hơn

from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
9

Mã này sử dụng phương thức

from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
13 của reverse_geocoder để chuyển đổi vĩ độ và kinh độ thập phân của mỗi ảnh thành một tập hợp các thông tin sau

  • Tên thành phố, thị trấn hoặc làng
  • Khu vực hành chính chính, thường là một tiểu bang hoặc tỉnh
  • Khu vực hành chính nhỏ, thường là một quận hoặc huyện
  • Mã quốc gia

Sau đó, nó sử dụng phương pháp

for index, image in enumerate(images):
    print(f"Device information - Image {index}")
    print("----------------------------")
    print(f"Make: {image.make}")
    print(f"Model: {image.model}\n")
5 của pycountry để chuyển đổi mã quốc gia được cung cấp bởi reverse_geocoder thành một bộ chứa các tên quốc gia phổ biến và chính thức tương ứng

Đây là đầu ra của nó

for index, image in enumerate(images):
    if image.has_exif:
        status = f"contains EXIF (version {image.exif_version}) information."
    else:
        status = "does not contain any EXIF information."
    print(f"Image {index} {status}")
0

Thông tin cảm biến hữu ích khác

Như tôi đã đề cập ở đầu bài viết này, điện thoại thông minh có rất nhiều cảm biến. Chúng bao gồm từ kế, phong vũ biểu và gia tốc kế. Khi kết hợp với GPS, các cảm biến này cung cấp thêm thông tin được thêm vào siêu dữ liệu EXIF ​​của mỗi ảnh

Camera quay về hướng nào?

Từ kế cảm nhận từ trường, bao gồm cả từ trường khổng lồ do Trái đất tạo ra. Mục đích chính của nó là trở thành la bàn của điện thoại và xác định hướng mà điện thoại đang chỉ. Thông tin đó được ghi vào EXIF ​​dưới dạng tiêu đề la bàn mỗi khi bạn chụp ảnh

Hãy xác định xem tôi đang quay mặt về hướng nào khi chụp từng bức ảnh này

Cách lấy thuộc tính hình ảnh trong Python

Chúng tôi sẽ sử dụng các thuộc tính exif

Image 0 contains 53 members:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'color_space', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'digital_zoom_ratio', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_datestamp', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'light_source', 'make', 'max_aperture_value', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']

Image 1 contains 68 members:
['<unknown EXIF tag 316>', '<unknown EXIF tag 322>', '<unknown EXIF tag 323>', '<unknown EXIF tag 42080>', '_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_dest_bearing', 'gps_dest_bearing_ref', 'gps_horizontal_positioning_error', 'gps_img_direction', 'gps_img_direction_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'gps_speed', 'gps_speed_ref', 'has_exif', 'lens_make', 'lens_model', 'lens_specification', 'make', 'maker_note', 'metering_mode', 'model', 'offset_time', 'offset_time_digitized', 'offset_time_original', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'scene_type', 'sensing_method', 'shutter_speed_value', 'software', 'subject_area', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
1 sau đây để xác định hướng mà máy ảnh được chỉ

  • from exif import Image
    
    with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
        palm_1_image = Image(palm_1_file)
        
    with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
        palm_2_image = Image(palm_2_file)
        
    images = [palm_1_image, palm_2_image]
    16. Tiêu đề la bàn (nghĩa là hướng) mà máy ảnh hướng về phía khi chụp ảnh, được biểu thị bằng độ thập phân. 0° là hướng bắc, 90° là hướng đông, 180° là hướng nam và 270° là hướng tây
  • from exif import Image
    
    with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
        palm_1_image = Image(palm_1_file)
        
    with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
        palm_2_image = Image(palm_2_file)
        
    images = [palm_1_image, palm_2_image]
    17. Điểm tham chiếu cho
    from exif import Image
    
    with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
        palm_1_image = Image(palm_1_file)
        
    with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
        palm_2_image = Image(palm_2_file)
        
    images = [palm_1_image, palm_2_image]
    16. Đây có thể là
    from exif import Image
    
    with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
        palm_1_image = Image(palm_1_file)
        
    with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
        palm_2_image = Image(palm_2_file)
        
    images = [palm_1_image, palm_2_image]
    19, có nghĩa là 0° đề cập đến phía bắc thực hoặc địa lý, hoặc
    from exif import Image
    
    with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
        palm_1_image = Image(palm_1_file)
        
    with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
        palm_2_image = Image(palm_2_file)
        
    images = [palm_1_image, palm_2_image]
    20, có nghĩa là 0° đề cập đến phía bắc từ trường. Hầu hết thời gian, phía bắc thực sự được sử dụng

Mã bên dưới hiển thị hướng máy ảnh cho bốn ảnh hồ. Nó sử dụng một số chức năng tiện ích

  • from exif import Image
    
    with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
        palm_1_image = Image(palm_1_file)
        
    with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
        palm_2_image = Image(palm_2_file)
        
    images = [palm_1_image, palm_2_image]
    21. Chức năng này chuyển đổi tiêu đề la bàn thành hướng chính (e. g. , N, NE, NNE, v.v.)
  • from exif import Image
    
    with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
        palm_1_image = Image(palm_1_file)
        
    with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
        palm_2_image = Image(palm_2_file)
        
    images = [palm_1_image, palm_2_image]
    22. Hàm này biến giá trị trong
    from exif import Image
    
    with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
        palm_1_image = Image(palm_1_file)
        
    with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
        palm_2_image = Image(palm_2_file)
        
    images = [palm_1_image, palm_2_image]
    17 thành một chuỗi thân thiện với con người
for index, image in enumerate(images):
    if image.has_exif:
        status = f"contains EXIF (version {image.exif_version}) information."
    else:
        status = "does not contain any EXIF information."
    print(f"Image {index} {status}")
1

Khi bạn chạy mã, bạn sẽ thấy đầu ra này

for index, image in enumerate(images):
    if image.has_exif:
        status = f"contains EXIF (version {image.exif_version}) information."
    else:
        status = "does not contain any EXIF information."
    print(f"Image {index} {status}")
2

Độ cao nơi bức ảnh được chụp là gì?

Ngoài việc cung cấp tọa độ vị trí, GPS còn có thể được sử dụng để xác định độ cao. Một số điện thoại thông minh được trang bị phong vũ biểu (phát hiện áp suất không khí) mà chúng sử dụng để tăng độ chính xác của phép đo độ cao

Hãy cùng tìm hiểu độ cao nơi những bức ảnh này được chụp

Chúng ta sẽ sử dụng các thuộc tính này của đối tượng

Image 0 contains 53 members:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'color_space', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'digital_zoom_ratio', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_datestamp', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'light_source', 'make', 'max_aperture_value', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']

Image 1 contains 68 members:
['<unknown EXIF tag 316>', '<unknown EXIF tag 322>', '<unknown EXIF tag 323>', '<unknown EXIF tag 42080>', '_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_dest_bearing', 'gps_dest_bearing_ref', 'gps_horizontal_positioning_error', 'gps_img_direction', 'gps_img_direction_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'gps_speed', 'gps_speed_ref', 'has_exif', 'lens_make', 'lens_model', 'lens_specification', 'make', 'maker_note', 'metering_mode', 'model', 'offset_time', 'offset_time_digitized', 'offset_time_original', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'scene_type', 'sensing_method', 'shutter_speed_value', 'software', 'subject_area', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
1 của exif để xác định độ cao

Chúng tôi sẽ sử dụng các thuộc tính exif

Image 0 contains 53 members:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'color_space', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'digital_zoom_ratio', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_datestamp', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'light_source', 'make', 'max_aperture_value', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']

Image 1 contains 68 members:
['<unknown EXIF tag 316>', '<unknown EXIF tag 322>', '<unknown EXIF tag 323>', '<unknown EXIF tag 42080>', '_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_dest_bearing', 'gps_dest_bearing_ref', 'gps_horizontal_positioning_error', 'gps_img_direction', 'gps_img_direction_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'gps_speed', 'gps_speed_ref', 'has_exif', 'lens_make', 'lens_model', 'lens_specification', 'make', 'maker_note', 'metering_mode', 'model', 'offset_time', 'offset_time_digitized', 'offset_time_original', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'scene_type', 'sensing_method', 'shutter_speed_value', 'software', 'subject_area', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
1 sau đây

  • from exif import Image
    
    with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
        palm_1_image = Image(palm_1_file)
        
    with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
        palm_2_image = Image(palm_2_file)
        
    images = [palm_1_image, palm_2_image]
    26. Độ cao do máy ảnh báo cáo, được biểu thị bằng mét
  • from exif import Image
    
    with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
        palm_1_image = Image(palm_1_file)
        
    with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
        palm_2_image = Image(palm_2_file)
        
    images = [palm_1_image, palm_2_image]
    27. Điểm tham chiếu cho
    from exif import Image
    
    with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
        palm_1_image = Image(palm_1_file)
        
    with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
        palm_2_image = Image(palm_2_file)
        
    images = [palm_1_image, palm_2_image]
    26. Giá trị này là
    from exif import Image
    
    with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
        palm_1_image = Image(palm_1_file)
        
    with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
        palm_2_image = Image(palm_2_file)
        
    images = [palm_1_image, palm_2_image]
    29, có nghĩa là giá trị trong
    from exif import Image
    
    with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
        palm_1_image = Image(palm_1_file)
        
    with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
        palm_2_image = Image(palm_2_file)
        
    images = [palm_1_image, palm_2_image]
    26 đề cập đến mét trên mực nước biển, hoặc
    from exif import Image
    
    with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
        palm_1_image = Image(palm_1_file)
        
    with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
        palm_2_image = Image(palm_2_file)
        
    images = [palm_1_image, palm_2_image]
    31, có nghĩa là giá trị trong
    from exif import Image
    
    with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
        palm_1_image = Image(palm_1_file)
        
    with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
        palm_2_image = Image(palm_2_file)
        
    images = [palm_1_image, palm_2_image]
    26 đề cập đến mét dưới mực nước biển

Đoạn mã sau hiển thị độ cao do điện thoại báo cáo tại thời điểm mỗi bức ảnh được chụp. Nó sử dụng một chức năng tiện ích,

from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
33, xác định xem độ cao đã cho là trên hay dưới mực nước biển

for index, image in enumerate(images):
    if image.has_exif:
        status = f"contains EXIF (version {image.exif_version}) information."
    else:
        status = "does not contain any EXIF information."
    print(f"Image {index} {status}")
3

Đây là kết quả đầu ra

for index, image in enumerate(images):
    if image.has_exif:
        status = f"contains EXIF (version {image.exif_version}) information."
    else:
        status = "does not contain any EXIF information."
    print(f"Image {index} {status}")
4

Tôi có thể cho bạn biết tôi đã chụp những bức ảnh này ở đâu, nhưng bạn đã biết cách tự mình tìm hiểu

Là nhiếp ảnh gia di chuyển?

Điện thoại thông minh sử dụng kết hợp các vị trí GPS theo thời gian và gia tốc kế để xác định tốc độ và hướng di chuyển của điện thoại. Một số điện thoại cung cấp thông tin này như một phần của siêu dữ liệu EXIF ​​​​trong ảnh

Motorola One Hyper của tôi không ghi bất kỳ siêu dữ liệu nào liên quan đến tốc độ vào ảnh mà nó chụp, nhưng iPhone của tôi thì có. Dữ liệu này có thể được truy cập thông qua hai phương thức đối tượng exif

Image 0 contains 53 members:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'color_space', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'digital_zoom_ratio', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_datestamp', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'light_source', 'make', 'max_aperture_value', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']

Image 1 contains 68 members:
['<unknown EXIF tag 316>', '<unknown EXIF tag 322>', '<unknown EXIF tag 323>', '<unknown EXIF tag 42080>', '_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_dest_bearing', 'gps_dest_bearing_ref', 'gps_horizontal_positioning_error', 'gps_img_direction', 'gps_img_direction_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'gps_speed', 'gps_speed_ref', 'has_exif', 'lens_make', 'lens_model', 'lens_specification', 'make', 'maker_note', 'metering_mode', 'model', 'offset_time', 'offset_time_digitized', 'offset_time_original', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'scene_type', 'sensing_method', 'shutter_speed_value', 'software', 'subject_area', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
1 này

  • from exif import Image
    
    with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
        palm_1_image = Image(palm_1_file)
        
    with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
        palm_2_image = Image(palm_2_file)
        
    images = [palm_1_image, palm_2_image]
    35. Tốc độ do máy ảnh báo cáo, được biểu thị bằng số
  • from exif import Image
    
    with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
        palm_1_image = Image(palm_1_file)
        
    with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
        palm_2_image = Image(palm_2_file)
        
    images = [palm_1_image, palm_2_image]
    36. Các đơn vị tốc độ được sử dụng cho giá trị trong
    from exif import Image
    
    with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
        palm_1_image = Image(palm_1_file)
        
    with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
        palm_2_image = Image(palm_2_file)
        
    images = [palm_1_image, palm_2_image]
    35. Giá trị này có thể là
    from exif import Image
    
    with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
        palm_1_image = Image(palm_1_file)
        
    with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
        palm_2_image = Image(palm_2_file)
        
    images = [palm_1_image, palm_2_image]
    38 cho kilômét trên giờ,
    from exif import Image
    
    with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
        palm_1_image = Image(palm_1_file)
        
    with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
        palm_2_image = Image(palm_2_file)
        
    images = [palm_1_image, palm_2_image]
    20 cho dặm trên giờ hoặc
    from exif import Image
    
    with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
        palm_1_image = Image(palm_1_file)
        
    with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
        palm_2_image = Image(palm_2_file)
        
    images = [palm_1_image, palm_2_image]
    04 cho hải lý trên giờ hoặc "knots"

Hãy xem xét các bức ảnh sau đây

Đây là mã in ra tốc độ đã ghi tại thời điểm mỗi bức ảnh được chụp. Nó bao gồm một chức năng tiện ích,

from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
41, chỉ định các đơn vị của tốc độ được báo cáo

for index, image in enumerate(images):
    if image.has_exif:
        status = f"contains EXIF (version {image.exif_version}) information."
    else:
        status = "does not contain any EXIF information."
    print(f"Image {index} {status}")
5

Đây là tốc độ nó báo cáo

for index, image in enumerate(images):
    if image.has_exif:
        status = f"contains EXIF (version {image.exif_version}) information."
    else:
        status = "does not contain any EXIF information."
    print(f"Image {index} {status}")
6

Cập nhật dữ liệu EXIF ​​​​và lưu nó

Cho đến nay, chúng tôi đã giới hạn bản thân chỉ đọc siêu dữ liệu EXIF ​​​​từ ảnh. Bước tiếp theo là thực hiện các thay đổi đối với dữ liệu đó và sau đó lưu kết quả dưới dạng tệp ảnh mới

Cập nhật tọa độ của ảnh

Hãy bắt đầu với bức ảnh này

Bây giờ, bạn đã biết cách đọc tọa độ của nó từ EXIF ​​và sử dụng các tọa độ đó để mở Google Map để hiển thị vị trí mà chúng đại diện

Đây là mã sẽ làm điều đó. Nó sử dụng hàm tiện ích

from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
10 mà chúng tôi đã xác định trước đó

for index, image in enumerate(images):
    if image.has_exif:
        status = f"contains EXIF (version {image.exif_version}) information."
    else:
        status = "does not contain any EXIF information."
    print(f"Image {index} {status}")
7

Nó xuất ra như sau

for index, image in enumerate(images):
    if image.has_exif:
        status = f"contains EXIF (version {image.exif_version}) information."
    else:
        status = "does not contain any EXIF information."
    print(f"Image {index} {status}")
8

và nó mở ra một tab trình duyệt mới hiển thị Bản đồ Google hiển thị các khách sạn Swan và Dolphin, cách Walt Disney World ở Florida một đoạn đi bộ ngắn

Hãy làm cho mọi thứ thú vị hơn một chút bằng cách thay đổi tọa độ được nhúng trong dữ liệu EXIF ​​của ảnh để nó báo cáo rằng nó được chụp tại Khu vực 51. Trong trường hợp bạn chưa từng nghe về địa điểm này, thì đó là một cơ sở quân sự ở Nevada, nơi những người theo thuyết âm mưu tin rằng Hoa Kỳ. S. chính phủ lưu trữ xác của người ngoài hành tinh và một con tàu vũ trụ bị bắt vào những năm 1950. Tọa độ của nó là 37. 0° 14' 3. 6" Bắc, 115° 48' 23. 99" W

Bạn đã thấy rằng việc đọc giá trị của thẻ EXIF ​​bằng cách sử dụng đối tượng _______1 của exif chỉ đơn giản là đọc giá trị trong thuộc tính tương ứng của nó. Tương tự như vậy, việc cập nhật giá trị của nó chỉ đơn giản là gán một giá trị mới cho thuộc tính đó. Trong trường hợp này, chúng tôi sẽ chỉ định các giá trị chỉ định tọa độ của Khu vực 51 cho các thuộc tính của hình ảnh

from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
01,
from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
03,
from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
02 và
from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
06

for index, image in enumerate(images):
    if image.has_exif:
        status = f"contains EXIF (version {image.exif_version}) information."
    else:
        status = "does not contain any EXIF information."
    print(f"Image {index} {status}")
9

Chạy mã sẽ tạo ra kết quả này

Image 0 contains EXIF (version 0220) information.
Image 1 contains EXIF (version 0232) information.
0

và nó sẽ mở một trình duyệt mới hiển thị Google Map hiển thị Khu vực 51

Điền vào các thẻ EXIF ​​​​không sử dụng

Có rất nhiều thẻ được xác định trong thông số kỹ thuật EXIF ​​​​hiện tại và hầu hết các máy ảnh chỉ điền vào một tập hợp con nhỏ trong số đó. Mô-đun exif cho phép điền vào bất kỳ thẻ EXIF ​​​​nào không có giá trị được gán cho chúng

Ghi chú. Mô-đun exif chỉ ghi vào các thẻ trong đặc tả EXIF ​​và không ghi các thẻ bổ sung do nhà cung cấp đưa vào. Các thẻ "chính thức" trong đặc tả EXIF ​​​​được gạch chân

Bạn có thể gán giá trị cho thẻ bên ngoài thông số kỹ thuật EXIF, ngay cả thẻ do bạn tạo. Đối tượng

Image 0 contains 53 members:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'color_space', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'digital_zoom_ratio', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_datestamp', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'light_source', 'make', 'max_aperture_value', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']

Image 1 contains 68 members:
['<unknown EXIF tag 316>', '<unknown EXIF tag 322>', '<unknown EXIF tag 323>', '<unknown EXIF tag 42080>', '_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_dest_bearing', 'gps_dest_bearing_ref', 'gps_horizontal_positioning_error', 'gps_img_direction', 'gps_img_direction_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'gps_speed', 'gps_speed_ref', 'has_exif', 'lens_make', 'lens_model', 'lens_specification', 'make', 'maker_note', 'metering_mode', 'model', 'offset_time', 'offset_time_digitized', 'offset_time_original', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'scene_type', 'sensing_method', 'shutter_speed_value', 'software', 'subject_area', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
1 sẽ lưu trữ giá trị đó, nhưng chỉ trong thời gian đối tượng vẫn còn trong bộ nhớ. Bạn sẽ không thể lưu các thẻ không phải EXIF ​​hoặc các giá trị của chúng vì phương thức chuyển đổi dữ liệu trong đối tượng
Image 0 contains 53 members:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'color_space', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'digital_zoom_ratio', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_datestamp', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'light_source', 'make', 'max_aperture_value', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']

Image 1 contains 68 members:
['<unknown EXIF tag 316>', '<unknown EXIF tag 322>', '<unknown EXIF tag 323>', '<unknown EXIF tag 42080>', '_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_dest_bearing', 'gps_dest_bearing_ref', 'gps_horizontal_positioning_error', 'gps_img_direction', 'gps_img_direction_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'gps_speed', 'gps_speed_ref', 'has_exif', 'lens_make', 'lens_model', 'lens_specification', 'make', 'maker_note', 'metering_mode', 'model', 'offset_time', 'offset_time_digitized', 'offset_time_original', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'scene_type', 'sensing_method', 'shutter_speed_value', 'software', 'subject_area', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
1 để ghi vào tệp chỉ tính đến các thẻ EXIF ​​tiêu chuẩn

Dưới đây là một số thẻ EXIF ​​mà bạn có thể muốn điền vào, vì chúng rất hữu ích để quản lý thư viện ảnh. Cả hai đều lấy giá trị chuỗi

  • from exif import Image
    
    with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
        palm_1_image = Image(palm_1_file)
        
    with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
        palm_2_image = Image(palm_2_file)
        
    images = [palm_1_image, palm_2_image]
    50. Một mô tả của bức ảnh. Trong các đối tượng
    Image 0 contains 53 members:
    ['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'color_space', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'digital_zoom_ratio', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_datestamp', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'light_source', 'make', 'max_aperture_value', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
    
    Image 1 contains 68 members:
    ['<unknown EXIF tag 316>', '<unknown EXIF tag 322>', '<unknown EXIF tag 323>', '<unknown EXIF tag 42080>', '_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_dest_bearing', 'gps_dest_bearing_ref', 'gps_horizontal_positioning_error', 'gps_img_direction', 'gps_img_direction_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'gps_speed', 'gps_speed_ref', 'has_exif', 'lens_make', 'lens_model', 'lens_specification', 'make', 'maker_note', 'metering_mode', 'model', 'offset_time', 'offset_time_digitized', 'offset_time_original', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'scene_type', 'sensing_method', 'shutter_speed_value', 'software', 'subject_area', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
    1 của exif, đối tượng này được hiển thị dưới dạng thuộc tính
    from exif import Image
    
    with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
        palm_1_image = Image(palm_1_file)
        
    with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
        palm_2_image = Image(palm_2_file)
        
    images = [palm_1_image, palm_2_image]
    52
  • from exif import Image
    
    with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
        palm_1_image = Image(palm_1_file)
        
    with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
        palm_2_image = Image(palm_2_file)
        
    images = [palm_1_image, palm_2_image]
    53. Thông báo bản quyền cho bức ảnh. Trong các đối tượng
    Image 0 contains 53 members:
    ['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'color_space', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'digital_zoom_ratio', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_datestamp', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'light_source', 'make', 'max_aperture_value', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
    
    Image 1 contains 68 members:
    ['<unknown EXIF tag 316>', '<unknown EXIF tag 322>', '<unknown EXIF tag 323>', '<unknown EXIF tag 42080>', '_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_dest_bearing', 'gps_dest_bearing_ref', 'gps_horizontal_positioning_error', 'gps_img_direction', 'gps_img_direction_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'gps_speed', 'gps_speed_ref', 'has_exif', 'lens_make', 'lens_model', 'lens_specification', 'make', 'maker_note', 'metering_mode', 'model', 'offset_time', 'offset_time_digitized', 'offset_time_original', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'scene_type', 'sensing_method', 'shutter_speed_value', 'software', 'subject_area', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
    1 của exif, đối tượng này được hiển thị dưới dạng thuộc tính
    from exif import Image
    
    with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
        palm_1_image = Image(palm_1_file)
        
    with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
        palm_2_image = Image(palm_2_file)
        
    images = [palm_1_image, palm_2_image]
    55

Đây là một số mã điền vào các thẻ này

Image 0 contains EXIF (version 0220) information.
Image 1 contains EXIF (version 0232) information.
1

Chạy mã tạo ra kết quả này

Image 0 contains EXIF (version 0220) information.
Image 1 contains EXIF (version 0232) information.
2

Lưu ảnh với dữ liệu được cập nhật

Bây giờ chúng tôi đã cập nhật dữ liệu EXIF ​​​​trong ảnh, hãy lưu nó dưới dạng một tệp hoàn toàn mới với tên khách sạn được cập nhật. jpg

Image 0 contains EXIF (version 0220) information.
Image 1 contains EXIF (version 0232) information.
3

Mã này tạo một đối tượng tệp,

from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
56, để ghi dữ liệu nhị phân vào một tệp có tên là khách sạn đã cập nhật. jpg. Sau đó, nó sử dụng phương pháp
from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
58 của
Image 0 contains 53 members:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'color_space', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'digital_zoom_ratio', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_datestamp', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'light_source', 'make', 'max_aperture_value', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']

Image 1 contains 68 members:
['<unknown EXIF tag 316>', '<unknown EXIF tag 322>', '<unknown EXIF tag 323>', '<unknown EXIF tag 42080>', '_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_dest_bearing', 'gps_dest_bearing_ref', 'gps_horizontal_positioning_error', 'gps_img_direction', 'gps_img_direction_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'gps_speed', 'gps_speed_ref', 'has_exif', 'lens_make', 'lens_model', 'lens_specification', 'make', 'maker_note', 'metering_mode', 'model', 'offset_time', 'offset_time_digitized', 'offset_time_original', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'scene_type', 'sensing_method', 'shutter_speed_value', 'software', 'subject_area', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
1 để lấy dữ liệu hình ảnh khách sạn ở dạng tuần tự hóa và ghi dữ liệu đó vào tệp

Bây giờ bạn sẽ có một tập tin mới. cập nhật khách sạn. jpg. Hãy tải nó và xác nhận rằng dữ liệu chúng tôi đã sửa đổi và thêm vào đã được lưu

Image 0 contains EXIF (version 0220) information.
Image 1 contains EXIF (version 0232) information.
4

Mã sẽ cung cấp cho bạn đầu ra này

Image 0 contains EXIF (version 0220) information.
Image 1 contains EXIF (version 0232) information.
5

và nó sẽ mở một tab trình duyệt khác hiển thị Google Map of Area 51

Xóa dữ liệu EXIF ​​​​và lưu ảnh “đã được quét”

Giả sử rằng thay vì thay đổi dữ liệu vị trí của ảnh khách sạn, chúng tôi quyết định xóa các thẻ của nó. Có hai cách để làm điều này

Cách thứ nhất là sử dụng phương thức

from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
59 được cung cấp bởi đối tượng
Image 0 contains 53 members:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'color_space', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'digital_zoom_ratio', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_datestamp', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'light_source', 'make', 'max_aperture_value', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']

Image 1 contains 68 members:
['<unknown EXIF tag 316>', '<unknown EXIF tag 322>', '<unknown EXIF tag 323>', '<unknown EXIF tag 42080>', '_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_dest_bearing', 'gps_dest_bearing_ref', 'gps_horizontal_positioning_error', 'gps_img_direction', 'gps_img_direction_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'gps_speed', 'gps_speed_ref', 'has_exif', 'lens_make', 'lens_model', 'lens_specification', 'make', 'maker_note', 'metering_mode', 'model', 'offset_time', 'offset_time_digitized', 'offset_time_original', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'scene_type', 'sensing_method', 'shutter_speed_value', 'software', 'subject_area', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
1 của exif. Hãy sử dụng nó để xóa dữ liệu vĩ độ

Image 0 contains EXIF (version 0220) information.
Image 1 contains EXIF (version 0232) information.
6

Đây là đầu ra cho đoạn mã trên

Image 0 contains EXIF (version 0220) information.
Image 1 contains EXIF (version 0232) information.
7

Cách thứ hai là sử dụng câu lệnh

from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
61 của Python để xóa các đối tượng khỏi bộ nhớ. Trong trường hợp này, chúng tôi sẽ sử dụng nó để xóa các thuộc tính của
from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
62 lưu trữ dữ liệu kinh độ

Image 0 contains EXIF (version 0220) information.
Image 1 contains EXIF (version 0232) information.
8

Đây là đầu ra cho đoạn mã trên

Image 0 contains EXIF (version 0220) information.
Image 1 contains EXIF (version 0232) information.
9

Bây giờ chúng tôi đã xóa dữ liệu vị trí khỏi ảnh, hãy lưu nó dưới tên tệp mới, khách sạn không có dữ liệu vị trí. jpg

image_members = []

for image in images:
    image_members.append(dir(image))

for index, image_member_list in enumerate(image_members):
    print(f"Image {index} contains {len(image_member_list)} members:")
    print(f"{image_member_list}\n")
0

Cuối cùng, nếu bạn chỉ muốn xóa tất cả dữ liệu EXIF ​​​​khỏi ảnh, bạn có thể sử dụng phương thức của đối tượng exif

Image 0 contains 53 members:
['_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'color_space', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'digital_zoom_ratio', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_datestamp', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'has_exif', 'light_source', 'make', 'max_aperture_value', 'metering_mode', 'model', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'sensing_method', 'shutter_speed_value', 'subsec_time', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']

Image 1 contains 68 members:
['<unknown EXIF tag 316>', '<unknown EXIF tag 322>', '<unknown EXIF tag 323>', '<unknown EXIF tag 42080>', '_exif_ifd_pointer', '_gps_ifd_pointer', '_segments', 'aperture_value', 'brightness_value', 'components_configuration', 'datetime', 'datetime_digitized', 'datetime_original', 'delete', 'delete_all', 'exif_version', 'exposure_bias_value', 'exposure_mode', 'exposure_program', 'exposure_time', 'f_number', 'flash', 'flashpix_version', 'focal_length', 'focal_length_in_35mm_film', 'get', 'get_file', 'get_thumbnail', 'gps_altitude', 'gps_altitude_ref', 'gps_dest_bearing', 'gps_dest_bearing_ref', 'gps_horizontal_positioning_error', 'gps_img_direction', 'gps_img_direction_ref', 'gps_latitude', 'gps_latitude_ref', 'gps_longitude', 'gps_longitude_ref', 'gps_speed', 'gps_speed_ref', 'has_exif', 'lens_make', 'lens_model', 'lens_specification', 'make', 'maker_note', 'metering_mode', 'model', 'offset_time', 'offset_time_digitized', 'offset_time_original', 'orientation', 'photographic_sensitivity', 'pixel_x_dimension', 'pixel_y_dimension', 'resolution_unit', 'scene_capture_type', 'scene_type', 'sensing_method', 'shutter_speed_value', 'software', 'subject_area', 'subsec_time_digitized', 'subsec_time_original', 'white_balance', 'x_resolution', 'y_resolution']
1 đối tượng
from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
64

image_members = []

for image in images:
    image_members.append(dir(image))

for index, image_member_list in enumerate(image_members):
    print(f"Image {index} contains {len(image_member_list)} members:")
    print(f"{image_member_list}\n")
1
image_members = []

for image in images:
    image_members.append(dir(image))

for index, image_member_list in enumerate(image_members):
    print(f"Image {index} contains {len(image_member_list)} members:")
    print(f"{image_member_list}\n")
2

Một lần nữa, khi bạn đã sử dụng

from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
64 để xóa tất cả các thẻ EXIF, bạn cần lưu những thay đổi đó. Mã bên dưới lưu hình ảnh của chúng tôi với tất cả các thẻ đã bị xóa dưới dạng khách sạn không có thẻ. jpg

image_members = []

for image in images:
    image_members.append(dir(image))

for index, image_member_list in enumerate(image_members):
    print(f"Image {index} contains {len(image_member_list)} members:")
    print(f"{image_member_list}\n")
3

Cân nhắc thực tế và kỹ thuật

Lý do xóa siêu dữ liệu EXIF

Siêu dữ liệu EXIF ​​bổ sung một cấp độ thông tin hoàn toàn mới cho ảnh kỹ thuật số và một số điều mà người dùng, nhà phát triển và tổ chức phải xem xét

Một trong những cân nhắc rõ ràng là quyền riêng tư. Siêu dữ liệu GPS của một ảnh có thể cho biết vị trí của bạn vào một ngày và giờ cụ thể. Điều có giá trị hơn nhiều là GPS tổng hợp từ cuộn camera của một người nào đó, vì nó chứa các mẫu có thể được phân tích để xác định nơi họ sống, làm việc và những nơi bạn thường lui tới trong thói quen hàng ngày của họ. Đây là lý do tại sao các dịch vụ mạng xã hội uy tín hơn loại bỏ thông tin này khi bạn chia sẻ ảnh trực tuyến. Hãy nhớ rằng điều này chỉ có nghĩa là ảnh của bạn trên thư viện mạng xã hội của bạn không chứa dữ liệu GPS. Không có gì đảm bảo rằng dịch vụ không ghi lại thông tin vị trí cho mục đích khai thác dữ liệu của nhà quảng cáo trước khi xóa thông tin đó

Siêu dữ liệu EXIF ​​​​khác, chẳng hạn như sự kết hợp của nhà sản xuất, kiểu máy, cài đặt và thậm chí cả hướng máy ảnh ưa thích, có thể được sử dụng để liên kết một bộ ảnh với một người cụ thể

Một số nhiếp ảnh gia quan tâm đến tính bí mật hơn là quyền riêng tư khi nói đến siêu dữ liệu ảnh của họ. Họ không muốn từ bỏ cài đặt máy ảnh mà họ đã sử dụng để chụp ảnh

Lý do giữ lại hoặc thêm siêu dữ liệu EXIF

Một trong những lý do ban đầu khiến định dạng siêu dữ liệu EXIF ​​được phát triển là để dễ dàng tự động hóa quy trình lập danh mục, sắp xếp và tìm kiếm thông qua bộ sưu tập ảnh kỹ thuật số. EXIF cho phép tìm kiếm ảnh được chụp trong một khoảng thời gian nhất định, bằng một thiết bị nhất định hoặc tại một địa điểm nhất định. Các thẻ khác, chẳng hạn như thẻ

from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
53, giúp tìm kiếm ảnh do một nhiếp ảnh gia cụ thể chụp, cũng như khẳng định bản quyền của một người

Mặc dù thẻ

from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
50 nhằm mục đích lưu trữ mô tả về hình ảnh, nhưng bạn cũng có thể sử dụng nó để lưu trữ thông tin văn bản hữu ích khác liên quan đến ảnh, chẳng hạn như thẻ để phân loại hình ảnh hoặc hướng dẫn xử lý và chỉnh sửa ảnh

Siêu dữ liệu EXIF ​​đặc biệt hữu ích trong các ứng dụng di động ghi lại sự kết hợp đồng thời của thông tin hình ảnh, ngày/giờ và vị trí. Ví dụ: một kỹ thuật viên có thể được yêu cầu chụp ảnh “trước” và “sau” về công việc sửa chữa mà họ đã thực hiện, cung cấp hồ sơ về địa điểm, thời gian và cách thức công việc được thực hiện

Những thứ khác cần xem xét

Như chúng ta đã thấy trong các thẻ khác nhau được ghi bởi iPhone và thiết bị Android được sử dụng để chụp ảnh trong bài viết này, các máy ảnh khác nhau ghi các bộ thẻ EXIF ​​khác nhau. Phần mềm chỉnh sửa ảnh thường ghi thông tin vào các thẻ khác nhau hoặc thêm các thẻ tùy chỉnh của riêng chúng. Siêu dữ liệu bổ sung này thường có thể là dấu hiệu cho thấy ảnh đã được chỉnh sửa

Có một khái niệm trong chụp ảnh động vật hoang dã được gọi là Ethical EXIF, cung cấp mô tả về các tiêu chuẩn đạo đức tuân theo khi chụp ảnh. Nó bao gồm các thông tin như sức khỏe và mức độ căng thẳng của con vật trong ảnh, con vật bị nuôi nhốt trong bao lâu và liệu con vật có được vận chuyển khỏi môi trường sống của nó để chụp ảnh hay không

Cuối cùng, có các thông báo mà các ứng dụng dành cho thiết bị di động sử dụng máy ảnh hiển thị khi sử dụng lần đầu. Họ thường nói điều gì đó dọc theo dòng “Ứng dụng này sử dụng máy ảnh. Điều đó ổn với bạn chứ?”, nhưng hầu hết trong số họ không nói rõ rằng máy ảnh sẽ thêm vị trí và siêu dữ liệu khác vào mỗi bức ảnh mà nó chụp. Nếu bạn viết ứng dụng dành cho thiết bị di động sử dụng máy ảnh, bạn có thể muốn thông báo cho người dùng về điều này

Bảo mật API Python với Auth0

Bảo mật API Python bằng Auth0 rất dễ dàng và mang lại nhiều tính năng tuyệt vời cho bảng. Với Auth0, chúng ta chỉ cần viết vài dòng code để lấy

  • Một giải pháp quản lý danh tính vững chắc, bao gồm đăng nhập một lần
  • quản lý người dùng
  • Hỗ trợ cho các nhà cung cấp nhận dạng xã hội (như Facebook, GitHub, Twitter, v.v. )
  • Nhà cung cấp nhận dạng doanh nghiệp (Active Directory, LDAP, SAML, v.v. )
  • Cơ sở dữ liệu riêng của chúng tôi về người dùng

Ví dụ: để bảo mật các API Python được viết bằng Flask, chúng ta chỉ cần tạo một trình trang trí

from exif import Image

with open("./images/palm tree 1.jpg", "rb") as palm_1_file:
    palm_1_image = Image(palm_1_file)
    
with open("./images/palm tree 2.jpg", "rb") as palm_2_file:
    palm_2_image = Image(palm_2_file)
    
images = [palm_1_image, palm_2_image]
68

image_members = []

for image in images:
    image_members.append(dir(image))

for index, image_member_list in enumerate(image_members):
    print(f"Image {index} contains {len(image_member_list)} members:")
    print(f"{image_member_list}\n")
4

Sau đó, sử dụng nó trong các điểm cuối của chúng tôi

image_members = []

for image in images:
    image_members.append(dir(image))

for index, image_member_list in enumerate(image_members):
    print(f"Image {index} contains {len(image_member_list)} members:")
    print(f"{image_member_list}\n")
5

Để tìm hiểu thêm về cách bảo mật API Python bằng Auth0, hãy xem hướng dẫn này. Cùng với các hướng dẫn về công nghệ phụ trợ (như Python, Java và PHP), trang web Tài liệu Auth0 cũng cung cấp các hướng dẫn cho ứng dụng Di động/Gốc và ứng dụng Trang đơn

Làm cách nào để trích xuất siêu dữ liệu từ hình ảnh bằng Python?

Triển khai. .
Nhập mô-đun
Tải hình ảnh và giải nén dữ liệu exif
Chuyển đổi id thẻ exif (được biểu thị bằng tagid trong mã) thành dạng có thể đọc được của con người được biểu thị bằng tên thẻ trong mã và nhận giá trị tương ứng của nó

Làm cách nào để lấy dữ liệu hình ảnh trong Python?

Quy trình trích xuất là. .
nhập mô-đun Hình ảnh của PIL vào trình bao. >>> từ hình ảnh nhập PIL
tạo một đối tượng hình ảnh và mở hình ảnh ở chế độ đọc. >>> im = Hình ảnh. mở ('tệp của tôi. png', 'r').
chúng tôi sử dụng một chức năng của mô-đun Hình ảnh được gọi là getdata () để trích xuất các giá trị pixel

Tôi có thể tìm các thuộc tính ảnh ở đâu?

Bạn có thể xem thông tin cơ bản như kiểu ảnh, cũng như kích thước, kích thước và độ phân giải của nó. .
Mở Google Ảnh
Tìm ảnh bạn muốn xem siêu dữ liệu và nhấn vào ảnh đó
Nhấn vào ba dấu chấm ở góc trên bên phải màn hình của bạn
Đi xuống “Chi tiết. ”

Làm cách nào tôi có thể tìm thấy chi tiết của một hình ảnh?

Xem dữ liệu EXIF ​​trong Windows thật dễ dàng. Chỉ cần nhấp chuột phải vào ảnh liên quan và chọn “Thuộc tính”. Nhấp vào tab “Chi tiết” và cuộn xuống —bạn sẽ thấy tất cả các loại thông tin về máy ảnh được sử dụng và cài đặt mà ảnh được chụp.