Rotating an image with orientation specified in EXIF using Python without PIL including the thumbnail

后端 未结 6 1276
太阳男子
太阳男子 2020-12-02 09:10

I have the following scenario:

  • I am sending an image from iPhone along with the EXIF information to my Pyhon socket server.
  • I need the image to be pro
6条回答
  •  心在旅途
    2020-12-02 10:05

    I have found a solution... check this out... http://www.atoztoa.com/2012/12/rotate-images-along-with-thumbnails-in.html

    '''
    Rotate Image
    '''
    import pyexiv2
    import wx
    import cStringIO
    import os
    
    def rotateImage(infile, device):
        try:
            # Read Metadata from the image
            metadata = pyexiv2.metadata.ImageMetadata(infile)
            metadata.read();
    
            # Let's get the orientation
            orientation = metadata.__getitem__("Exif.Image.Orientation")
            orientation = int(str(orientation).split("=")[1][1:-1])
    
            # Extract thumbnail
            thumb = metadata.exif_thumbnail
    
            angle = 0
    
            # Check the orientation field in EXIF and rotate image accordingly
            if device == "iPhone" or device == "iPad":
                # Landscape Left : Do nothing
                if orientation == ORIENTATION_NORMAL:
                    angle = 0
                # Portrait Normal : Rotate Right
                elif orientation == ORIENTATION_LEFT:
                    angle = -90
                # Landscape Right : Rotate Right Twice
                elif orientation == ORIENTATION_DOWN:
                    angle = 180
                # Portrait Upside Down : Rotate Left
                elif orientation == ORIENTATION_RIGHT:
                    angle = 90
    
                # Resetting Exif field to normal
                print "Resetting exif..."
                orientation = 1
                metadata.__setitem__("Exif.Image.Orientation", orientation)
    
            # Rotate
            if angle != 0:
                # Just rotating the image based on the angle
                print "Rotating image..."
                angle = math.radians(angle)
                img = wx.Image(infile, wx.BITMAP_TYPE_ANY)
                img_centre = wx.Point( img.GetWidth()/2, img.GetHeight()/2 )
                img = img.Rotate( angle, img_centre, True )
                img.SaveFile(infile, wx.BITMAP_TYPE_JPEG)
    
                # Create a stream out of the thumbnail and rotate it using wx
                # Save the rotated image to a temporary file
                print "Rotating thumbnail..."
                t = wx.EmptyImage(100, 100)
                thumbStream = cStringIO.StringIO(thumb.data)
                t.LoadStream(thumbStream, wx.BITMAP_TYPE_ANY)
                t_centre = wx.Point( t.GetWidth()/2, t.GetHeight()/2 )
                t = t.Rotate( angle, t_centre, True )
                t.SaveFile(infile + ".jpg", wx.BITMAP_TYPE_JPEG)
                thumbStream.close()
    
                # Read the rotated thumbnail and put it back in the rotated image
                thumb.data = open(infile + ".jpg", "rb").read();
                # Remove temporary file
                os.remove(infile + ".jpg")
    
            # Write back metadata
            metadata.write();
    
        except Exception, e:
            print "Error rotating image... : " + str(e)
    

提交回复
热议问题