示例#1
0
    def set_location(self, latitude, longitude):
        """Set latitude and longitude for a photo.

        :param float latitude: Latitude of the file
        :param float longitude: Longitude of the file
        :returns: bool
        """
        if (latitude is None or longitude is None):
            return False

        source = self.source
        exif_metadata = pyexiv2.ImageMetadata(source)
        exif_metadata.read()

        exif_metadata['Exif.GPSInfo.GPSLatitude'] = geolocation.decimal_to_dms(
            latitude, False)  # noqa
        exif_metadata['Exif.GPSInfo.GPSLatitudeRef'] = pyexiv2.ExifTag(
            'Exif.GPSInfo.GPSLatitudeRef',
            'N' if latitude >= 0 else 'S')  # noqa
        exif_metadata[
            'Exif.GPSInfo.GPSLongitude'] = geolocation.decimal_to_dms(
                longitude, False)  # noqa
        exif_metadata['Exif.GPSInfo.GPSLongitudeRef'] = pyexiv2.ExifTag(
            'Exif.GPSInfo.GPSLongitudeRef',
            'E' if longitude >= 0 else 'W')  # noqa

        exif_metadata.write()
        self.reset_cache()
        return True
示例#2
0
文件: geotag.py 项目: wchang22/GeoTag
def write_geo_tag(img_path, lat, lon, alt_abs, hdg=None, roll=None, pitch=None, yaw=None):
    """Writes geotags to an image

    Arguments:
        img_path {str} -- Path to image
        lat {float} -- latitude, in decimal degrees
        lon {float} -- longitude, in decimal degrees
        alt_abs {float} -- absolute altitude, in metres

    Keyword Arguments:
        hdg {float} -- Heading, in degrees (default: {None})
        roll {float} -- Roll, in degrees (default: {None})
        pitch {float} -- Pitch, in degrees (default: {None})
        yaw {float} -- Yaw, in degrees (default: {None})

    Raises:
        ValueError -- if image is not a JPEG or MPO
    """

    # Only JPEG and MPO have metadata
    img = Image.open(img_path)
    if not (img.format == 'JPEG' or img.format == "MPO"):
        raise ValueError('Image is not a JPEG or MPO')
    img.close()

    metadata = pyexiv2.ImageMetadata(img_path)
    metadata.read()

    # Add standard Exif Tags
    tags = ['Exif.GPSInfo.GPSLatitude', 'Exif.GPSInfo.GPSLatitudeRef',
            'Exif.GPSInfo.GPSLongitude', 'Exif.GPSInfo.GPSLongitudeRef',
            'Exif.GPSInfo.GPSAltitude', 'Exif.GPSInfo.GPSAltitudeRef']
    values = [coord_dec_to_dms(lat), _get_lat_ref(lat), coord_dec_to_dms(lon),
              _get_lon_ref(lon), Fraction(int(alt_abs*1e7), int(1e7)),
              _get_alt_ref(alt_abs)]

    for (tag, value) in zip(tags, values):
        metadata[tag] = pyexiv2.ExifTag(tag, value)

    if hdg is not None:
        tag = 'Exif.GPSInfo.GPSImgDirection'
        metadata[tag] = pyexiv2.ExifTag(tag, Fraction(int(_check_angle(hdg) * 100), 100))

    # Add roll, pitch, yaw as custom Xmp tags
    tags = ['Xmp.Attitude.Roll', 'Xmp.Attitude.Pitch', 'Xmp.Attitude.Yaw']
    values = [roll, pitch, yaw]
    attitudes = [roll, pitch, yaw]

    for (attitude, tag, value) in zip(attitudes, tags, values):
        if attitude is not None:
            metadata[tag] = pyexiv2.XmpTag(tag, str(_check_angle(value)))

    metadata.write()
示例#3
0
def license_image(image_path: str, lincense_type: str, author: str) -> bool:
    try:
        metadata = pyexiv2.ImageMetadata(image_path)
        metadata.read()
        copyright_key = 'Exif.Image.Copyright'
        author_key = 'Exif.Image.Artist'
        value = LICENSE_TYPES.get(lincense_type)
        if value:
            metadata[copyright_key] = pyexiv2.ExifTag(copyright_key, value)
            metadata[author_key] = pyexiv2.ExifTag(author_key, author)
            metadata.write()
            return True
    except Exception as ex:
        print(ex.args)
    return False
示例#4
0
 def writeMeta(self, pNewValue):
     meta = self._getAllMeta()
     self.exifKeys = self._getAllMetaKeys(meta)
     if self._getExifKey_TimeCode() in self.exifKeys:
         meta.writable = os.access(self.imagePath, os.W_OK)
         meta[self._getExifKey_TimeCode()] = pyexiv2.ExifTag(self._getExifKey_TimeCode(), pNewValue)
         meta.write()
