GDI + में एक सामान्य त्रुटि हुई, JPEG Image to MemoryStream


326

यह पूरे वेब पर एक बदनाम त्रुटि का एक सा लगता है। इतना कि मैं अपनी समस्या का जवाब खोजने में असमर्थ रहा क्योंकि मेरा परिदृश्य फिट नहीं है। जब मैं छवि को स्ट्रीम पर सहेजता हूं तो एक अपवाद हो जाता है।

अजीब तरह से यह पूरी तरह से काम करता है, लेकिन jpg और gif के साथ उपरोक्त त्रुटि देता है, जो भ्रामक है।

बिना अनुमति के फ़ाइलों को सहेजने से संबंधित अधिकांश समान समस्याएँ हैं। विडंबना यह है कि एक मेमोरी स्ट्रीम का उपयोग करना है जैसा कि मैं कर रहा हूं ...।

public static byte[] ConvertImageToByteArray(Image imageToConvert)
{
    using (var ms = new MemoryStream())
    {
        ImageFormat format;
        switch (imageToConvert.MimeType())
        {
            case "image/png":
                format = ImageFormat.Png;
                break;
            case "image/gif":
                format = ImageFormat.Gif;
                break;
            default:
                format = ImageFormat.Jpeg;
                break;
        }

        imageToConvert.Save(ms, format);
        return ms.ToArray();
    }
}

अपवाद को अधिक विस्तार। इसका कारण इतने सारे मुद्दों की व्याख्या का अभाव है :(

System.Runtime.InteropServices.ExternalException was unhandled by user code
Message="A generic error occurred in GDI+."
Source="System.Drawing"
ErrorCode=-2147467259
StackTrace:
   at System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters    encoderParams)
   at System.Drawing.Image.Save(Stream stream, ImageFormat format)
   at Caldoo.Infrastructure.PhotoEditor.ConvertImageToByteArray(Image imageToConvert) in C:\Users\Ian\SVN\Caldoo\Caldoo.Coordinator\PhotoEditor.cs:line 139
   at Caldoo.Web.Controllers.PictureController.Croppable() in C:\Users\Ian\SVN\Caldoo\Caldoo.Web\Controllers\PictureController.cs:line 132
   at lambda_method(ExecutionScope , ControllerBase , Object[] )
   at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
   at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassa.<InvokeActionMethodWithFilters>b__7()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
 InnerException: 

ठीक है मैंने अब तक कोशिश की है।

  1. छवि को क्लोन करना और उस पर काम करना।
  2. उस MIME के ​​लिए एनकोडर को पुनः प्राप्त करना जो कि jpeg गुणवत्ता सेटिंग के साथ गुजरता है।

संबं धत
लं क


3
मेरे लिए, मुद्दा यह था कि फ़ोल्डर मौजूद नहीं था। केवल फ़ोल्डर बनाकर फिक्स्ड।
जार्ज

मेरे लिए यह सीमा से बाहर का सूचकांक था जो निगल रहा था।
बिली जेक ओ'कॉनर

जवाबों:


189

ठीक है, मुझे लगता है कि सिर्फ सरासर भाग्य और इसका कारण उस विशेष पद्धति के साथ कुछ भी गलत नहीं है, यह आगे कॉल स्टैक का समर्थन करता है।

इससे पहले मैं छवि का आकार बदल देता हूं और उस विधि के हिस्से के रूप में मैं आकार की वस्तु को इस प्रकार वापस करता हूं। मैंने उपरोक्त विधि में दो कॉल और एक फ़ाइल में एक डायरेक्ट सेव डाला है।

// At this point the new bitmap has no MimeType
// Need to output to memory stream
using (var m = new MemoryStream())
{
       dst.Save(m, format);

       var img = Image.FromStream(m);

       //TEST
       img.Save("C:\\test.jpg");
       var bytes = PhotoEditor.ConvertImageToByteArray(img);


       return img;
 }

