Python exam help

From ICO wiki
Jump to navigationJump to search

To get GPS coordinates and image orientation:

from exifread import process_file
 
def degrees(j):
    return j.values[0].num + (j.values[1].num + j.values[2].den * 1.0 / j.values[2].num) / 60.0
 
tags = process_file(open("/home/sheela/Documents/Python/pics/IMG_20131019_201706.jpg"))
print tags
lat, lng = tags.get("GPS GPSLatitude"), tags.get("GPS GPSLongitude")
if lat and lng:
    print "%.4f,%.4f" % (degrees(lat), degrees(lng)),
 
# Parse datetime of the photo
timestamp = tags.get("EXIF DateTimeOriginal")
if timestamp:
    print timestamp.values,
 
# Parse image orientation
orientation = tags.get("Image Orientation")
 
if orientation:
    j, = orientation.values
    if j == 6:
        print "rotated 270 degrees",
    elif j == 8:
        print "rotated 90 degrees",
    elif j == 3:
        print "rotated 180 degrees",
 
print

This code is to remove the exif data - metadata

import Image
from exifread import process_file

image_file = open('/home/sheela/Documents/Python/pics/IMG_20150619_120040.jpg')
image = Image.open(image_file)

# next 3 lines strip exif
data = list(image.getdata())
image_without_exif = Image.new(image.mode, image.size)
image_without_exif.putdata(data)

image_without_exif.save('without_exif_data.jpeg')

This code is to rotate the picture (which do not have metadata) to original view

import Image
orig = Image.open("original.jpg")
rotated = orig.transpose(Image.ROTATE_90) # This happens only in the RAM!
rotated.save("rotated.jpg")
import Image
from exifread import process_file

#input_path, output_path = sys.argv[1:]

image_file = open('/home/sheela/Documents/Python/pics/IMG_20131019_201706.jpg')
image = Image.open(image_file)

# next 3 lines strip exif
data = list(image.getdata())
image_without_exif = Image.new(image.mode, image.size)
image_without_exif.putdata(data)

image_without_exif.save('without_exif_data.jpeg')


im = Image.open("/home/sheela/Documents/Python/pics/IMG_20131019_201706.jpg")
rotated = im.transpose(Image.ROTATE_90)
im.save("rotated.jpg")

#orig = Image.open(output_path)
#rotated = orig.transpose(Image.ROTATE_90) # This happens only in the RAM!
#rotated.save(output_path)

dexif.py Lauri's code

import codecs, os, sys
from exifread import process_file
from PIL import Image
from jinja2 import Template

input_path, output_path = sys.argv[1:] 
if not os.path.exists(output_path):
    os.makedirs(os.path.join(output_path, "thumbnails"))
template = Template(codecs.open("gallery.html", "r", encoding="utf-8").read())
with codecs.open("/tmp/bulid/index.html", "w", encoding="utf-8") as fh:
     fh.write(template.render(files = os.listdir(input_path)))

for filename in os.listdir(input_path):
        if not filename.endswith(".jpg"): continue 
        print filename
        tags = EXIF.process_file(open(os.path.join(input_path, filename)))
        im = Image.open(os.path.join(input_path, filname))
        rotated = im # Not roated at all
        orientation = tags.get("Image orientation") # paese image orientation
        if orientation:
            j, = orientation.values
            if j == 6:
                rotated = im.transpose(Image.ROTATE_270)
            elif j == 8:
                rotated = im.transpose(Image.ROTATE_90)
            elif j == 3:
                rotated = im.transpose(Image.ROTATE_180)
        rotated.save(os.path.join(output_path, filename))
        rotated.thumbnail((192,192), Image.ANTIALIAS)
        rotated.save(os.path.join(output_path, "thumbnails", filename))

Artur code A.py

import Image
import sys
from exifread import process_file

input_path, output_path = sys.argv[1:]

image_file = open(input_path)
image = Image.open(image_file)

data = list(image.getdata())
no_exif = Image.new(image.mode, image.size)
no_exif.putdata(data)

no_exif.save(output_path)

orig = Image.open(output_path)
rotated = orig.transpose(Image.ROTATE_90) # This happens only in the RAM!
rotated.save(output_path)