def write_position(image_file, pos):
    metadata = pyexiv2.ImageMetadata(image_file)
    metadata.read()
    key = 'Exif.Photo.UserComment'
    value = 'position: %d,%d' % (pos[0], pos[1])
    metadata[key] = pyexiv2.ExifTag(key, value)
    metadata.write()
示例#6
0
def put(hostname, id, flag):
    try:
        response = os.system("ping -c 1 " + hostname + " > /dev/null 2>&1") # -t 3 нужно ли?
        if response != 0:
            print("Host unreachable")
            return 104
        mail = str(id) + "@yandex.ru"
        password = hashlib.md5(str(id) + "verysibirctfhardhardpass")

        r = requests.post('http://' + hostname + ":" + str(PORT)+ "/login", 
            data={ 'mail' : mail, 'password': password.hexdigest() }
            );

        cookie = {'connect.sid': r.cookies['connect.sid']}
        
        # Attach tags in photo
        r = requests.get('http://api-fotki.yandex.ru/api/top/')

        urls = re.findall(r'href="([^"]*_XL)"', r.text)
        url = urls[random.randint(1,len(urls))]

        page = requests.get(url)
        with open('/tmp/image.jpg', 'wb') as test:
            test.write(page.content)


        metadata = pyexiv2.ImageMetadata('/tmp/image.jpg')
        
        metadata.read()

        key = 'Exif.Image.Artist'

        metadata[key] = pyexiv2.ExifTag(key, flag)
    
        metadata.write()



        data = { 'descr': '', 'geo': flag }
        files = { 'photo': ('112.jpg', 
            open('/tmp/image.jpg', 'r'),
            'image/jpeg'
        ) }
        r = requests.post('http://' + hostname + ":" + str(PORT)+ "/add", 
            cookies=cookie,
            data=data,
            files=files
            ); 


        if "added" not in r.text:
            print "Can't add photo"
            return 103


        return 101
   
    except:
        print("Error happend")
        return 102
 def __write_md5_into_photo_exif(self):
     if self.type == "photo":
         try:
             metadata = pyexiv2.ImageMetadata(self.fullpath)
             metadata.read()
             # write the md5 into UserComment of exif
             if self.__is_md5(self.md5):
                 metadata['Exif.Photo.UserComment'] = pyexiv2.ExifTag(
                     'Exif.Photo.UserComment', self.md5)
                 metadata.write()
         except:
             pass
示例#8
0
    def convert(self):
        in_datasets = self._find_in_datasets()

        # map input structure to output
        out_pr = sly.ProjectStructure(self.settings['res_names']['project'])

        for ds_name, ds_path in in_datasets:
            img_fnames = sly.ImportImgLister.list_images(ds_path)
            for name_with_ext in img_fnames:
                img_name, img_ext = osp.splitext(name_with_ext)
                src_img_path = osp.join(ds_path, name_with_ext)
                dt = {
                    'src_img_path': src_img_path,
                    'image_ext': img_ext,
                }
                out_pr.add_item(ds_name, img_name, dt)
            logger.info(
                'Found source dataset with raw images: "{}", {} sample(s).'.
                format(ds_name, len(img_fnames)))

        out_pr_fs = sly.ProjectFS(self.out_dir, out_pr)
        out_pr_fs.make_dirs()

        res_meta = sly.ProjectMeta()  # empty
        res_meta.to_dir(out_pr_fs.project_path)

        progress = sly.progress_counter_import(out_pr.name, out_pr.image_cnt)
        for sample_info in out_pr_fs:
            sample_data = sample_info.ia_data
            src_img_path = sample_data['src_img_path']
            sly.copy_file(src_img_path, sample_info.img_path)  # img is ready

            image = Image.open(sample_info.img_path)
            exif_data = pyexiv2.metadata.ImageMetadata(sample_info.img_path)
            exif_data.read()

            if exif_data.get_orientation() != 1:
                logger.debug('Image with flip/rot EXIF',
                             extra={
                                 'orientation': exif_data.get_orientation(),
                                 'image_path': sample_info.img_path
                             })
                image = sly.image_transpose_exif(image)
                image.save(sample_info.img_path)
                exif_data['Exif.Image.Orientation'] = pyexiv2.ExifTag(
                    'Exif.Image.Orientation', 1)
                exif_data.modified = True
                exif_data.write()

            imsize_wh = image.size
            ann = sly.Annotation.new_with_objects(imsize_wh, [])
            sly.json_dump(ann.pack(), sample_info.ann_path)  # ann is ready
            progress.iter_done_report()