ऐसा लगता है कि स्मृति धारा उस वस्तु पर बनाया गया था है समय वस्तु सहेजा जाता है पर खुलकर बात करना। मुझे यकीन नहीं है कि ऐसा क्यों है। क्या कोई मुझे प्रबुद्ध करने में सक्षम है और मैं इसे कैसे प्राप्त कर सकता हूं।

मैं केवल एक स्ट्रीम से वापस लौटता हूं क्योंकि इस तरह के रिसाइज़ कोड का उपयोग करने के बाद डेस्टिनेशन फाइल में एक अनजान माइम टाइप (img.RawFormat.Guid) और Id होता है जैसे Mime टाइप सभी इमेज ऑब्जेक्ट पर सही होता है क्योंकि यह हार्ड राइट जेनरिक बनाता है। हैंडलिंग कोड अन्यथा।

संपादित करें

यह मेरी प्रारंभिक खोज में नहीं आया था, लेकिन यहाँ जॉन स्कीट का जवाब है


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

38
धन्यवाद। इसने शायद मेरे बालों को बचा लिया।
NotMe

6
धन्यवाद! इसने मुझे बहुत समय बचाया, हालांकि एक बात, क्या आप अपने उत्तर की शुरुआत में त्रुटि के कारण पर प्रकाश डालेंगे, जैसा कि मैंने (और मुझे सबसे अधिक लगता है) उत्तर के माध्यम से मूल स्किम पर याद किया, शायद कुछ इस तरह " यदि आप इस छवि का उपयोग करने का इरादा रखते हैं, तो यह याद
रखना आवश्यक है

6
आपका "dst" वैरिएबल क्या है?
WEFX

1
@madcapnmckay कृपया बताएं कि 'dst' चर क्या है और इसका महत्व क्या है
माइक टी

131

यदि आपको वह त्रुटि मिल रही है, तो मैं कह सकता हूं कि आपके आवेदन में कुछ निर्देशिका पर लिखित अनुमति नहीं है।

उदाहरण के लिए, यदि आप छवि को मेमोरी स्ट्रीम से फ़ाइल सिस्टम में सहेजने का प्रयास कर रहे हैं, तो आपको वह त्रुटि मिल सकती है।

कृपया यदि आप XP का उपयोग कर रहे हैं, तो उस फ़ोल्डर पर एस्पनेट खाते के लिए लिखित अनुमति जोड़ना सुनिश्चित करें।

यदि आप विंडोज़ सर्वर (2003,2008) या विस्टा का उपयोग कर रहे हैं, तो सुनिश्चित करें कि नेटवर्क सेवा खाते के लिए लेखन अनुमति जोड़ें।

आशा है कि यह किसी एक की मदद करेगा।


7
आपने नहीं किया! मैं 2 घंटे बर्बाद कर दिया लिखने के साथ अनुमति ... यह पोस्ट करने के लिए यहां आया था। आशा है कि आप अधिक उत्थान करेंगे। :)
ग्लेनो

2
यह मेरे लिए समाधान था। +1 पूरी तरह से!
ग्रैंड

5
आप बिटमैप को सहेजने से पहले File.WriteAllText ("filename.jpg", "") तब File.DeleteFile ("filename.jpg") कर सकते हैं। मेरी benmark में यह केवल .001 सेकंड लगते हैं और आप एक अच्छे 'तुम वहाँ filename.jpg को बचाने के लिए अनुमति नहीं है' मिल
Despertar

@Despertar का मतलब है आप File.Delete (), लेकिन यह एक बहुत ही आसान ट्रिक है! जब भी मैं एक बिटमैप को सहेजता हूं तो निश्चित रूप से इसका उपयोग करने जा रहा हूं।
D Coetzee

2
मेरे मामले में, निर्देशिका मौजूद नहीं थी।
silencedmessage

54

मैं त्रुटि के इस कारण को आशाओं के साथ जोड़ूंगा क्योंकि यह कुछ भविष्य के इंटरनेट यात्री की मदद करता है। :)

GDI + एक छवि की अधिकतम ऊंचाई को 65500 तक सीमित करता है

