Beispiel #1
0
    def read(self, extension=None, quality=None):
        if quality is None:
            quality = self.context.config.QUALITY

        options = None
        extension = extension or self.extension
        try:
            if FORMATS[extension] == 'JPEG':
                options = [cv2.IMWRITE_JPEG_QUALITY, quality]
        except KeyError:
            # default is JPEG so
            options = [cv2.IMWRITE_JPEG_QUALITY, quality]

        try:
            if FORMATS[extension] == 'WEBP':
                options = [cv2.IMWRITE_WEBP_QUALITY, quality]
        except KeyError:
            options = [cv2.IMWRITE_JPEG_QUALITY, quality]

        success, buf = cv2.imencode(extension, self.image, options or [])
        data = buf.tostring()

        if FORMATS[extension] == 'JPEG' and self.context.config.PRESERVE_EXIF_INFO:
            if hasattr(self, 'exif') and self.exif != None:
                img = JpegFile.fromString(data)
                img._segments.insert(0, ExifSegment(self.exif_marker, None, self.exif, 'rw'))
                data = img.writeString()

        return data
    def create_image(self, buffer, create_alpha=True):
        self.extension = self.extension or '.tif'
        self.no_data_value = None
        # FIXME: opencv doesn't support gifs, even worse, the library
        # segfaults when trying to decoding a gif. An exception is a
        # less drastic measure.
        try:
            if FORMATS[self.extension] == 'GIF':
                raise ValueError("opencv doesn't support gifs")
        except KeyError:
            pass

        if FORMATS[self.extension] == 'TIFF':
            self.buffer = buffer
            img0 = self.read_tiff(buffer, create_alpha)
        else:
            imagefiledata = cv.CreateMatHeader(1, len(buffer), cv.CV_8UC1)
            cv.SetData(imagefiledata, buffer, len(buffer))
            img0 = cv.DecodeImageM(imagefiledata, cv.CV_LOAD_IMAGE_UNCHANGED)

        if FORMATS[self.extension] == 'JPEG':
            try:
                info = JpegFile.fromString(buffer).get_exif()
                if info:
                    self.exif = info.data
                    self.exif_marker = info.marker
            except Exception:
                pass
        return img0
Beispiel #3
0
    def read(self, extension=None, quality=None):
        if not extension and FORMATS[self.extension] == 'TIFF':
            # If the image loaded was a tiff, return the buffer created earlier.
            return self.buffer
        else:
            if quality is None:
                quality = self.context.config.QUALITY
            options = None
            self.extension = extension or self.extension

            try:
                if FORMATS[self.extension] == 'JPEG':
                    options = [cv2.IMWRITE_JPEG_QUALITY, quality]
            except KeyError:
                options = [cv2.IMWRITE_JPEG_QUALITY, quality]

            if FORMATS[self.extension] == 'TIFF':
                channels = cv2.split(numpy.asarray(self.image))
                data = self.write_channels_to_tiff_buffer(channels)
            else:
                success, numpy_data = cv2.imencode(self.extension, numpy.asarray(self.image), options or [])
                if success:
                    data = numpy_data.tostring()
                else:
                    raise Exception("Failed to encode image")

            if FORMATS[self.extension] == 'JPEG' and self.context.config.PRESERVE_EXIF_INFO:
                if hasattr(self, 'exif'):
                    img = JpegFile.fromString(data)
                    img._segments.insert(0, ExifSegment(self.exif_marker, None, self.exif, 'rw'))
                    data = img.writeString()

        return data
    def create_image(self, buffer, create_alpha=True):
        self.extension = self.extension or '.tif'
        self.no_data_value = None
        # FIXME: opencv doesn't support gifs, even worse, the library
        # segfaults when trying to decoding a gif. An exception is a
        # less drastic measure.
        try:
            if FORMATS[self.extension] == 'GIF':
                raise ValueError("opencv doesn't support gifs")
        except KeyError:
            pass

        if FORMATS[self.extension] == 'TIFF':
            self.buffer = buffer
            img = self.read_tiff(buffer, create_alpha)
        else:
            img = cv2.imdecode(np.frombuffer(buffer, np.uint8), -1)

        if FORMATS[self.extension] == 'JPEG':
            self.exif = None
            try:
                info = JpegFile.fromString(buffer).get_exif()
                if info:
                    self.exif = info.data
                    self.exif_marker = info.marker
            except Exception:
                pass
        return img
Beispiel #5
0
    def create_image(self, buffer, create_alpha=True):
        self.extension = self.extension or '.tif'
        self.no_data_value = None
        # FIXME: opencv doesn't support gifs, even worse, the library
        # segfaults when trying to decoding a gif. An exception is a
        # less drastic measure.
        try:
            if FORMATS[self.extension] == 'GIF':
                raise ValueError("opencv doesn't support gifs")
        except KeyError:
            pass

        if FORMATS[self.extension] == 'TIFF':
            self.buffer = buffer
            img0 = self.read_tiff(buffer, create_alpha)
        else:
            imagefiledata = cv.CreateMatHeader(1, len(buffer), cv.CV_8UC1)
            cv.SetData(imagefiledata, buffer, len(buffer))
            img0 = cv.DecodeImageM(imagefiledata, cv.CV_LOAD_IMAGE_UNCHANGED)

        if FORMATS[self.extension] == 'JPEG':
            try:
                info = JpegFile.fromString(buffer).get_exif()
                if info:
                    self.exif = info.data
                    self.exif_marker = info.marker
            except Exception:
                pass
        return img0
