2012-12-14 17 views
8

मैं इस परिदृश्य है:EXIF ​​में निर्दिष्ट थंबनेल सहित जनहित याचिका के बिना अजगर का उपयोग कर उन्मुखीकरण के साथ एक छवि घूर्णन

  • मैं अपने Pyhon सॉकेट सर्वर से EXIF ​​जानकारी के साथ iPhone से एक छवि भेज रहा हूँ।
  • छवि को लिया जाने पर मुझे वास्तविक अभिविन्यास के आधार पर छवि को उचित रूप से उन्मुख करने की आवश्यकता है। मुझे पता है कि आईओएस हमेशा छवि को लैंडस्केप बाएं के रूप में सहेजता है और वास्तविक अभिविन्यास को EXIF ​​फ़ील्ड (EXIF.Image.Orientation) के रूप में जोड़ता है।
  • मैं वास्तविक अभिविन्यास देखने के लिए EXIF ​​फ़ील्ड पढ़ रहा हूं। फिर मैं Wxpython का उपयोग उचित अभिविन्यास पर छवि को घुमा रहा हूं।

मैं EXIF ​​मैनिपुलेशन के लिए pyexiv2 का उपयोग कर रहा हूं।

समस्या: wxpython का उपयोग कर छवि को घूर्णन करते समय थंबनेल को छोड़कर EXIF ​​जानकारी खो गई।

मैंने क्या किया: मैं छवि को घुमाने से पहले EXIF ​​पढ़ रहा हूं। मैं EXIF ​​में अभिविन्यास फ़ील्ड को रीसेट करता हूं। फिर मैं घूर्णन के बाद इसे वापस डाल रहा हूँ।

समस्या:

EXIF ​​अंदर थंबनेल घुमाया नहीं है। तो, छवि और थंबनेल में अलग-अलग उन्मुखताएं हैं।

प्रश्न?

क्या पीआईएल के अलावा कोई अन्य मॉड्यूल है जो अपनी EXIF ​​जानकारी रखने वाली छवि को घुमाएगा?

क्या थंबनेल अभिविन्यास के लिए कोई अलग EXIF ​​फ़ील्ड है?

क्या कोई तरीका है कि मैं अकेले थंबनेल को घुमा सकता हूं?

आपकी मदद के लिए धन्यवाद ...

+0

इस्तेमाल किया आप [Exif 2.2 कल्पना] का पेज 56 (http://www.exif.org/Exif2-2.PDF) पर एक नज़र डालें, तो आप देखेंगे कि अभिविन्यास एक वैकल्पिक टैग है जिसे फ़ाइल के पहले IFD में थंबनेल से जोड़ा जा सकता है। मुझे pyexiv2 के साथ कोई अनुभव नहीं है, लेकिन यदि आप पुस्तकालय के माध्यम से थंबनेल पर टैग सेट कर सकते हैं, तो मैं शर्त लगाता हूं कि आप इसे बस सेट कर सकते हैं। – BenTrofatter

+0

@BenTrofatter धन्यवाद दोस्त ... मैंने यह कोशिश की है, लेकिन अधिकांश दर्शक छवि/थंबनेल प्रदर्शित करने से पहले EXIF ​​को भी नहीं देख पाएंगे। यही कारण है कि मैंने छवि को घुमाया और EXIF ​​को रीसेट कर दिया। – ATOzTOA

उत्तर

2

मैं एक समाधान पाया है ... इस की जाँच ... 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) 
22

यह समाधान मेरे लिए काम करता है: PIL thumbnail is rotating my image?

डॉन यह जांचने की आवश्यकता नहीं है कि यह आईफोन या आईपैड है: अगर फोटो ओरिएंटेशन टैग है - इसे घुमाएं।

from PIL import Image, ExifTags 

try: 
    image=Image.open(filepath) 
    for orientation in ExifTags.TAGS.keys(): 
     if ExifTags.TAGS[orientation]=='Orientation': 
      break 
    exif=dict(image._getexif().items()) 

    if exif[orientation] == 3: 
     image=image.rotate(180, expand=True) 
    elif exif[orientation] == 6: 
     image=image.rotate(270, expand=True) 
    elif exif[orientation] == 8: 
     image=image.rotate(90, expand=True) 
    image.save(filepath) 
    image.close() 

except (AttributeError, KeyError, IndexError): 
    # cases: image don't have getexif 
    pass 

से पहले:

Before

के बाद: After

+0

क्या यह थंबनेल भी घुमाता है? – ATOzTOA

+0

एक आकर्षण की तरह काम किया, मेरे पास पहले से मौजूद अपलोड कोड में फिसल गया, कोई बग नहीं। ए + –

+0

एक आकर्षण की तरह काम किया! इसके लिए धन्यवाद। – FunkyMonk91

0

https://medium.com/@giovanni_cortes/rotate-image-in-django-when-saved-in-a-model-8fd98aac8f2a

इस ब्लॉग पोस्ट यह स्पष्ट रूप से बताते हैं। बस सुनिश्चित करें कि कोड forms.py या models.py पर रखने की कोशिश करें क्योंकि मुझे cannot import model/view त्रुटियां मिली हैं।

models.py में models.py & @receiver.. कोड भी rotate_image विधि रहते हैं।

मुझे ऐसी कोई निर्देशिका जैसी त्रुटियां भी मिलीं। बस सुनिश्चित करें कि full_path मीडिया फ़ोल्डर में सही ढंग से सेट है।

मैं इस लाइन

fullpath = os.path.join(os.path.dirname(BASE_DIR)) + instance.fimage.url