2016-01-12 5 views
5

मेरे कार्यक्रम प्रक्रियाओं batch.I में कुछ छवियों वर्तमान में छवि के exif उन्मुखीकरण टैग पढ़ने की जरूरत के साथ छवि सहेजें, उचित उन्मुखीकरण के लिए यह घुमाने के लिए, कर कुछ प्रसंस्करण और किसी भी EXIF ​​अभिविन्यास टैग के बिना छवि बचाने के लिए, लेकिन उचित रोटेशन के साथ (या उचित अभिविन्यास साथ EXIF ​​टैग के साथ)उचित अभिविन्यास, प्रक्रिया छवि के लिए घुमाएं जाओ EXIF ​​अभिविन्यास टैग, और उचित अभिविन्यास

मैं EXIF ​​पढ़ रहा हूँ और this library का उपयोग कर घूर्णन:।

var bmp = new Bitmap(pathToImageFile); 
    var exif = new EXIFextractor(ref bmp, "n"); // get source from http://www.codeproject.com/KB/graphics/exifextractor.aspx?fid=207371 

    if (exif["Orientation"] != null) 
    { 
    RotateFlipType flip = OrientationToFlipType(exif["Orientation"].ToString()); 

    if (flip != RotateFlipType.RotateNoneFlipNone) // don't flip of orientation is correct 
    { 
    bmp.RotateFlip(flip); 
    bmp.Save(pathToImageFile, ImageFormat.Jpeg); 
    } 

    // Match the orientation code to the correct rotation: 

    private static RotateFlipType OrientationToFlipType(string orientation) 
    { 
    switch (int.Parse(orientation)) 
    { 
    case 1: 
    return RotateFlipType.RotateNoneFlipNone; 

    case 2: 
    return RotateFlipType.RotateNoneFlipX; 

    case 3: 
    return RotateFlipType.Rotate180FlipNone; 
    case 4: 
    return RotateFlipType.Rotate180FlipX; 
    break; 
    case 5: 
    return RotateFlipType.Rotate90FlipX; 
    break; 
    case 6: 
    return RotateFlipType.Rotate90FlipNone; 
    case 7: 
    return RotateFlipType.Rotate270FlipX; 
    case 8: 
    return RotateFlipType.Rotate270FlipNone; 
    default: 
    return 
} 
} 

यह काम करता है। लेकिन जब इस छवि को सहेजते हैं, तो एक्सिफ रोटेशन टैग अभी भी मौजूद है जो छवि को गलत अभिविन्यास में बनाता है।

 var bmp = new Bitmap(OS.FileName);  
     var exif = new EXIFextractor(ref bmp, "n"); 
     exif.setTag(0x112, "1"); 
     bmp.save("strippedexifimage"); 

क्या मैं क्या कर सकते हैं लेकिन जब एक पाश में इस्तेमाल के लिए इस कोड लगभग 50% .is वहाँ एक वैकल्पिक माध्यम से मेरा कार्यक्रम को धीमा कर देती? रोटेशन लगाने के बाद छवि को घुमाने के लिए कोड हो सकता है, क्या वह काम करेगा?

अद्यतन:

@Hans Passant आपका जवाब काम करता है, लेकिन परिणाम यह उत्पादन पुस्तकालय द्वारा उत्पादित लोगों के समान है। जब मैं bitmap.save() का उपयोग करता हूं, दोनों लाइब्रेरी और आपका कोड काम करता है। लेकिन जब मैं उपयोगकर्ता द्वारा चुने गए प्रारूप के आधार पर अपनी छवि को सहेजने के लिए निम्न कोड का उपयोग करता हूं। Imgformat imgformat = "image/png";,imgformat = "image/jpeg"; आदि हो सकता है कुछ छवियों को अभी भी गलत exif अभिविन्यास टैग से बचाया जाता है। यानी: मैं विंडोज एक्सप्लोरर में गलत छवि पूर्वावलोकन देखता हूं, जब मैं एमएस पेंट के साथ छवि खोलता हूं, तो छवि में सही अभिविन्यास होता है। मैं गलत क्या कर रहा हूं? कृपया मदद करे।

private void saveJpeg(string path, Bitmap img, long quality) 
     { 


      EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality); 


      ImageCodecInfo Codec = this.getEncoderInfo(imgformat); 
      if (Codec == null) 
       return; 

      EncoderParameters encoderParams = new EncoderParameters(1); 
      encoderParams.Param[0] = qualityParam;  
      img.Save(path + ext, Codec, encoderParams); 
     } 



private ImageCodecInfo getEncoderInfo(string mimeType) 
     { 
      // Get image codecs for all image formats 
      ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); 

      // Find the correct image codec 
      for (int i = 0; i < codecs.Length; i++) 
       if (codecs[i].MimeType == mimeType) 
        return codecs[i]; 
      return null; 
     } 
+0

ImageMagick पर एक नज़र डालें। मुझे लगता है कि यह सब कुछ आप चाहते हैं। आप इसके लिए कोड लिख सकते हैं .. या बस इसका उपयोग करें। :) – atlaste

उत्तर

5
var exif = new EXIFextractor(ref bmp, "n") 

एक सुविधा को लागू करने के लिए एक पुस्तकालय का उपयोग करके आप बहुत समय बचा सकते हैं। या आप दिनों के लिए अटक जाएंगे जब लाइब्रेरी खराब डिजाइन या उपयोग करने में मुश्किल होगी। ref bmp पहली जोरदार चेतावनी है, आप इसे एक स्ट्रिंग के रूप में मान निर्दिष्ट करने की कोशिश करके निराशा का गड्ढा गिर गया। जो आकर्षक था क्योंकि आपको यह नहीं सोचना था कि सही सेटटाग() अधिभार में "प्रकार" का क्या अर्थ हो सकता है। यह टाइप 3 है और दो तत्वों के साथ बाइट [] की आवश्यकता है। यह बिल्कुल खोजने योग्य नहीं है, जब आपको इसकी आवश्यकता नहीं होती है तो आप केवल लाइब्रेरी का उपयोग कर सकते हैं।

खाई पुस्तकालय, यह उपयोगी नहीं है। अभिविन्यास को संग्रहीत करने वाले EXIF ​​टैग में आईडी 0x112 है और इसे 16-बिट मान के रूप में एन्कोड किया गया है। बस सिस्टम का उपयोग करें। मूल्य को पढ़ने के लिए सीधे ड्रॉइंग करें और उसे वापस 1 पर मजबूर करें। इस तरह:

static void FixImageOrientation(Image srce) { 
    const int ExifOrientationId = 0x112; 
    // Read orientation tag 
    if (!srce.PropertyIdList.Contains(ExifOrientationId)) return; 
    var prop = srce.GetPropertyItem(ExifOrientationId); 
    var orient = BitConverter.ToInt16(prop.Value, 0); 
    // Force value to 1 
    prop.Value = BitConverter.GetBytes((short)1); 
    srce.SetPropertyItem(prop); 

    // Rotate/flip image according to <orient> 
    switch (orient) { 
     // etc... 
    } 
} 
+0

धन्यवाद है.मैं यदि कोड के माध्यम से सीधे यह करने के लिए एक तरीका था देखने के लिए खोज की, लेकिन any.Does नहीं पा सके 'orient' मूल्यों है कि मेरे स्विच मामले में लौट (मेरा मतलब 1,2,3। .etc) – techno

+0

कृपया अद्यतन देखें। – techno

+0

क्या आप कृपया मेरे अपडेट सर पर अपनी राय साझा कर सकते हैं? – techno

संबंधित मुद्दे