Spaces:
Sleeping
Sleeping
import pandas as pd | |
import streamlit as st | |
from PIL import Image | |
from PIL.ExifTags import TAGS | |
def classify_image_security(exifdata): | |
# Define criteria for classifying an image as secure or not secure | |
secure_criteria = { | |
"Make": "SecureMake", | |
"Model": "SecureModel", | |
# We can add more criteria as needed | |
} | |
for tag_id, criteria_value in secure_criteria.items(): | |
tag = TAGS.get(tag_id, tag_id) | |
data = exifdata.get(tag_id, b"") # Ensure data is bytes | |
if isinstance(data, bytes): | |
data = data.decode("utf-8", "ignore") # Use "ignore" option to handle decoding errors | |
if data == criteria_value: | |
return "Secure" | |
return "Not Secure" | |
def extract_geolocation(exifdata): | |
gps_info = exifdata.get(34853) # EXIF tag for GPS information | |
if gps_info: | |
lat = gps_info[2][0] + gps_info[2][1] / 60 + gps_info[2][2] / 3600 | |
lon = gps_info[4][0] + gps_info[4][1] / 60 + gps_info[4][2] / 3600 | |
return lat, lon | |
return None | |
def display_map(location): | |
if location: | |
st.subheader('Image Location on Map') | |
map_data = pd.DataFrame({'lat': [location[0]], 'lon': [location[1]]}) | |
st.map(map_data) | |
else: | |
st.subheader("No location details") | |
def load_image(): | |
uploaded_file = st.sidebar.file_uploader(label='Pick an image to test') | |
if uploaded_file and st.sidebar.button('Load'): | |
image = Image.open(uploaded_file) | |
exifdata = image._getexif() | |
with st.expander('Selected Image', expanded=True): | |
st.image(image, use_column_width=True) | |
st.subheader('Image Exchange Information') | |
info_dict = { | |
"Filename": uploaded_file.name, | |
"Image Size": image.size, | |
"Image Width": image.width, | |
"Image Height": image.height, | |
"Image Format": image.format, | |
"Image Mode": image.mode, | |
"Image is Animated": getattr(image, "is_animated", False), | |
"Frames in Image": getattr(image, "n_frames", 1) | |
} | |
for label, value in info_dict.items(): | |
st.markdown(f"{label:25}: {value}") | |
if exifdata is not None: | |
for tag_id in exifdata: | |
tag = TAGS.get(tag_id, tag_id) | |
data = exifdata.get(tag_id, b"") # Ensure data is bytes | |
if isinstance(data, bytes): | |
data = data.decode("utf-8", "ignore") # Use "ignore" option to handle decoding errors | |
st.markdown(f"{tag:25}: {data}") | |
# Classify image security based on metadata | |
image_security = classify_image_security(exifdata) | |
st.subheader('Image Security Classification') | |
st.write(f"This image is: {image_security}") | |
# Extract geolocation | |
location = extract_geolocation(exifdata) | |
# Display the location on a map | |
display_map(location) | |
else: | |
st.subheader('Image Security Classification') | |
st.write('This image does not have metadata or does not match secure criteria.') | |
def main(): | |
st.title('Image EXIF Data Analysis With Location Tracing') | |
st.sidebar.title("Upload an Image") | |
st.sidebar.write("Click 'Load' to analyze metadata and location.") | |
load_image() | |
if __name__ == '__main__': | |
main() | |