示例#9
0
    def set_position(self, coords):
        lat, lon = coords
        frac_lat = Image._dec_to_sex(abs(float(lat)))
        sign_lat = 'S' if lat < 0 else 'N'
        frac_lon = Image._dec_to_sex(abs(float(lon)))
        sign_lon = 'W' if lon < 0 else 'E'

        k = 'Exif.GPSInfo.GPSLatitudeRef'
        self._metadata[k] = pyexiv2.ExifTag(k, sign_lat)
        k = 'Exif.GPSInfo.GPSLatitude'
        self._metadata[k] = pyexiv2.ExifTag(k, frac_lat)

        k = 'Exif.GPSInfo.GPSLongitudeRef'
        self._metadata[k] = pyexiv2.ExifTag(k, sign_lon)
        k = 'Exif.GPSInfo.GPSLongitude'
        self._metadata[k] = pyexiv2.ExifTag(k, frac_lon)

        # Commit
        self._metadata.write()

        print 'Position of {} is now {} - {}'.format( \
                        self._fullpath, coords[0], coords[1])
示例#10
0
    def set_datetime(self, new_datetime):
        """
        Update EXIF/XMP tags as needed and write metadata.
        """
        # TODO: Timezone?
        xmp_datetime = new_datetime.strftime('%Y-%m-%dT%H:%M:%S')
        exif_datetime = new_datetime.strftime('%Y:%m:%d %H:%M:%S')
        logger.debug("XMP: {} : EXIF: {}".format(xmp_datetime, exif_datetime))

        # Shotwell will use Xmp.xmp.CreateDate if set, so it must be updated.
        if 'Xmp.xmp.CreateDate' in self['metadata'].keys():
            self.img_md['Xmp.xmp.CreateDate'] = pyexiv2.XmpTag(
                    'Xmp.xmp.CreateDate', new_datetime)
        if 'Exif.Photo.DateTimeOriginal' in self['metadata'].keys():
            self.img_md['Exif.Photo.DateTimeOriginal'] = pyexiv2.ExifTag(
                    'Exif.Photo.DateTimeOriginal', new_datetime)
        self.img_md['Exif.Image.DateTime'] = pyexiv2.ExifTag(
                'Exif.Image.DateTime', new_datetime)

        try:
            self.img_md.write()
        except Exception as e:
            logger.error(e)
示例#11
0
def move_date_taken(sql, photoids, dtfix, giventime):
    if not sql is None:
        logging.debug('Getting photo ids from database.')
        photoids = get_int_list_from_database(sql)

    if not isinstance(photoids, list):
        photoids = photoids.split(',')

    photoids = [int(i) for i in photoids]
    setidtoset, photoidtophoto = get_local_sets_and_photos()
    # Ensure that all photos have been loaded by constructing a dictionary.

    photoidtolocalphoto = dict([[id, os.path.join(photorootdir, photoidtophoto[id][0][0], photoidtophoto[id][0][1])] for id in photoids])
    datekeys = ['Exif.Photo.DateTimeOriginal', 'Exif.Photo.DateTimeDigitized']
    photoidtodatetime = dict()
        
    for id in photoidtolocalphoto:
        metadata = pyexiv2.ImageMetadata(photoidtolocalphoto[id])
        metadata.read()
        for datekey in datekeys:
            if datekey in metadata.exif_keys:
                dt = metadata[datekey].value
                if id not in photoidtodatetime:
                    photoidtodatetime[id] = dt
                elif dt != photoidtodatetime[id]:
                    raise Exception('Different dates in photo.')
        if id not in photoidtodatetime:
            if giventime is not None:
                photoidtodatetime[id] = giventime
            else:
                raise 'No take date found from photo'
    for id in photoidtolocalphoto:
        logging.debug('Changing taken dates of photo %s %s.' % (id, photoidtolocalphoto[id]))
        metadata = pyexiv2.ImageMetadata(photoidtolocalphoto[id])
        metadata.read()

        dt = photoidtodatetime[id]
        if giventime is None:
            dt = dt + dtfix
        for datekey in datekeys:
            if datekey in metadata.exif_keys:
                metadata[datekey].value = dt
            else:
                metadata[datekey] = pyexiv2.ExifTag(datekey, dt)
            metadata.write()

    for id in photoidtolocalphoto:
        logging.debug('Replacing photo %s ''%s''.' % (id, photoidtolocalphoto[id]))
        flickr_api.Upload.replace(photo_id = id, async = False, photo_file = photoidtolocalphoto[id])
示例#12
0
def copy_image_metadata(source_file, dest_file):
    source_metadata = pyexiv2.ImageMetadata(source_file)
    source_metadata.read()

    dest_metadata = pyexiv2.ImageMetadata(dest_file)
    dest_metadata.read()

    for key in source_metadata.exif_keys:
        tag = source_metadata[key]
        try:
            dest_metadata[key] = pyexiv2.ExifTag(key, tag.value)
        except:
            pass

    dest_metadata.write()
