Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python: Kuvan exif ja iptc tiedot

giga [31.03.2020 00:40:47]

#

Voisiko joku neuvoa, miten pythonilla saa luettua jonkun kuvan exif ja iptc tiedot? Kuten esimerkiksi: aukko, polttoväli, valotusaika, iso, kameramerkki, objektiivi, ja iptc:sta keywords?


Tällaista yritin, mutta on pari ongelmaa:

1. Se lukee vain exif tiedot ja keywords ovat iptc:ssa
2. Se palauttaa jotain sotkua, esim: 'ShutterSpeedValue': (7965784, 1000000) Vaikka oikea arvo pitäisi olla jotain tyyliin: "1/250"

import os
from PIL import Image
from PIL.ExifTags import TAGS

img_file = "kuva.jpg"
image = Image.open(img_file)

exif = {}

for tag, value in image._getexif().items():
    print(tag, value)
    if tag in TAGS:
        exif[TAGS[tag]] = value

print (exif)

The Alchemist [31.03.2020 04:19:58]

#

Nyt on pakko kysyä, että kun tässä ei ole edes yritetty päästä alkuun itse, niin mikset vain googlettanut? Yksinkertaisesti exif-tagin nimeä googlettamalla löytyvät ohjeet sisällön tulkitsemiseksi. Esimerkiksi hakusanalla ShutterSpeedValue selviää, että arvopari on murtoluku, josta voi luvun 2 potenssilla johtaa nimellisen suljinajan.

giga [31.03.2020 13:18:13]

#

Useampi viikko tässä on jo yritetty googlata ja päästä alkua pidemmälle, yhden kirjaston sain jopa tuottamaan haluttua tulosta, mutta koska se käytti ulkoista perl skiptia, niin oli tosi hidas, kun piti käsitellä 10000+ kuvaa.

Eilen yöllä löysin toisen kirjaston:

from pyexiv2 import Image
img = Image(r'/kuva.jpg')
print(img.read_exif())
print(img.read_iptc())
img.close()

Mutta siitäkään ei ollut paljoakaan iloa, kun iptc keywordeista näyttää vain yhden, vaikka kuvassa niitä on yli 10.

Ja koska tuo python ei ole kovin tuttu, en tiedä teenkö jotain väärin, vai onko kirjastossa vain bugi.

Eikä googlellakaan löydy pahemmin toita exif+iptc esimerkkeja pythonille.

PS: Lyhyellä matikalla, minulla ei ole aavitustakaan, miten murtoluvusta (7965784, 1000000) saa aikaan 1/250

Grez [31.03.2020 13:43:34]

#

giga kirjoitti:

Eikä googlellakaan löydy pahemmin toita exif+iptc esimerkkeja pythonille.

Ehkä jos haet erikseen python exif ja python iptc, niin alkaa löytyy enemmän.

Joskin näytti sieltä löytyvän sivuja joissa samalla sivulla esimerkit kummastakin.

giga kirjoitti:

PS: Lyhyellä matikalla, minulla ei ole aavitustakaan, miten murtoluvusta (7965784, 1000000) saa aikaan 1/250

Itse kuvittelisin että potenssilaskut sisältyisivät lyhyeenkin matematiikkaan, mutta aina voi opetella lisää, jos koulussa ei oppinut riittävästi. Muutenhan sitä voi heittää hanskat suoraan tiskiin.

2 ^ -7,965784 on pyöristettynä 1 / 250

giga [10.04.2020 20:05:32]

#

Nyt kun pyexiv2 kehittäjä sai korjattua bugin, josta ilmoitin hänelle, niin tällaista purkaviritystä sain aikaan:

from pyexiv2 import Image
img = Image(r'/kuva.jpg')
exif = img.read_exif()
iptc = img.read_iptc()
img.close()


from fractions import Fraction
def formatexif(exif, iptc):
    MeteringMode = ['Unknown', 'Average', 'Center-weighted average', 'Spot', 'Multi-spot', 'Multi-segment', 'Partial']
    ExposureProgram = ['Not Defined', 'Manual', 'Program', 'Aperture-priority', 'Shutter speed priority', 'Creative', 'Action', 'Portrait', 'Landscape', 'Bulb']
    data = dict()
    data['Model'] = exif['Exif.Image.Model']
    data['LensModel'] = exif['Exif.Photo.LensModel']
    data['ExposureTime'] = exif['Exif.Photo.ExposureTime']
    data['FNumber'] = float(Fraction(exif['Exif.Photo.FNumber']))
    data['ISOSpeedRatings'] = exif['Exif.Photo.ISOSpeedRatings']
    data['FocalLength'] = round(float(Fraction(exif['Exif.Photo.FocalLength'])))
    data['FocalLengthIn35mmFilm'] = exif['Exif.Photo.FocalLengthIn35mmFilm']
    data['ExposureBiasValue'] = float(Fraction(exif['Exif.Photo.ExposureBiasValue']))
    data['MeteringMode'] = exif['Exif.Photo.MeteringMode']
    tmp = int(exif['Exif.Photo.MeteringMode'])
    data['MeteringModeTxt'] = MeteringMode[tmp]
    data['ExposureProgram'] = exif['Exif.Photo.ExposureProgram']
    tmp = int(exif['Exif.Photo.ExposureProgram'])
    data['ExposureProgramTxt'] = ExposureProgram[tmp]
    data['DateTimeOriginal'] = exif['Exif.Photo.DateTimeOriginal']
    data['Keywords'] = iptc['Iptc.Application2.Keywords']
    return data

XXX = formatexif(exif, iptc)
print(XXX)

Miten tuo kannattaisi toteuttaa fiksusti?
Ja niin ettei se menisi heti rikki, jos kuvassa joku arvo ei ole sitä mitä pitäisi tai puuttuu kokonaan?

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta