2008-09-03 23 views
48

क्या बीएमपी छवि को जेपीजी/पीएनजी में सी # में गुणवत्ता खोए बिना कनवर्ट करने का कोई तरीका है? छवि वर्ग का उपयोग करके हम बीएमपी को jpg में परिवर्तित कर सकते हैं लेकिन आउटपुट छवि की गुणवत्ता बहुत खराब है। क्या हम गुणवत्ता स्तर को उच्चतम गुणवत्ता वाले फ़ोटोशॉप का उपयोग करके जेपीजी में परिवर्तित छवि के रूप में उतना ही अच्छा हासिल कर सकते हैं?बीएमपी से जेपीजी/पीएनजी सी #

उत्तर

53
var qualityEncoder = Encoder.Quality; 
var quality = (long)<desired quality>; 
var ratio = new EncoderParameter(qualityEncoder, quality); 
var codecParams = new EncoderParameters(1); 
codecParams.Param[0] = ratio; 
var jpegCodecInfo = <one of the codec infos from ImageCodecInfo.GetImageEncoders() with mime type = "image/jpeg">; 
bmp.Save(fileName, jpegCodecInfo, codecParams); // Save to JPG 
+1

क्या यहां कुछ _using_ कथन नहीं होना चाहिए? मैंने देखा कि एन्कोडर पैरामीटर आईडीस्पोज़ेबल है, लेकिन मैं निश्चित रूप से यह सुनिश्चित करने के लिए डिस्पोजेबल पैटर्न के मालिक नहीं हूं कि उनकी आवश्यकता है। एक पंक्ति में GetEncoder के लिए – TwainJ

3

This लगता है कि यह कुछ स्रोत कोड है कि आप मदद कर सकता है है ... मुझे लगता है तुम सिर्फ गुणवत्ता एनकोडर पैरामीटर < कंधे उचकाने की क्रिया लापता थे>

0

आप कोशिश कर सकते हैं:

Bitmap.InterpolationMode = InterpolationMode.HighQualityBicubic; 

और

Bitmap.CompositingQuality = CompositingQuality.HighQuality; 

जो गुणवत्ता को काफी उच्च रखता है, लेकिन उच्चतम संभावना नहीं है le।

+0

बिटमैप में ऐसी संपत्ति नहीं है। उन्हें ग्राफिक्स और आकार बदलने जैसे छवि संशोधनों के दौरान लागू किया जाना चाहिए। –

1

मूल रूप से आप एक ही गुणवत्ता को रखने में सक्षम नहीं होंगे क्योंकि jpg है (जहां तक ​​मुझे पता है) हमेशा उच्चतम संभव गुणवत्ता सेटिंग्स के साथ भी हानिकारक है।

यदि बिट-सटीक गुणवत्ता वास्तव में महत्वपूर्ण है, तो पीएनजी का उपयोग करने पर विचार करें, जिसमें कुछ मोड हैं जो लापरवाह हैं।

1

बस कहना है कि जेपीईजी प्रकृति द्वारा एक हानिकारक प्रारूप है। तो उच्चतम सेटिंग्स में भी थूरी में आपको कुछ जानकारी हानि होगी, लेकिन यह छवि पर बहुत निर्भर करता है। लेकिन पीएनजी लापरवाही है।

30
public static class BitmapExtensions 
{ 
    public static void SaveJPG100(this Bitmap bmp, string filename) 
    {    
     EncoderParameters encoderParameters = new EncoderParameters(1); 
     encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L); 
     bmp.Save(filename, GetEncoder(ImageFormat.Jpeg), encoderParameters); 
    } 

    public static void SaveJPG100(this Bitmap bmp, Stream stream) 
    { 
     EncoderParameters encoderParameters = new EncoderParameters(1); 
     encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L); 
     bmp.Save(stream, GetEncoder(ImageFormat.Jpeg), encoderParameters); 
    } 

    public static ImageCodecInfo GetEncoder(ImageFormat format) 
    { 
     ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders(); 

     foreach (ImageCodecInfo codec in codecs) 
     { 
      if (codec.FormatID == format.Guid) 
      { 
       return codec; 
      } 
     } 

     return null; 
    } 
} 
+0

समतुल्य अभिव्यक्ति:। '' ') लौट ImageCodecInfo.GetImageDecoders (कहाँ (x => x.FormatID == format.Guid) .FirstOrDefault();' '' – Nuzzolilo

+2

या भी कम 'वापसी ImageCodecInfo.GetImageEncoders()। FirstOrDefault (x => x.FormatID == ImageFormat.Jpeg.Guid); '। – Jan

10

प्रदान किए गए बिस्ट्रैप एक्सटेंशन जेस्ट्रो द्वारा महान हैं, मैंने उनका उपयोग किया। हालांकि सही संस्करण प्रदर्शित करना चाहती है - छवि माता पिता वर्ग जो और अधिक सुविधाजनक है के रूप में मुझे लगता है कि और एक तरह से गुणवत्ता की आपूर्ति करने के लिए प्रदान करता है काम करता है:

public static class ImageExtensions 
{ 
    public static void SaveJpeg(this Image img, string filePath, long quality) 
    { 
     var encoderParameters = new EncoderParameters(1); 
     encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, quality); 
     img.Save(filePath, GetEncoder(ImageFormat.Jpeg), encoderParameters); 
    } 

    public static void SaveJpeg(this Image img, Stream stream, long quality) 
    { 
     var encoderParameters = new EncoderParameters(1); 
     encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, quality); 
     img.Save(stream, GetEncoder(ImageFormat.Jpeg), encoderParameters); 
    } 

    static ImageCodecInfo GetEncoder(ImageFormat format) 
    { 
     ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders(); 
     return codecs.Single(codec => codec.FormatID == format.Guid); 
    } 
} 
0

मैं किसी व्यय रिपोर्ट एप्लिकेशन पर काम कर रहा हूँ, और मैं वास्तव में खुश हूँ बिटमैप ऑब्जेक्ट से सहेजते समय जेपीजी (और पीएनजी) के लिए डिफ़ॉल्ट गुणवत्ता सेटिंग्स के साथ।

https://msdn.microsoft.com/en-us/library/9t4syfhh%28v=vs.110%29.aspx

Bitmap finalBitmap = ....; //from disk or whatever 
finalBitmap.Save(xpsFileName + ".final.jpg", ImageFormat.Jpeg); 
finalBitmap.Save(xpsFileName + ".final.png", ImageFormat.Png); 

मैं नेट 4.6 पर हूँ ... शायद गुणवत्ता बाद ढांचे विज्ञप्ति में सुधार हुआ है।

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