示例#13
0
def image_cap():
    cap = cv2.VideoCapture(0)  #zero is first webcam attatched
    filename = ''  #redefines the filename as an open string
    if cap.isOpened():  #checks if webcam is up and running
        ret, frame = cap.read()  #capture single frame from the webcam to read
    else:
        ret = False

    if ret:
        '''GPS Exif Tag Description: A pointer to the GPS Info IFD. The interoperability
		structure of the GPS Info IFD, like that of Exif IFD, has no image data
		Blah
		Need to install pyexiv package
		pyexiv2 is a module that allows your python scripts to read and write data
		embedded in image files
		'''
        date = datetime.datetime.utcnow().strftime(
            '%Y-%m-%d-%H-%M-%S')  #sets date to be current date/time in UTC
        filename = 'GrainImage_%s.png' % date  #writes filename with UTC date & time
        path = "/home/pi/Grover_control_scripts/"  # path file name to save to new directory on pi
        cv2.imwrite(
            os.path.join(path, filename), frame
        )  #writes the frame to the designated path with the desired filename
        #print(filename) #sanity check to make sure filename is storing properly
        metadata = pyexiv2.ImageMetadata(
            '/home/pi/Grover_control_scripts/' +
            filename)  #calls for the metadata off of the image
        metadata.read()  #reads the metadata
        metadata.modified = True  #checks to see if the metadata can be modified
        metadata.writable = os.access(
            '/home/pi/Grover_control_scripts/' + filename, os.W_OK
        )  #makes sure the file in the defined path is readable for metadata
        key = 'Exif.Image.ImageDescription'  #reference for saving the gps data in the exif tag
        lat = (vehicle.location.global_frame.lat
               )  #sets lat to be the rover's latitude from dronekit
        lon = (vehicle.location.global_frame.lon
               )  #sets Lon to be the rover's Longitude from dronekit
        alt = (vehicle.location.global_frame.alt
               )  #sets Alt to be the rover's Altitude from dronekit
        value = '(%s, %s, %s)' % (
            lat, lon, alt
        )  #takes Lat, Lon, and Alt and sets it to be the exif tag value
        metadata[key] = pyexiv2.ExifTag(
            key, value)  #sets the key and value to the exif tag
        metadata.write()  #writes the new tag to the metadata

    cap.release()  #relases the camera function
示例#14
0
文件: picpi2.py 项目: ascheel/picpi
    def copy_metadata(self, src_file, dest_file):
        self.log('Copying exif data.', 2)
        #Get Source metadata
        srcmeta = pyexiv2.ImageMetadata(src_file)
        srcmeta.read()

        #Get Destination metadata
        destmeta = pyexiv2.ImageMetadata(dest_file)
        destmeta.read()

        #Fix Orientation
        key = 'Exif.Image.Orientation'
        value = 1
        srcmeta[key] = pyexiv2.ExifTag(key, value)

        #Copy it
        srcmeta.copy(destmeta)
        destmeta.write()
示例#15
0
def setProperty(type, property, photo, folderPath):
    metadata = pyexiv2.ImageMetadata(photo)
    metadata.read()
    metadata.modified = True
    metadata.writable = os.access(photo, os.W_OK)
    if type == "comment":
        key = 'Exif.Photo.UserComment'
    elif type == "people":
        key = 'Exif.Image.ImageID'
    elif type == "location":
        key = 'Exif.Image.SecurityClassification'
    elif type == "tags":
        key = 'Exif.Photo.CameraOwnerName'
    elif type == "favorite":
        key = 'Exif.Photo.BodySerialNumber'
    metadata[key] = pyexiv2.ExifTag(key, property)
    metadata.write()
    if (os.path.exists(folderPath + "search.json")):
        editJson(photo, folderPath, type, property)
示例#16
0
def main():
    cap = cv2.VideoCapture(0)  #zero is first webcam attatched
    filename = ''
    if cap.isOpened():  #checks if webcam is up and running
        ret, frame = cap.read()  #capture single frame from the webcam to read

#cv2.imshow('frame',frame)
    else:
        ret = False

    if ret:
        '''GPS Exif Tag Description: A pointer to the GPS Info IFD. The interoperability
            	structure of the GPS Info IFD, like that of Exif IFD, has no image data
        	Need to install pyexiv package
        	pyexiv2 is a module that allows your python scripts to read and write data
            	embedded in image files
		'''
        #%m_%d_%Y - month_day_year
        #filename = "GrainImage_.png" #+ str(now) + ".png"
        filename = 'GrainImage_%s.png' % datetime.datetime.utcnow().strftime(
            '%Y-%m-%d-%H-%M-%S')  #writes filename with UTC date & time
        #path = 'C:/Users/Courtney/Documents/Github/Grover_control_scripts'
        #cv2.imwrite(os.path.join(path, filename), frame)
        print(
            filename)  #sanity check to make sure filename is storing properly
        cv2.imwrite(filename, frame)  #writes the frame to an image file
        #filename+=new_filename
        metadata = pyexiv2.ImageMetadata(
            filename)  #calls for the metadata off of the image
        metadata.read()  #reads the metadata
        key = 'Exif.Image.GPSTag'  #reference for saving the gps data in the exif tag
        alue = [
            int(vehicle.location.global_frame.lat),
            int(vehicle.location.global_frame.lon),
            int(vehicle.location.global_frame.alt)
        ]  #takes the gps data from dronekit
        metadata[key] = pyexiv2.ExifTag(
            key, value)  #writes the key and value to the exif tag

    cap.release()  #relases the camera function