हम कुछ मूल छवि का आकार परिवर्तन करते हैं, लेकिन आकार बदलने में हम पहलू अनुपात को बनाए रखने की कोशिश करते हैं। हमारे पास एक क्यूए आदमी है जो इस काम में थोड़ा बहुत अच्छा है; उन्होंने एक पिक्सेल चौड़ी तस्वीर के साथ इसका परीक्षण करने का फैसला किया जो 480 पिक्सेल लंबा था। जब हमारे आयामों को पूरा करने के लिए छवि को बढ़ाया गया था, तो ऊंचाई 68,000 पिक्सल के उत्तर में थी और हमारे ऐप में विस्फोट हो गया A generic error occurred in GDI+

आप इसे परीक्षण के साथ स्वयं सत्यापित कर सकते हैं:

  int width = 480;
  var height = UInt16.MaxValue - 36; //succeeds at 65499, 65500
  try
  {
    while(true)
    {
      var image = new Bitmap(width, height);
      using(MemoryStream ms = new MemoryStream())
      {
        //error will throw from here
        image.Save(ms, ImageFormat.Jpeg);
      }
      height += 1;
    }
  }
  catch(Exception ex)
  {
    //explodes at 65501 with "A generic error occurred in GDI+."
  }

यह वहाँ एक दोस्ताना .net नहीं है बहुत बुरा है ArgumentExceptionके निर्माता में फेंक दिया Bitmap


17
धन्यवाद - इस संदेश को छोड़ने के लिए इंटरनेट का यह समय यात्री आपके लिए बहुत आभारी है।
टॉम वेस्ट

मेरे परीक्षण से, 65535 वास्तव में अधिकतम मूल्य है। 65536 पर मुझे सामान्य त्रुटि दिखाई देने लगी।
चेसमेडलियन

बस फिर से यह कोशिश की: Win10 .net 4.5 और .net 4.6.1, और यह 65501 पर उड़ा दिया जो और भी अधिक यादृच्छिक लगता है। कोड भी सिंटैक्स त्रुटियों से भरा है, अद्यतन करेगा :)
फ्रेड

37

यह लेख विस्तार से बताता है कि वास्तव में क्या होता है: बिटमैप और छवि निर्माता निर्भरताएं

संक्षेप में, Imageएक धारा से निर्मित जीवनकाल के लिए , धारा को नष्ट नहीं किया जाना चाहिए।

तो, के बजाय

using (var strm = new ... )  {
    myImage = Image.FromStream(strm);
}

इसे इस्तेमाल करे

Stream imageStream;
...

    imageStream = new ...;
    myImage = Image.FromStream(strm);

और फॉर्म क्लोज या वेब पेज क्लोज में क्लोज इमेजस्ट्रीम


हाँ, यह मुझे मिल गया। मैं कर्तव्यनिष्ठ हो रहा था और मैंने अपनी धारा को एक में लपेट लिया usingऔर बाद में छवि को एक मेमोरी स्ट्रीम में कॉपी करने की कोशिश की और "GDI +" संदेश में भयानक "सामान्य त्रुटि" प्राप्त की।
विल एप्पलबी

आपका लिंक मुझे असीम पुनर्निर्देश दे रहा था; यह काम करता है। मुझे बचत करने में समस्या हो रही थी PixelFormat.Format32bppArgbलेकिन नहीं PixelFormat.Format1bppIndexed। आपके द्वारा जोड़ा गया लेख बताता है कि क्यों: GDI + सब कुछ मेमोरी में रखने के बजाय स्रोत स्ट्रीम से बिटमैप डेटा को फिर से डिकोड करने का विकल्प चुन सकता है। मेरा अनुमान है कि यह 1bpp छवियों को फिर से डिकोड नहीं करता है।
लैब्रावायर

यहां तक ​​कि नया लिंक भी काम नहीं करता है। एक साधारण Google खोज सही पृष्ठ को प्रकट नहीं करती थी। लेकिन मुझे यह जवाब पाकर बहुत खुशी हुई! इस मुद्दे
कैटजेक

28

यदि आप किसी अमान्य पथ को बचाने का प्रयास करते हैं या यदि कोई अनुमति समस्या है, तो आपको यह अपवाद भी मिलेगा।

