2009-07-02 14 views
14

मेरे पास एक तोप डिजिटल कैमरा है और मैंने इसे सुपरफ़ाइन गुणवत्ता वाले चित्र लेने के लिए सेट किया है और यह एक .jpg फ़ाइल 3 मेगा आकार का आउटपुट करता है। अगर मैं ASP.NET में इस तरह इसे लोड.NET सेविंग जेपीईजी उसी गुणवत्ता के साथ

imgPicture = Image.FromFile(Config.WorkDirectory + this.TempPhotoName); 
bmpPicture = new Bitmap(imgPicture); 

(यह यह डीपीआई संकल्प है बदलने के लिए या यह या whaterver फसल के लिए उपयोगी है) और फिर मैं इसे इस तरह फिर से बचाने के लिए:

bmpModified.Save(Config.WorkDirectory + this.TempPhotoName,System.Drawing.Imaging.ImageFormat.Jpeg); 
यह

एक जेपीजी आउटपुट करता है जो केवल 700 केबी या आकार में होता है। गुणवत्ता का नुकसान है।

मैं भी इस तरह यह बचत करने की कोशिश की:

bmpPicture.Save(Config.WorkDirectory + this.TempPhotoName, codecJpeg, encparams); 

जहां codecJpeg है

ImageCodecInfo codecJpeg = this.getEncoderInfo("image/jpeg"); 


    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; 
    } 

और encparams:

EncoderParameters encparams = new EncoderParameters(1); 
encparams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 97L); 

इस तरह आकार (और मैं भी गुणवत्ता पर शक) बनाए रखा जाता है लेकिन मैं हाथ से गुणवत्ता इनपुट कर रहा हूं।

मैं पूछना चाहता हूँ:

वहाँ एक ही गुणवत्ता के साथ छवि को बचाने के लिए के रूप में यह गुणवत्ता मूल्य हार्डकोड बिना लोड किया गया था कोई तरीका है?

अग्रिम

उत्तर

5

में धन्यवाद तो यह लगता है कि आप जानते हैं कि कैसे गुणवत्ता निर्धारित करने के लिए, तुम सच में सिर्फ जानना चाहता कैसे लाने के लिए मूल छवि से गुणवत्ता की ज़रूरत है?

मुझे संदेह है कि Image.PropertyItems आपके मित्र हैं, अगर गुणवत्ता मेटाडेटा में शुरू होने के लिए है। (मुझे नहीं पता कि जेपीईजी एन्कोडर्स के भीतर गुणवत्ता के लिए मानक स्तर भी है या नहीं।)

संपादित करें: मैंने अभी जांच की है, और डाउनलोड किए गए एक जेपीजी में गुणवत्ता के लिए कोई टैग नहीं है।

एक विकल्प यह काम करने के लिए हो सकता है कि फाइल को लगभग समान गुणवत्ता के लिए कितना बड़ा होना चाहिए, और फिर इसे कई बार बचाएं, सबसे उपयुक्त गुणवत्ता को काम करने के लिए बाइनरी खोज कर। Icky, लेकिन यह सिर्फ काम कर सकता है।

मैं, एक चुपके संदेह है कि वहाँ एक तरह से सिर्फ मूल गुणवत्ता सेटिंग संरक्षित करने के लिए नहीं है, हालांकि मुझे लगता है कि संदेह के लिए बहुत अच्छा आधार नहीं है ...

+2

PropertyItems स्थापना और, गुणवत्ता नुकसान के लिए नेतृत्व करेंगे, क्योंकि छवि को फिर से इनकोडिंग किया जाएगा पुन: सहेज। यहां और पढ़ें: http://stackoverflow.com/questions/1038206/net-c-library-for-lossless-exif-rewriting – arbiter

+0

हां, मुझे सराहना है कि इसे फिर से एन्कोड किया जाएगा - लेकिन मुझे लगता है कि यह समझ में आता है मूल रूप से वही "हानि" पर फिर से एन्कोड करें, क्या आप चाहें। आप अभी भी डेटा खोने जा रहे हैं, लेकिन शायद एक बड़ी राशि नहीं है। यह भी ध्यान रखें कि मैं * सेटिंग * प्रॉपर्टीइटम के बारे में बात नहीं कर रहा था - मैं मूल गुणवत्ता को जानने के लिए * लाने * के बारे में बात कर रहा था, हालांकि इसमें प्रासंगिक डेटा प्रतीत नहीं होता है। –

+0

अच्छी तरह से जेपीजी गुणवत्ता लाने के लिए प्रॉपर्टीटाइम तत्व मौजूद है - PropertyTagJPEGQuality, लेकिन यह एडोब फोटोशॉप के लिए निजी टैग के रूप में कहा गया है, इसलिए मुझे नहीं पता कि यह कैमरा से भरा है या नहीं। वैसे भी एक ही जेपीजी गुणवत्ता मूल्य के साथ जेपीईजी भंडारण की थोड़ी सी समझ है, क्योंकि गुणवत्ता में कमी होगी। – arbiter

0

यहां पढ़ें कैसे को बचाने के लिए पुन: एन्कोडिंग छवि के बिना छवि: How-to: Re-encode a JPEG Image with Metadata

हालांकि, यदि आप फसल या अन्य छवि कुशलता के बिना इसे गुणवत्ता हानि के बिना करना असंभव है (अच्छी तरह तकनीकी रूप से हानि-कम फसल करना संभव है, यदि आप 16 से गुणा सीमाओं के साथ काम करते हैं, लेकिन AFAIK यह नहीं हो सकता है .NET में उपलब्ध पुस्तकालयों के साथ किया जाना चाहिए)।

0

आपको अतिरिक्त पैरामीटर का उपयोग करना होगा जो रंग योजना का पता लगाने के लिए जीडीआई + बताते हैं।

उदाहरण के लिए:

using (var img = Image.FromStream(fileupload.InputStream, true,true)) 
{ 
    img.Save(fileOnDisk, ImageFormat.Jpeg); 
} 

using (var img = Image.FromFile("yourimage", true)) 
{ 
    img.Save(fileOnDisk, ImageFormat.Jpeg); 
} 
संबंधित मुद्दे