示例#17
0
    def set_date_taken(self, time):
        """Set the date/time a photo was taken.

        :param datetime time: datetime object of when the photo was taken
        :returns: bool
        """
        if (time is None):
            return False

        source = self.source
        exif_metadata = pyexiv2.ImageMetadata(source)
        exif_metadata.read()

        # Writing exif with pyexiv2 differs if the key already exists so we
        #   handle both cases here.
        for key in ['Exif.Photo.DateTimeOriginal', 'Exif.Image.DateTime']:
            if (key in exif_metadata):
                exif_metadata[key].value = time
            else:
                exif_metadata[key] = pyexiv2.ExifTag(key, time)

        exif_metadata.write()
        return True
示例#18
0
    def __init__(self, conf, photoname, album):
        # Parameters storage
        self.conf = conf
        self.originalname = photoname
        self.originalpath = album['path']
        self.albumid = album['id']
        self.albumname = album['name']

        # if star in file name, photo is starred
        if ('star' in self.originalname) or ('cover' in self.originalname):
            self.star = 1

        # Compute Photo ID
        self.id = str(int(time.time()))
        # not precise enough
        length = len(self.id)
        if length < 14:
            missing_char = 14 - length
            r = random.random()
            r = str(r)
            # last missing_char char
            filler = r[-missing_char:]
            self.id = self.id + filler

        assert len(self.id) == 14, "id {} is not 14 character long: {}".format(
            self.id, str(len(self.id)))

        # Compute file storage url
        m = hashlib.md5()
        m.update(self.id.encode('utf-8'))
        crypted = m.hexdigest()

        ext = os.path.splitext(photoname)[1]
        self.url = ''.join([crypted, ext]).lower()
        self.thumbUrl = self.url

        # src and dest fullpath
        self.srcfullpath = os.path.join(self.originalpath, self.originalname)
        self.destfullpath = os.path.join(self.conf["lycheepath"], "uploads",
                                         "big", self.url)

        # Generate file checksum
        self.__generateHash()

        # thumbnails already in place (see makeThumbnail)

        # Auto file some properties
        self.type = mimetypes.guess_type(self.originalname, False)[0]
        self.size = decimal.Decimal(os.path.getsize(
            self.srcfullpath)).quantize(decimal.Decimal('.01'),
                                        rounding=decimal.ROUND_05UP)
        self.size = str(self.size / 1024) + " KB"
        # Default date
        takedate = datetime.date.today().isoformat()
        taketime = datetime.datetime.now().strftime('%H:%M:%S')
        self._str_datetime = takedate + " " + taketime

        # Exif Data Parsing
        self.exif = ExifData()
        try:

            metadata = pyexiv2.ImageMetadata(self.srcfullpath)

            metadata.read()
            if "Exif.Photo.PixelXDimension" in metadata.exif_keys:
                w = metadata['Exif.Photo.PixelXDimension'].value
                h = metadata['Exif.Photo.PixelYDimension'].value
            else:
                img = Image.open(self.srcfullpath)
                w, h = img.size
                metadata['Exif.Photo.PixelXDimension'] = pyexiv2.ExifTag(
                    'Exif.Photo.PixelXDimension', w)
                metadata['Exif.Photo.PixelYDimension'] = pyexiv2.ExifTag(
                    'Exif.Photo.PixelYDimension', h)

                metadata.write()

            self.width = float(w)
            self.height = float(h)

            # exifinfo = img.info['exif']
            # logger.debug(exifinfo)

            if "Exif.Image.Orientation" in metadata.exif_keys:
                self.exif.orientation = metadata[
                    'Exif.Image.Orientation'].value
            if "Exif.Image.Make" in metadata.exif_keys:
                self.exif.make = metadata['Exif.Image.Make'].value
            if "Exif.Photo.MaxApertureValue" in metadata.exif_keys:
                aperture = math.sqrt(
                    2)**metadata['Exif.Photo.MaxApertureValue'].value
                try:
                    aperture = decimal.Decimal(aperture).quantize(
                        decimal.Decimal('.1'), rounding=decimal.ROUND_05UP)
                except Exception as e:
                    logger.debug(
                        "aperture only a few digit after comma: {}".format(
                            aperture))
                    logger.debug(e)
                self.exif.aperture = aperture
            if "Exif.Photo.FocalLength" in metadata.exif_keys:
                focal = metadata['Exif.Photo.FocalLength'].value * 1.0
                self.exif.focal = decimal.Decimal(focal).quantize(
                    decimal.Decimal('0.1'), rounding=decimal.ROUND_05UP)
            if "Exif.Photo.ISOSpeedRatings" in metadata.exif_keys:
                self.exif.iso = metadata['Exif.Photo.ISOSpeedRatings'].value
            if "Exif.Image.Model" in metadata.exif_keys:
                self.exif.model = metadata['Exif.Image.Model'].value
            if "Exif.Photo.ExposureTime" in metadata.exif_keys:
                self.exif.exposure = metadata['Exif.Photo.ExposureTime'].value
            if "Exif.Photo.ExposureTime" in metadata.exif_keys:
                s = metadata['Exif.Photo.ExposureTime'].value
                numer = s.numerator
                denom = s.denominator
                if denom / numer >= 1:
                    s = Fraction(
                        int(
                            decimal.Decimal(
                                s.numerator / s.numerator).quantize(
                                    decimal.Decimal('1'),
                                    rounding=decimal.ROUND_HALF_EVEN)),
                        int(
                            decimal.Decimal(
                                s.denominator / s.numerator).quantize(
                                    decimal.Decimal('1'),
                                    rounding=decimal.ROUND_HALF_EVEN)))
                else:
                    s *= 1.0
                    s = int(s)
                self.exif.shutter = str(s)
            if "Exif.Photo.DateTimeOriginal" in metadata.exif_keys:
                try:
                    self.exif.takedate = metadata[
                        'Exif.Photo.DateTimeOriginal'].raw_value.split(" ")[0]
                except Exception as e:
                    logger.warn('invalid takedate: ' + str(
                        metadata['Exif.Photo.DateTimeOriginal'].raw_value) +
                                ' for ' + self.srcfullpath)
            if "Exif.Photo.DateTimeOriginal" in metadata.exif_keys:
                try:
                    self.exif.taketime = metadata[
                        'Exif.Photo.DateTimeOriginal'].raw_value.split(" ")[1]
                except Exception as e:
                    logger.warn('invalid taketime: ' + str(
                        metadata['Exif.Photo.DateTimeOriginal'].raw_value) +
                                ' for ' + self.srcfullpath)

            if "Exif.Photo.DateTime" in metadata.exif_keys and self.exif.takedate is None:
                try:
                    self.exif.takedate = metadata[
                        'Exif.Photo.DateTime'].raw_value.split(" ")[0]
                except Exception as e:
                    logger.warn(
                        'DT invalid takedate: ' +
                        str(metadata['Exif.Photo.DateTime'].raw_value) +
                        ' for ' + self.srcfullpath)

            if "Exif.Photo.DateTime" in metadata.exif_keys and self.exif.taketime is None:
                try:
                    self.exif.taketime = metadata[
                        'Exif.Photo.DateTime'].raw_value.split(" ")[1]
                except Exception as e:
                    logger.warn(
                        'DT invalid taketime: ' +
                        str(metadata['Exif.Photo.DateTime'].raw_value) +
                        ' for ' + self.srcfullpath)
            if "Iptc.Application2.ObjectName" in metadata.iptc_keys:
                self.title = metadata[
                    'Iptc.Application2.ObjectName'].raw_value or self.originalname
            if "Xmp.xmp.Rating" in metadata.xmp_keys:
                self.star = int(metadata['Xmp.xmp.Rating'].raw_value) or 0
            if "Iptc.Application2.Caption" in metadata.iptc_keys:
                self.description = metadata[
                    'Iptc.Application2.Caption'].raw_value or ""
            if "Iptc.Application2.Keywords" in metadata.iptc_keys:
                tags = metadata['Iptc.Application2.Keywords'].value or {""}
                self.tags = ','.join(tags)
            # compute shutter speed

            if not (self.exif.shutter) and self.exif.exposure:
                if self.exif.exposure < 1:
                    e = str(Fraction(self.exif.exposure).limit_denominator())
                else:
                    e = decimal.Decimal(self.exif.exposure).quantize(
                        decimal.Decimal('0.01'), rounding=decimal.ROUND_05UP)
                self.exif.shutter = e

            if self.exif.shutter:
                self.exif.shutter = str(self.exif.shutter) + " s"
            else:
                self.exif.shutter = ""

            if self.exif.exposure:
                self.exif.exposure = str(self.exif.exposure) + " s"
            else:
                self.exif.exposure = ""

            if self.exif.focal:
                self.exif.focal = str(self.exif.focal) + " mm"
            else:
                self.exif.focal = ""

            if self.exif.aperture:
                self.exif.aperture = 'F' + str(self.exif.aperture)
            else:
                self.exif.aperture = ""

            # compute takedate / taketime
            if self.exif.takedate:
                takedate = self.exif.takedate.replace(':', '-')
                self.exif.takedate = takedate
                taketime = '00:00:00'

            if self.exif.taketime:
                taketime = self.exif.taketime

            # add mesurement units

            self._str_datetime = takedate + " " + taketime

        except IOError as e:
            logger.debug('ioerror (corrupted ?): ' + self.srcfullpath)
            raise e