यदि आप 100% सुनिश्चित नहीं हैं कि फ़ाइल पथ उपलब्ध है और अनुमतियाँ सही हैं, तो टेक्स्ट फ़ाइल में लिखने का प्रयास करें। यह पता लगाने के लिए कुछ ही सेकंड लगते हैं कि एक बहुत ही साधारण फिक्स क्या होगा।

var img = System.Drawing.Image.FromStream(incomingStream);

// img.Save(path);
System.IO.File.WriteAllText(path, "Testing valid path & permissions.");

और अपनी फ़ाइल को साफ करने के लिए मत भूलना।


यह मेरे लिए मुद्दा था ... काश, त्रुटि कम अस्पष्ट होती, तो मुझे बहुत समय बच जाता।
Oofpez

हाँ! आपके द्वारा सहेजा जा रहा फ़ोल्डर मौजूद होना चाहिए। इससे पहले कि मैं एक छवि को बचाने की कोशिश करता हूं, अब मैं पहले उस के लिए एक जांच करता हूं। (फिर भी, त्रुटि मुझे पकड़ती है, वर्ष में एक बार।)
मैग्नस स्मिथ

एक फ़ाइल के बजाय मेरा पथ एक निर्देशिका थी।
असिन कासिमोव

20

बिटमैप वैरिएबल में इमेज सेव करें

using (var ms = new MemoryStream())
{
    Bitmap bmp = new Bitmap(imageToConvert);
    bmp.Save(ms, format);
    return ms.ToArray();
}

इससे मेरी समस्या हल हो गई है। क्या आप बता सकते हैं कि बिटमैप को इमेज सेव करना अपवाद को दूर क्यों करता है?
jmc

मेरा दिन बचा लिया .. पता नहीं क्या समस्या का कारण बना लेकिन बिटमैप काम बचा लेता है .. System.Drawing.Image मेमोरी स्ट्रीम को नहीं बचा पाएगा लेकिन मैंमैप करता है !!!
सैन

यह मेरे लिए सबसे अच्छा समाधान था। नया बिटमैप बनाना और उससे परिवर्तित करना।
uzay95

17

बस के मामले में अगर कोई बेवकूफ सामान के रूप में कर रहा है जैसे मैं था। 1. सुनिश्चित करें कि पथ मौजूद है। 2. सुनिश्चित करें कि आपके पास लिखने की अनुमति है। 3. सुनिश्चित करें कि आपका रास्ता सही है, मेरे मामले में मैं टारगेटपाथ में फ़ाइल का नाम याद नहीं कर रहा था :(

यह कहना चाहिए था, "GDI + में एक सामान्य त्रुटि आई" की तुलना में आपका पथ बेकार है


16

JPEG को सहेजते समय मुझे भी यह त्रुटि मिली, लेकिन केवल कुछ छवियों के लिए।

मेरा अंतिम कोड:

  try
  {
    img.SaveJpeg(tmpFile, quality); // This is always successful for say image1.jpg, but always throws the GDI+ exception for image2.jpg
  }
  catch (Exception ex)
  {
    // Try HU's method: Convert it to a Bitmap first
    img = new Bitmap(img); 
    img.SaveJpeg(tmpFile, quality); // This is always successful
  }

मैंने चित्र नहीं बनाए इसलिए मैं नहीं बता सकता कि क्या अंतर है।
अगर किसी को समझा सकता है कि मैं सराहना करता हूँ।

यह मेरा SaveJpeg फंक्शन है सिर्फ FYI करें:

private static void SaveJpeg(this Image img, string filename, int quality)
{
  EncoderParameter qualityParam = new EncoderParameter(Encoder.Quality, (long)quality);
  ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");
  EncoderParameters encoderParams = new EncoderParameters(1);
  encoderParams.Param[0] = qualityParam;
  img.Save(filename, jpegCodec, encoderParams);
}

private static ImageCodecInfo GetEncoderInfo(string mimeType)
{
    var encoders = ImageCodecInfo.GetImageEncoders();
    var encoder = encoders.SingleOrDefault(c => string.Equals(c.MimeType, mimeType, StringComparison.InvariantCultureIgnoreCase));
    if (encoder == null) throw new Exception($"Encoder not found for mime type {mimeType}");
    return encoder;
}

1
यह बाल खींचने के दिनों को हल करता है। यह सबसे wtf कोड है जो मुझे लगता है कि मैंने कभी लिखा है :)
जेफ डनलप