To get image thumbnail

<<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8"/>
    <title>Images</title>
    <style>
        body {
            background-color: #444;
        }

        .thumbnail {
            position: relative;
            display: inline;
            margin: 1em;
            padding: 0;
            width: 192;
            height: 192;
            box-shadow: 0px 0px 10px rgba(0,0,0,1);
        }
    </style>
  </head>
  <body>
    {% for filename in files % 
        <a href= "{{filename}}">
            <img class="thumbnail" src="thumbnails/{{filename}}"/>  
       </a>
    {% endfor %}
  </body>
</html>

Final result all in one file

# I need to mention my path like this - python dexif2.py /home/sheela/Documents/Python/pics /home/sheela/Documents/Python 

import codecs, os,sys
from exifread import process_file
from PIL import Image
from jinja2 import Template
 
# Grab arguments specified on the command line after: python paranoia.py <input_dir> <output_dir>
input_directory, output_directory = sys.argv[1:]
 
# Create output directories if necessary
if not os.path.exists(output_directory):
    os.makedirs(os.path.join(output_directory, "thumbnails"))
 
HEADER = """<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8"/>
    <style>
        body { background-color: #444; }
        img.thumb { position: relative; display: inline; margin: 1em;
            padding: 0; width: 192; height: 192;
            box-shadow: 0px 0px 10px rgba(0,0,0,1); }
    </style>
  </head>
  <body>
"""

# Open index.html in output diretory and write it line by line
with open(os.path.join(output_directory, "index.html"), "w") as fh:
    fh.write(HEADER)
 
    for filename in os.listdir(input_directory):        
        # Read EXIF tags
        tags = process_file(open(os.path.join(input_directory, filename)))
 
        # Read image data
        original = Image.open(os.path.join(input_directory, filename))
 
        # Rotate as necessary
        rotated = original # Not rotated at all
        orientation = tags.get("Image Orientation") # Parse image orientation        
        if orientation:
            j, = orientation.values
            if j == 6:
                rotated = original.transpose(Image.ROTATE_270)                
            elif j == 8:
                rotated = original.transpose(Image.ROTATE_90)
            elif j == 3:
                rotated = original.transpose(Image.ROTATE_180)
        rotated.save(os.path.join(output_directory, filename))
 
        # Save thumbnail        
        rotated.thumbnail((192,192), Image.ANTIALIAS)
        rotated.save(os.path.join(output_directory, "thumbnails", filename))
        fh.write("""    <a href="%s">""" % filename)
        fh.write("""<img class="thumb" src="thumbnails/%s"/>""" % filename)
        fh.write("""</a>\n""")
    fh.write("  </body>\n")
    fh.write("</html>\n")

Exam answer

import shutil, sys, magic, os
from mutagen.easyid3 import EasyID3
from mutagen.id3 import ID3NoHeaderError
 
db = magic.open(magic.MAGIC_MIME_TYPE)
db.load()
 
try:
    input_directory, output_directory = sys.argv[1:3]
except ValueError:
    print "Not enough arguments!"
    sys.exit(255)
 
for filename in os.listdir(input_directory):
    path = os.path.join(input_directory, filename)
    if db.file(path) not in ("application/octet-stream", "audio/mpeg"):
        continue
 
    try:
        tags = EasyID3(path)
    except ID3NoHeaderError:
        continue
 
    artist, = tags.get("artist")   # artist = tags.get("artist")[0]
    album, = tags.get("album")
    title, = tags.get("title")
    year, = tags.get("date")
    tracknumber, = tags.get("tracknumber")
 
    if "/" in tracknumber:
        tracknumber, _ = tracknumber.split("/")
 
    directory_name = "%s - %s (%s)" % (artist, album, year)
    target_name = "%02d. %s - %s.mp3" % (int(tracknumber), artist, title)
 
    if not os.path.exists(os.path.join(output_directory, directory_name)):
        os.makedirs(os.path.join(output_directory, directory_name))
    shutil.copy(path, os.path.join(output_directory, directory_name, target_name))
    print "Move from:", filename, "to:", os.path.join(directory_name, target_name)