Beispiel #6
0
    def read(self, extension=None, quality=None):
        if not extension and FORMATS[self.extension] == 'TIFF':
            # If the image loaded was a tiff, return the buffer created earlier.
            return self.buffer
        else:
            if quality is None:
                quality = self.context.config.QUALITY
            options = None
            self.extension = extension or self.extension

            try:
                if FORMATS[self.extension] == 'JPEG':
                    options = [cv2.IMWRITE_JPEG_QUALITY, quality]
            except KeyError:
                options = [cv2.IMWRITE_JPEG_QUALITY, quality]

            if FORMATS[self.extension] == 'TIFF':
                channels = cv2.split(numpy.asarray(self.image))
                data = self.write_channels_to_tiff_buffer(channels)
            else:
                success, numpy_data = cv2.imencode(self.extension, numpy.asarray(self.image), options or [])
                if success:
                    data = numpy_data.tostring()
                else:
                    raise Exception("Failed to encode image")

            if FORMATS[self.extension] == 'JPEG' and self.context.config.PRESERVE_EXIF_INFO:
                if hasattr(self, 'exif'):
                    img = JpegFile.fromString(data)
                    img._segments.insert(0, ExifSegment(self.exif_marker, None, self.exif, 'rw'))
                    data = img.writeString()

        return data
    def read(self, extension=None, quality=None):
        if not extension and FORMATS[self.extension] == 'TIFF':
            # If the image loaded was a tiff, return the buffer created earlier.
            return self.buffer
        else:
            if quality is None:
                quality = self.context.config.QUALITY
            options = None
            extension = extension or self.extension

            # Check if we should write a JPEG. If we are allowing defaulting to jpeg
            # and if the alpha channel is all white (opaque).
            channels = None
            if getattr(self.context.request, 'default_to_jpeg', True):
                channels = cv2.split(numpy.asarray(self.image))
                if len(channels) > 3 and numpy.all(channels[3] == 255):
                    extension = '.jpg'

            try:
                if FORMATS[extension] == 'JPEG':
                    options = [cv.CV_IMWRITE_JPEG_QUALITY, quality]
            except KeyError:
                # default is JPEG so
                options = [cv.CV_IMWRITE_JPEG_QUALITY, quality]

            if FORMATS[extension] == 'TIFF':
                channels = channels or cv2.split(numpy.asarray(self.image))
                data = self.write_channels_to_tiff_buffer(channels)
            else:
                data = cv.EncodeImage(extension, self.image, options
                                      or []).tostring()

            if FORMATS[
                    extension] == 'JPEG' and self.context.config.PRESERVE_EXIF_INFO:
                if hasattr(self, 'exif'):
                    img = JpegFile.fromString(data)
                    img._segments.insert(
                        0, ExifSegment(self.exif_marker, None, self.exif,
                                       'rw'))
                    data = img.writeString()

        return data
    def create_image(self, buffer):
        # FIXME: opencv doesn't support gifs, even worse, the library
        # segfaults when trying to decoding a gif. An exception is a
        # less drastic measure.
        try:
            if FORMATS[self.extension] == 'GIF':
                raise ValueError("opencv doesn't support gifs")
        except KeyError:
            pass

        img = cv2.imdecode(np.frombuffer(buffer, np.uint8), -1)
        if FORMATS[self.extension] == 'JPEG':
            try:
                info = JpegFile.fromString(buffer).get_exif()
                if info:
                    self.exif = info.data
                    self.exif_marker = info.marker
            except Exception:
                pass
        return img