13

मैंने पाया कि अगर मैं फ़ाइल सहेज रहा था, तो मूल फ़ोल्डर में से एक में एक अनुगामी स्थान था तो GDI + सामान्य अपवाद को फेंक देगा।

दूसरे शब्दों में, अगर मैंने "C: \ Documents and Settings \ myusername \ Local Settings \ Temp \ ABC DEF M1 ट्रेंड वैल्यूज़ \ पिक्चर्स \ पिक्चर" को सहेजने की कोशिश की, तो यह सामान्य अपवाद को फेंक दिया।

मेरा फ़ोल्डर नाम एक फ़ाइल नाम से उत्पन्न हो रहा था जो एक अनुगामी स्थान के रूप में हुआ था इसलिए यह आसान था। यह () और उस पर आगे बढ़ें।


3
भयानक - मैंने कभी नहीं सोचा था कि निर्देशिका पथ को करीब से देखें
jrr100

11

यदि आपका कोड इस प्रकार है तो यह त्रुटि भी होती है

private Image GetImage(byte[] byteArray)
{
   using (var stream = new MemoryStream(byteArray))
   {
       return Image.FromStream(stream);
    }
}

सही है

private Image GetImage(byte[] byteArray)
{
   var stream = new MemoryStream(byteArray))
   return Image.FromStream(stream);        
}

ऐसा इसलिए हो सकता है क्योंकि हम उपयोग करने वाले ब्लॉक से लौट रहे हैं


मेरे लिए यह प्रयोग ब्लॉक में लौटने वाला था। मैं अभी भी उपयोग कर रहा हूं, लेकिन मैं ब्लॉक के बाहर मान लौटाता हूं। धन्यवाद!
ड्रैगॉफ

1
मुझे पता चला कि "कठिन रास्ता" अगर आप उस छवि को फिर से एक नई स्ट्रीम में सहेज रहे हैं (जैसे HttpContext.Response.OutputStream उदाहरण के लिए) तो आपको एक स्ट्रीम करने की भी आवश्यकता होगी। फ़्लश (), यदि त्रुटि नहीं है तो फिर।
लुसियन

11

यह फ्रेड की प्रतिक्रिया का एक विस्तार / योग्यता है जिसमें कहा गया है: "GDI एक छवि की ऊंचाई 65534 तक सीमित करता है"। हम अपने .NET नेटवर्क्स में से एक के साथ इस मुद्दे पर भागे, और पोस्ट को देखते हुए, हमारी आउटसोर्सिंग टीम ने अपने हाथ हवा में उठाए और कहा कि वे बड़े बदलाव के बिना समस्या को ठीक नहीं कर सकते।

मेरे परीक्षण के आधार पर, 65534 से अधिक ऊँचाई वाली छवियों को बनाना / हेरफेर करना संभव है, लेकिन समस्या तब उत्पन्न होती है जब किसी धारा या फ़ाइल को CERTAIN FORMATS में सहेजा जाता है । निम्नलिखित कोड में, t.Save () विधि कॉल हमारे मित्र को सामान्य अपवाद फेंकता है जब पिक्सेल ऊंचाई मेरे लिए 65501 है। जिज्ञासा के कारणों के लिए, मैंने चौड़ाई के लिए परीक्षण दोहराया, और उसी सीमा को बचत पर लागू किया गया।

    for (int i = 65498; i <= 100000; i++)
    {
        using (Bitmap t = new Bitmap(800, i))
        using (Graphics gBmp = Graphics.FromImage(t))
        {
            Color green = Color.FromArgb(0x40, 0, 0xff, 0);
            using (Brush greenBrush = new SolidBrush(green))
            {
                // draw a green rectangle to the bitmap in memory
                gBmp.FillRectangle(greenBrush, 0, 0, 799, i);
                if (File.Exists("c:\\temp\\i.jpg"))
                {
                    File.Delete("c:\\temp\\i.jpg");
                }
                t.Save("c:\\temp\\i.jpg", ImageFormat.Jpeg);
            }
        }
        GC.Collect();
    }