示例#19
0
    def utm_to_latlon(self, _file, _photo, idx):

        gcp = self.gcps[idx]

        kwargs = {
            'epsg': self.epsg,
            'file': _file,
            'x': gcp.x + self.utm_east_offset,
            'y': gcp.y + self.utm_north_offset,
            'z': gcp.z
        }

        latlon = system.run_and_return(
            'echo {x} {y} {z} '.format(**kwargs),
            'gdaltransform -s_srs \"EPSG:{epsg}\" '
            '-t_srs \"EPSG:4326\"'.format(**kwargs)).split()

        # Example: 83d18'16.285"W
        # Example: 41d2'11.789"N
        # Example: 0.998

        if len(latlon) == 3:
            lon_str, lat_str, alt_str = latlon
        elif len(latlon) == 2:
            lon_str, lat_str = latlon
            alt_str = ''
        else:
            log.ODM_ERROR('Something went wrong %s' % latlon)

        lat_frac = self.coord_to_fractions(latlon[1], ['N', 'S'])
        lon_frac = self.coord_to_fractions(latlon[0], ['E', 'W'])

        # read image metadata
        metadata = pyexiv2.ImageMetadata(_photo.path_file)
        metadata.read()

        # set values

        # GPS latitude
        key = 'Exif.GPSInfo.GPSLatitude'
        value = lat_frac[0].split(' ')
        log.ODM_DEBUG('lat_frac: %s %s %s' % (value[0], value[1], value[2]))
        metadata[key] = pyexiv2.ExifTag(
            key, [Fraction(value[0]),
                  Fraction(value[1]),
                  Fraction(value[2])])

        key = 'Exif.GPSInfo.GPSLatitudeRef'
        value = lat_frac[1]
        metadata[key] = pyexiv2.ExifTag(key, value)

        # GPS longitude
        key = 'Exif.GPSInfo.GPSLongitude'
        value = lon_frac[0].split(' ')
        metadata[key] = pyexiv2.ExifTag(
            key, [Fraction(value[0]),
                  Fraction(value[1]),
                  Fraction(value[2])])

        key = 'Exif.GPSInfo.GPSLongitudeRef'
        value = lon_frac[1]
        metadata[key] = pyexiv2.ExifTag(key, value)

        # GPS altitude
        altitude = abs(int(float(latlon[2]) * 100))
        key = 'Exif.GPSInfo.GPSAltitude'
        value = Fraction(altitude, 1)
        metadata[key] = pyexiv2.ExifTag(key, value)

        if latlon[2] >= 0:
            altref = '0'
        else:
            altref = '1'
        key = 'Exif.GPSInfo.GPSAltitudeRef'
        metadata[key] = pyexiv2.ExifTag(key, altref)

        # write values
        metadata.write()
