2009-07-27 12 views
6

मैं एएसपी.नेट एमवीसी (90 डिग्री वृद्धि में) से घूर्णन जेपीईजी छवियों का समर्थन करने का प्रयास कर रहा हूं। मैं System.Drawing (जीडीआई +) का उपयोग करने का प्रयास कर रहा हूं, हालांकि मैं मुद्दों पर चल रहा हूं।गुणवत्ता के न्यूनतम नुकसान के साथ .NET में जेपीईजी घूर्णन

मैंने Image.RotateFlip का उपयोग करने का प्रयास किया जो छवि को घुमाने में सक्षम है लेकिन गुणवत्ता का नुकसान होता है। 100 की एन्कोडर गुणवत्ता के साथ भी, घूर्णन वाली छवि पर अभी भी दिखाई देने वाली कलाकृतियां हैं जो मूल छवि पर नहीं थीं और न ही जब मैं इसे अन्य प्रोग्राम्स (गिंप इत्यादि) का उपयोग करके घुमाता हूं तो वे दिखाते हैं।

using (Image image = Image.FromFile("C:\\source.jpg")) { 
    ImageFormat sourceFormat = image.RawFormat; 
    image.RotateFlip(RotateFlipType.Rotate90FlipNone); 
    EncoderParameters encoderParams = null; 
    try { 
     if (sourceFormat == ImageFormat.Jpeg) { 
      encoderParams = new EncoderParameters(1); 
      encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, 100L); 
     } 
     image.Save("C:\\target.jpg", GetEncoder(sourceFormat), encoderParams); 
    } finally { 
     if (encoderParams != null) 
      encoderParams.Dispose(); 
    } 
} 

मुझे transforming a JPEG without loss of information पर एक लेख मिला। का उपयोग करते हुए Encoder.Transformation नेट से एक विकल्प हो गया लगता है - लेकिन मैं इसे अपने जेपीईजी परीक्षण छवियों के किसी भी कारण सब पर बारी बारी से करने, या नहीं, आयाम 16.

using (Image image = Image.FromFile("C:\\source.jpg")) { 
    ImageFormat sourceFormat = image.RawFormat; 
    EncoderParameters encoderParams = null; 
    try { 
     if (sourceFormat == ImageFormat.Jpeg) { 
      encoderParams = new EncoderParameters(1); 
      encoderParams.Param[0] = new EncoderParameter(Encoder.Transformation, 
       (long)EncoderValue.TransformRotate90); 
     } 
     image.Save("C:\\target.jpg", GetEncoder(sourceFormat), encoderParams); 
    } finally { 
     if (encoderParams != null) 
      encoderParams.Dispose(); 
    } 
} 

की एक बहु किसी को भी पता है कर रहे हैं करने के लिए नहीं मिल सकता है उपर्युक्त विधियों या किसी अन्य विधि का उपयोग करके न्यूनतम या न्यूनतम गुणवत्ता के साथ 90 डिग्री वृद्धि में .NET में एक जेपीईजी को सफलतापूर्वक घुमाने के लिए कैसे? धन्यवाद।

इसके अलावा, यहां GetEncoder की मेरी कार्यान्वयन है:

private ImageCodecInfo GetEncoder(ImageFormat format) { 
    foreach (var info in ImageCodecInfo.GetImageEncoders()) 
     if (info.FormatID == format.Guid) 
      return info; 
    return null; 
} 

संपादित करें:

मैं ऊपर कोड बेहतर अपने वास्तविक कोड के लिए अपडेट कर। बग निम्न पंक्ति में था:

if (sourceFormat == ImageFormat.Jpeg) { 

यह किया जाना चाहिए था:

if (sourceFormat.Guid == ImageFormat.Jpeg.Guid) { 
+2

आपका कोड मेरे लिए काम करता है .. क्या आप वाकई अपने डेटा के लिए ImageCodecInfo वापस आ गए हैं? –

+0

धन्यवाद @pb, मुझे एक ImageCodecInfo मिल रहा था लेकिन एक एन्कोडर पैराम नहीं था क्योंकि मेरे वास्तविक कोड में एक बग था, इसे सेट करने से पहले एक अतिरिक्त जांच थी। –

उत्तर

1

पुष्टि है कि मेरी पोस्ट कोड काम के लिए धन्यवाद। इससे मुझे मेरी समस्या को अलग करने में मदद मिली। मैं अब बेवकूफ महसूस करता हूँ। मेरे वास्तविक कोड encoderParams सेट करने से पहले छवि प्रारूप का एक चेक था - लेकिन यह एक बग था:

if (sourceFormat == ImageFormat.Jpeg) { 
    // set encoderParams here 

मुझे पता चला ऊपर सशर्त हमेशा गलत तो encoderParams सेट नहीं किया जा रहा था था। ठीक आसान था:

if (sourceFormat.Guid == ImageFormat.Jpeg.Guid) { 
2

कोई भी तरीका है कि छवि decompresses, यह बदलता रहता है और यह संपीड़ित करता है के साथ, आप गुणवत्ता का नुकसान हो जाएगा।

जेपीईजी प्रारूप सभी चार पिक्सेल का प्रतिनिधित्व करने के लिए औसत रंग प्राप्त करके 2x2 पिक्सल के वर्गों में रंग की जानकारी को संपीड़ित करता है, इसलिए यदि आपकी छवि चौड़ाई और ऊंचाई दो से विभाजित हो तो आप कम गुणवत्ता खो देंगे क्योंकि अधिकांश जानकारी में हटाई गई है संपीड़न वह जानकारी है जो डिकंप्रेशन में इंटरपोलेट किया गया था।

इसी प्रकार चमक की जानकारी 8x8 पिक्सेल के वर्गों में संपीड़ित होती है, इसलिए यदि आपकी चौड़ाई और हाइट आठ से विभाजित हो, तो ग्रिड छवि को घूर्णन करने के बाद संरेखित हो जाएगा और आप कम वास्तविक जानकारी खो देंगे।

लापरवाही रोटेशन बनाने के लिए आपको एक पूरी तरह से अलग विधि का उपयोग करना होगा, जेपीईजी फ़ाइल को पढ़ना होगा और जानकारी के प्रत्येक वर्ग को पुनर्व्यवस्थित करना और घूर्णन करना होगा ताकि यह घुमावदार और इसे फिर से दबाए बिना घूर्णन वाली छवि बना सके।

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