यदि आप मेमोरी स्ट्रीम में लिखते हैं तो वही त्रुटि भी होती है।

इसे प्राप्त करने के लिए, आप ऊपर दिए गए कोड को दोहरा सकते हैं और ImageFormat.Tiff या ImageFormat.Bmp को ImageFormat.Jpeg के विकल्प के रूप में बदल सकते हैं।

यह मेरे लिए ऊँचाई / 100,000 की चौड़ाई तक चलता है - मैंने सीमाओं का परीक्षण नहीं किया। जैसा कि होता है। टिफ़ हमारे लिए एक व्यवहार्य विकल्प था।

चेतावनी दी

मेमोरी में TIFF स्ट्रीम / फाइलें उनके JPG समकक्षों की तुलना में अधिक मेमोरी का उपभोग करती हैं।


10

एक बहुत ही समान समस्या थी और छवि को क्लोन करने की भी कोशिश की जो काम नहीं करती है। मैंने पाया कि सबसे अच्छा समाधान उस छवि से एक नया बिटमैप ऑब्जेक्ट बनाना था जिसे मेमोरी स्ट्रीम से लोड किया गया था। इस तरह धारा को उदासीन किया जा सकता है

using (var m = new MemoryStream())
{
    var img = new Bitmap(Image.FromStream(m));
    return img;
}

उम्मीद है की यह मदद करेगा।


6

अनुमति के कारण त्रुटि हो रही है। सुनिश्चित करें कि फ़ोल्डर में सभी तत्व हैं।

public Image Base64ToImage(string base64String)
    {
        // Convert Base64 String to byte[]
        byte[] imageBytes = Convert.FromBase64String(base64String);
        MemoryStream ms = new MemoryStream(imageBytes, 0,
          imageBytes.Length);

        // Convert byte[] to Image
        ms.Write(imageBytes, 0, imageBytes.Length);
        Image image = Image.FromStream(ms, true);
        return image;
    }

 img.Save("YOUR PATH TO SAVE IMAGE")

मैं आपसे सहमत हूँ। मैंने इस समस्या को PERMISSION
praguan

5

SOLVED - मुझे यह सटीक समस्या थी। मेरे लिए, IIS सर्वर पर IUSR के लिए डिस्क कोटा को ठीक करना था। इस उदाहरण में, हमारे पास वस्तुओं और इस तरह की छवियों के साथ एक कैटलॉग ऐप है। "बेनामी वेब उपयोगकर्ता" के लिए अपलोड कोटा 100MB पर सेट किया गया था, जो इस विशेष होस्टिंग कंपनी के IIS सर्वर के लिए डिफ़ॉल्ट है। मैंने इसे 400MB पर रखा और बिना किसी त्रुटि के चित्र अपलोड करने में सक्षम था।

यह आपका मुद्दा नहीं हो सकता है, लेकिन अगर यह है, तो यह एक आसान तय है।


4

मेरे मामले में समस्या उस मार्ग में थी जिसे मैं (मूल C:\) बचा रहा था । D:\111\अपवाद को बदलने के लिए इसे बदलना ।


4

इस त्रुटि का दूसरा कारण है - आप जिस पथ को बिटमैप उदाहरण के सहेजे गए तरीके से इंगित करते हैं वह मौजूद नहीं है या आपने पूर्ण / मान्य पथ की आपूर्ति नहीं की है।

बस यह त्रुटि थी क्योंकि मैं एक फ़ाइलनाम में गुजर रहा था और पूर्ण पथ नहीं था!

हो जाता है!


4

मेरी बारी!

using (System.Drawing.Image img = Bitmap.FromFile(fileName))
{
      ... do some manipulation of img ...
      img.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg);
}