Beispiel #9
0
 def post(self, program=None, code=None, report=None, dataset=None):
     headers = {}
     params = {
         'file_image': self.request.POST['file'],
         'indexed_program': program.upper(),
         'indexed_project_code': code,
         'indexed_project_id': self.request.POST['project-id'],
         'indexed_dataset_code': report,
         'indexed_dataset_id': self.request.POST['dataset-id'],
         'indexed_parent_code': report,
         'unindexed_data_collectors': self.request.POST['data-collectors'],
         'unindexed_last_modified_date':
         self.request.POST['last_modified_date']
     }
     if self.request.get('subproject'):
         params['indexed_subproject_code'] = report
         params['indexed_subproject_id'] = self.request.POST[
             'subproject-id']
         params['indexed_dataset_code'] = dataset
         params['indexed_parent_code'] = dataset
     if self.request.get('special'):
         logging.debug('FILE RECEIVED')
         params['file_file'] = params.pop('file_image')
         params['indexed_type'] = 'FILE'
         if self.request.POST['file'].filename.lower().endswith(
                 tuple(['.jpg', '.jpeg'])):
             image = JpegFile.fromString(params['file_file'].file.read())
             try:
                 lat, lng = image.get_geo()
                 params['unindexed_latlng'] = str(lat) + ',' + str(lng)
                 logging.debug('FILE HAS GPS')
             except:
                 logging.debug('FILE HAS NO GPS')
             params['file_file'].file.seek(0)
     else:
         if self.request.POST['file'].filename.endswith(
                 tuple(['.kml', '.kmz'])):
             logging.debug('KML RECEIVED')
             params['file_kml'] = params.pop('file_image')
             params['indexed_type'] = 'KML'
             kml_type = 'PROJECT'
             if params['file_kml'].filename.startswith('ACCESS-'):
                 kml_type = 'ACCESS'
             ext = params['file_kml'].filename.split('.')[-1]
             params['file_kml'].filename = kml_type + '-' + code + '-'
             params['file_kml'].filename += self.request.get('kml')
             params['file_kml'].filename += '.' + ext
             query = APIData.query()
             query = query.filter(APIData.indexed_data == 'TYPE->PROJECT')
             query = query.filter(APIData.indexed_data == 'CODE->' + code)
             query = query.filter(APIData.indexed_data == 'HAS_KML->1')
             project = query.get(keys_only=True)
             logging.debug('PROJECT QUERIED AND HAS KML')
             logging.debug(project)
             if not project:
                 params = {}
                 params['indexed_has_kml'] = '1'
                 update_api_data(self.request.POST['project-id'], params,
                                 self.user, 'application/json')
         elif self.request.POST['file'].filename.lower().endswith(
                 tuple(['.jpg', '.jpeg'])):
             logging.debug('IMAGE RECEIVED')
             try:
                 image = JpegFile.fromString(
                     params['file_image'].file.read())
             except Exception as e:
                 logging.debug(e)
                 params['file_image'].file.seek(0)
                 try:
                     image = JpegFile.fromString(
                         StringIO(params['file_image'].file.read()).read())
                 except Exception as e:
                     logging.debug('Using StringIO')
                     traceback.print_exc()
                     self.response.set_status(500)
                     self.response.write('Image has invalid metadata')
                     return
             try:
                 lat, lng = image.get_geo()
             except Exception as e:
                 logging.debug('Image does not a have GPS data')
                 traceback.print_exc()
                 self.response.set_status(500)
                 self.response.write('Image does not a have GPS data')
                 return
             params['unindexed_latlng'] = str(lat) + ',' + str(lng)
             params['unindexed_date'] = ''
             if image.exif.primary.GPS[0x7]:
                 logging.debug(image.exif.primary.GPS[0x7])
                 gps_time = ''
                 for a in image.exif.primary.GPS[0x7]:
                     if a.num < 10:
                         gps_time += '0' + str(a.num)
                     else:
                         gps_time += str(a.num)
                     gps_time += ':'
                 gps_time = gps_time[:-1]
                 logging.debug(gps_time)
                 params['unindexed_date'] = image.exif.primary.GPS[
                     0x1d] + ' ' + gps_time
                 logging.debug(params['unindexed_date'])
             else:
                 try:
                     params[
                         'unindexed_date'] = image.exif.primary.ExtendedEXIF.DateTimeOriginal
                 except:
                     params['unindexed_date'] = datetime.datetime.now(
                     ).strftime('%Y:%m:%d %H:%M:%S')
             params['file_image'].file.seek(0)
             params['indexed_type'] = 'IMAGE'
             query = APIData.query()
             query = query.filter(APIData.indexed_data == 'TYPE->PROJECT')
             query = query.filter(APIData.indexed_data == 'CODE->' + code)
             query = query.filter(APIData.indexed_data == 'HAS_IMAGE->1')
             project = query.get(keys_only=True)
             logging.debug('PROJECT QUERIED AND HAS IMAGE')
             logging.debug(project)
             if not project:
                 params = {}
                 params['indexed_has_image'] = '1'
                 update_api_data(self.request.POST['project-id'], params,
                                 self.user, 'application/json')
         else:
             self.response.set_status(500)
             self.response.write('File is invalid')
             return
     headers['Authorization'] = API_KEY
     headers['Content-Type'] = 'multipart/form-data'
     logging.debug(params)
     write_to_api(params, self.user, headers['Content-Type'])
import json
import sys
import urllib2

from pexif import JpegFile

TIME_FORMAT = '%Y:%m:%d %H:%M:%S'

obj = {}
with open(sys.argv[1]) as f:
    obj = json.loads(f.read())

for photo in obj['response']['photos']['items']:
    date = datetime.datetime.fromtimestamp(photo['createdAt'])
    loc = (photo['venue']['location']['lat'], photo['venue']['location']['lng'])
    print photo['venue']['name']

    url = "%soriginal%s" % (photo['prefix'], photo['suffix'])
    req = urllib2.Request(url)
    handler = urllib2.urlopen(req)

    ef = JpegFile.fromString(handler.read())

    exif = ef.get_exif()
    primary = exif.get_primary()

    ef.set_geo(loc[0], loc[1])
    primary.DateTime = date.strftime(TIME_FORMAT)

    ef.writeFile('photos/%s.jpg' % photo['id'])