示例#20
0
def setDatetimeExif(filepath, timestamp):
    metadata = pyexiv2.ImageMetadata(filepath)
    metadata.read()
    key = 'Exif.Photo.DateTimeOriginal'
    metadata[key] = pyexiv2.ExifTag(key, timestamp)
    metadata.write()
示例#21
0
def EverythingUseageCheck(p_fileEntry, p_testfilelist, f_outpath=g_outpath):
    #the file you load better have all this metadata in it.
    f_picID = p_testfilelist[p_fileEntry]
    f_filename = getGoogleDrivePicture(f_picID, f_outpath)
    f_metadata = pyexiv2.ImageMetadata(f_filename)
    f_metadata.read()
    print(f_metadata.exif_keys)
    #-------------Title--------------------------------------
    key1 = 'Exif.Image.XPTitle'
    f_keywords1 = f_metadata[key1]
    f_dirtyString1 = pyexiv2.utils.undefined_to_string(f_keywords1.value)
    print("titleUseageCheck() f_dirtyString1: \t\t", f_dirtyString1)
    f_cleanThing1 = MetadataManagerL0.dirtyStr2cleanStr(f_dirtyString1)
    print("titleUseageCheck() Title\t\t", f_cleanThing1)
    # -------------Tags--------------------------------------
    key2 = 'Exif.Image.XPTitle'
    f_keywords2 = f_metadata[key2]
    f_dirtyString2 = pyexiv2.utils.undefined_to_string(f_keywords2.value)
    print("titleUseageCheck() f_dirtyString2: \t\t", f_dirtyString2)
    f_cleanThing2 = MetadataManagerL0.dirtyStr2cleanList(f_dirtyString2)
    print("titleUseageCheck() Tags\t\t", f_cleanThing2)
    # -------------Artist--------------------------------------
    key3 = 'Exif.Image.XPAuthor'
    f_keywords3 = f_metadata[key3]
    f_dirtyString3 = pyexiv2.utils.undefined_to_string(f_keywords3.value)
    print("titleUseageCheck() f_dirtyString3: \t\t", f_dirtyString3)
    f_cleanThing3 = MetadataManagerL0.dirtyStr2cleanList(f_dirtyString3)
    print("titleUseageCheck() Artist\t\t", f_cleanThing3)
    # -------------Description--------------------------------------
    key4 = 'Exif.Image.XPComment'
    f_keywords4 = f_metadata[key4]
    f_dirtyString4 = pyexiv2.utils.undefined_to_string(f_keywords4.value)
    print("titleUseageCheck() f_dirtyString4: \t\t", f_dirtyString4)
    f_cleanThing4 = MetadataManagerL0.dirtyStr2cleanStr(f_dirtyString4)
    print("titleUseageCheck() Description\t\t", f_cleanThing4)
    # -------------Rating--------------------------------------
    key5 = 'Exif.Image.Rating'
    f_keywords5 = f_metadata[key5]
    print("titleUseageCheck() f_keywords5: \t\t", f_keywords5)
    print("titleUseageCheck() f_keywords5.value: \t\t", f_keywords5.value)
    #f_metadata.__delitem__('Exif.Image.Rating')
    #f_metadata.__delitem__('Exif.Image.RatingPercent')
    #f_metadata.write()
    #f_metadata.read()
    #print(f_metadata.exif_keys)

    # ------------Source URL-----------------------------------

    key6 = 'Exif.Image.ImageHistory'
    value6 = "modified by file tagger"
    f_metadata[key6] = pyexiv2.ExifTag(key6, value6)
    f_metadata.write()
    f_metadata.read()
    print(f_metadata.exif_keys)
    f_keywords6 = f_metadata[key6]
    print("titleUseageCheck() f_keywords6: \t\t", f_keywords6)
    print("titleUseageCheck() f_keywords6.value: \t\t", f_keywords6.value)
    print("titleUseageCheck() type(f_keywords6.value): \t\t",
          type(f_keywords6.value))

    # ------------Original Date--------------------------------

    key7 = 'Exif.Photo.DateTimeOriginal'
    f_keywords7 = f_metadata[key7]
    print("titleUseageCheck() f_keywords7: \t\t", f_keywords7)
    print("titleUseageCheck() f_keywords7.value: \t\t", f_keywords7.value)
    print("titleUseageCheck() type(f_keywords7.value): \t\t",
          type(f_keywords7.value))

    #f_dirtyTagString = pyexiv2.utils.undefined_to_string(f_keywords.value)
    #print("titleUseageCheck() f_dirtyTagString\t\t", f_dirtyTagString)
    #f_cleanTagList = MetadataManager.dirtyStr2cleanList(f_dirtyTagString)
    #print("titleUseageCheck() f_cleanTagList\t\t", f_cleanTagList)
    #f_dirtyTagString2 = MetadataManager.cleanList2dirtyStr(f_cleanTagList)
    #print("titleUseageCheck() f_dirtyTagString2\t\t", f_dirtyTagString2)
    os.remove(f_filename)
    return
示例#22
0
'''
Edit pictures EXIF metadata. Add titles and tags by reading excel files contains file names, titles and tags columns.
'''

import pyexiv2
import pandas as pd


#### insert TITLES ####
import pyexiv2
data = pd.read_excel('<xlsx file name>','fixed') # Enter excel file name 
for i in range(len(data['file_name'])):
    metadata = pyexiv2.ImageMetadata('<Pictures folder location>'+data['file_name'][i]) # Enter pictures folder path 
    metadata.read()
    key = 'Exif.Image.ImageDescription'
    value = data['long description'][i]
    metadata[key] = pyexiv2.ExifTag(key, value)
    metadata.write()
    
#### insert TAGS ####
import pyexiv2
data = pd.read_excel('<xlsx file name>','fixed')  # Enter excel file name
for i in range(len(data['file_name'])):
    metadata = pyexiv2.ImageMetadata('<Pictures folder location>'+data['file_name'][i]) # Enter pictures folder path
    metadata.read()
    metadata['Exif.Image.XPKeywords']=pyexiv2.utils.string_to_undefined(data['TAGS'][i].encode('utf-16'))
    metadata.write()