इसे मिल गया है। सहेजें ... क्योंकि उपयोग () फ़ाइल को खुला रखा है, इसलिए मैं इसे अधिलेखित नहीं कर सकता। शायद यह भविष्य में किसी की मदद करेगा।


4

एक ही समस्या मैं सामना कर रहा था। लेकिन मेरे मामले में, मैं सी ड्राइव में फ़ाइल को बचाने की कोशिश कर रहा था और यह सुलभ नहीं था। इसलिए मैंने इसे डी ड्राइव में सहेजने की कोशिश की जो पूरी तरह से सुलभ थी और मैं सफल रहा।

इसलिए सबसे पहले अपने फोल्डर को चेक करें जिसमें आप सेव करने की कोशिश कर रहे हैं। उस विशेष फ़ोल्डर के लिए आपके पास सभी (पढ़ना और लिखना) अधिकार होना चाहिए।


कारण सामान्य रूप से c बिना प्रशासक की अनुमति के अनुमति नहीं देता है।
इक्के आज़म खान

2

मुझे लगता है कि आपका "जेपीईजी" मामला वास्तव में है:

            default:
                format = ImageFormat.Jpeg;
                break;

क्या आप सुनिश्चित हैं कि प्रारूप jpeg है और कुछ और नहीं?

मैं कोशिश करूँगा:

            case "image/jpg": // or "image/jpeg" !
                format = ImageFormat.Jpeg;
                break;

या जांचें कि imageToConvert.MimeType()वास्तव में क्या लौट रहा है।

अपडेट करें

क्या कोई अन्य आरंभीकरण है जिसे आपको मेमोरीस्ट्रीम ऑब्जेक्ट में करने की आवश्यकता है?


धन्यवाद। इसे निश्चित रूप से सही प्रारूप के साथ कहा जा रहा है। मैं एक jpg लोड करता हूं, डिबग करता हूं और पुष्टि करता हूं कि माइम को इमेज / जेपीईजी के रूप में मान्यता प्राप्त है और प्रारूप जेपीजी है।
15 अप्रैल को madcapnmckay

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

2
  • मैं एक परीक्षण सर्वर पर इस मुद्दे पर था, लेकिन लाइव सर्वर पर नहीं।
  • मैं एक स्ट्रीम में छवि लिख रहा था, इसलिए यह एक अनुमति मुद्दा नहीं था।
  • मैं सीधे परीक्षण सर्वर से कुछ .dll की तैनाती कर रहा हूं।
  • पूरे समाधान को तैनात करना इस मुद्दे को तय करता है, इसलिए यह शायद एक अजीब संकलन था

2

बस ढेर पर एक और संभावित समाधान फेंकने के लिए, मैं इस त्रुटि संदेश के साथ भागे मामले का उल्लेख करूंगा। विधि Bitmap.Saveइस अपवाद को फेंक देगी जब एक बिटमैप को मैंने सहेजा था और प्रदर्शित कर रहा था। मुझे पता लगा कि अगर बयान में इस पर कोई ब्रेकपॉइंट होता तो यह अपवाद नहीं फेंकता, न ही इससे Bitmap.Saveपहले होताThread.Sleep(500) मैं इससे तो मुझे लगता है कि किसी तरह का संसाधन विवाद चल रहा है।

इस अपवाद को रोकने के लिए बस छवि को एक नए बिटमैप ऑब्जेक्ट पर कॉपी करने के लिए पर्याप्त था:

new Bitmap(oldbitmap).Save(filename);

2

हमें PDFउत्पादन सर्वर पर ImageProcessor lib का उपयोग करके छवि को आकार देने या आकार बदलने पर एक समान समस्या थी ।

एप्लिकेशन पूल को रीसायकल करें समस्या को ठीक करें।


1

यदि आप किसी छवि को दूरस्थ स्थान पर सहेजने का प्रयास कर रहे हैं, तो सुनिश्चित करें कि NETWORK_SERVICEउपयोगकर्ता खाते को सुरक्षा सेटिंग्स में जोड़ना चाहिए और उस उपयोगकर्ता को अनुमतियाँ पढ़ने और लिखने दें। अन्यथा यह काम करने वाला नहीं है।


1
byte[] bts = (byte[])page1.EnhMetaFileBits; 
using (var ms = new MemoryStream(bts)) 
{ 
    var image = System.Drawing.Image.FromStream(ms); 
    System.Drawing.Image img = image.GetThumbnailImage(200, 260, null, IntPtr.Zero);      
    img.Save(NewPath, System.Drawing.Imaging.ImageFormat.Png);
}

1

मुझे यह त्रुटि इसलिए भी है क्योंकि मैं पिछली सहेजी गई छवियों के समान नाम वाली छवियों को सहेजने का प्रयास कर रहा हूं।

सुनिश्चित करें कि आप डुप्लिकेट नाम के साथ छवियों को नहीं बचाते हैं।

थार के लिए उदाहरण के लिए एक 'रैंडम' फ़ंक्शन ( C # का रैंडम नंबर जनरेटर काम कैसे करता है? ) या उदाहरण के लिए एक गाइड उत्पन्न करें ( http://betterexplained.com/articles/the-quick-guide-to-guids/ )


1

सरल, बिटमैप का एक नया उदाहरण बनाएँ समस्या हल करती है।

string imagePath = Path.Combine(Environment.CurrentDirectory, $"Bhatti{i}.png");
Bitmap bitmap = new Bitmap(image);
bitmap.Save(imagePath);

0

मेरे लिए मैं उपयोग कर रहा था Image.Save(Stream, ImageCodecInfo, EncoderParameters)और जाहिर तौर पर यह कुख्यात A generic error occurred in GDI+त्रुटि पैदा कर रहा था ।

मैं EncoderParameter100% गुणवत्ता में jpegs को बचाने के लिए उपयोग करने की कोशिश कर रहा था । यह पूरी तरह से "मेरी मशीन" (दोह!) पर काम कर रहा था न कि उत्पादन पर।

जब मैंने Image.Save(Stream, ImageFormat)इसके बजाय प्रयोग किया , तो त्रुटि गायब हो गई! इसलिए एक बेवकूफ की तरह मैंने बाद का उपयोग करना जारी रखा, हालांकि यह उन्हें डिफ़ॉल्ट गुणवत्ता में बचाता है जो मुझे लगता है कि सिर्फ 50% है।

उम्मीद है कि यह जानकारी किसी की मदद करे।


0

मुझे भी समस्या का सामना करना पड़ा। लोडिंग स्ट्रीम के निपटान के कारण समस्या थी। लेकिन मैंने इसका निपटान नहीं किया, यह अंदर था। नेट फ्रेमवर्क। मुझे बस इतना करना था:

image_instance = Image.FromFile(file_name);

के बजाय

image_instance.Load(file_name);

image_instance System की तरह है। Windows ।orms.PictureBox! पिक्चरबॉक्स का लोड () उस स्ट्रीम को डिस्पोज़ करता है जिससे छवि लोड की गई थी, और मुझे यह नहीं पता था।


0

@Savindra से जवाब के आधार पर, आप अगर RHM आपके आवेदन पर और कोशिश करते हैं और एक के रूप में चलाने के व्यवस्थापक तो यह आपकी समस्या का समाधान करना चाहिए।

मेरा एक अनुमति मुद्दा लग रहा था।


0

इस तरह की त्रुटि के कारण संभावित समस्याएं हैं:

  1. निर्देशिका मौजूद नहीं है (जिस विधि को आप कॉल कर रहे हैं वह स्वचालित रूप से आपके लिए यह निर्देशिका नहीं बनाएगी)
  2. आउटपुट निर्देशिका में लिखने के लिए सुरक्षा अनुमतियाँ उपयोगकर्ता को एप्लिकेशन चलाने के लिए लिखने की अनुमति नहीं देती हैं

मुझे आशा है कि यह मदद करता है, यह मेरे मुद्दे के लिए फिक्स था, मैंने बस यह सुनिश्चित किया कि आउटपुट छवि को बचाने से पहले आउटपुट निर्देशिका मौजूद है!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.