2009-07-10 10 views
40

मैं एक छवि अपलोड करने वाले और काटने वाला जो थंबनेल बनाता है और मैं कभी कभी निम्न पंक्ति पर मेमोरी अपवाद के बाहर एक मिल है आउट:System.Drawing.Image.FromFile (स्मृति अपवाद)

Dim bm As Bitmap = System.Drawing.Image.FromFile(imageFile) 

घटना त्रुटि का छोटा और बहुत दुर्लभ है, लेकिन मैं हमेशा यह जानना चाहता हूं कि इसका कारण क्या हो सकता है। ImageFile वैरिएबल सिर्फ एक सर्वर है। मैपपाथ छवि के पथ पर।

मुझे उत्सुकता थी कि अगर किसी ने पहले इस मुद्दे का अनुभव किया था और यदि उनके पास कोई विचार था तो इसका क्या कारण हो सकता है? क्या यह शायद छवि का आकार है?

यदि आवश्यक हो तो मैं कोड पोस्ट कर सकता हूं और मेरे पास कोई सहायक जानकारी है, लेकिन इस पर लोगों की राय सुनना अच्छा लगेगा।

+0

क्या वह छवि है जिसे आप असाधारण रूप से बड़ा लोड करने की कोशिश कर रहे हैं? – RCIX

+0

सभी छवियां ~ 700kb से कम हैं। – dooburt

+3

क्या आप वाकई प्रश्न में फ़ाइल वैध छवि फ़ाइल है? मैंने ठीक उसी स्थिति में भी भाग लिया है, लेकिन फ़ाइल किसी अन्य प्रोग्राम में लोड करने में सक्षम नहीं है। –

उत्तर

38

यह जानना उचित है कि OutOfMemoryException हमेशा वास्तव में का मतलब है कि यह स्मृति से बाहर है - विशेष रूप से फ़ाइलों से निपटने पर नहीं। मेरा मानना ​​है कि अगर आप किसी कारण से हैंडल से बाहर हो जाते हैं तो यह भी हो सकता है।

क्या आप उनके साथ किए जाने के बाद अपने सभी बिटमैप का निपटान कर रहे हैं? क्या यह एक छवि के लिए दोहराया जाता है?

+0

हाय जॉन, त्वरित उत्तर के लिए धन्यवाद। हां, मैं छवि और ग्राफिक्स दोनों का निपटान करता हूं। मंद bmPhoto नए बिटमैप (targetW, targetH, PixelFormat.Format24bppRgb) मंद grPhoto ग्राफिक्स = Graphics.FromImage (bmPhoto) के रूप में bmPhoto.Dispose (के रूप में) bmPhoto = कुछ भी नहीं grPhoto.Dispose() grPhoto = कुछ भी नहीं पुनरावर्तनीयता के लिए, यह बहुत यादृच्छिक नहीं है - लेकिन छवियां हमेशा बड़ी होती हैं (हालांकि 700k से बड़ा नहीं ~)। – dooburt

+4

मुझे संदेह है कि यह फ़ाइल का आकार नहीं हो सकता है, लेकिन स्मृति में छवि आकार - बड़ी संख्या में पिक्सेल के साथ एक बहुत भारी संकुचित छवि आपको समस्याएं दे सकती है ... –

+2

हाय जॉन, टिप्पणी के लिए धन्यवाद। सभी के साथ एक क्षतिग्रस्त छवि होने के लिए बाहर निकलता है। * आह *। एक अक्षम उपयोगकर्ता। हालांकि आपके उत्तरों के लिए धन्यवाद :) – dooburt

30

यदि यह एक खराब छवि फ़ाइल नहीं थी, लेकिन वास्तव में Image.FromFile के साथ सामान्य समस्या थी जिसमें यह फ़ाइल हैंडल खोलता है, तो समाधान Image.FromStream का उपयोग करता है।

using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)) 
{ 
    using (Image original = Image.FromStream(fs)) 
    { 
     ... 

एक स्पष्ट Dispose(), एक using() बयान का उपयोग करना या बिटमैप पर null को मान सेट Image.FromFile के साथ इस मुद्दे का समाधान नहीं करता।

तो यदि आप एक समय के लिए दौड़ते हैं और कई फाइलें खोलते हैं तो Image.FromStream() का उपयोग करने पर विचार करें।

+0

असल में, यदि आप एक अप्रबंधित हैंडल के माध्यम से फ़ाइल से जुड़ी एक स्ट्रीम का निपटान करते हैं, तो हैंडल बंद हो जाएगा और फिर जीसी के लिए कोई इंतजार नहीं होगा। आखिरकार, यह शुरू करने के लिए IDisposable का पूरा बिंदु है। –

+0

इसे एक कदम आगे भी ले जाया जा सकता है। http://blogs.msdn.com/b/omars/archive/2004/03/29/100941.aspx, अभी भी लागू होता प्रतीत होता है। –

+0

इस मामले में अल्फा के साथ पीडीएफ के बारे में क्या? –

4

इसके अलावा, आप पढ़ने के मोड में खोल सकते हैं,

public Image OpenImage(string previewFile) 
     { 
      FileStream fs = new FileStream(previewFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
      return Image.FromStream(fs); 
     } 
1

मैं आज एक ऐसी ही समस्या थी जब मैं एक छवि और उसके बाद फसल आकार बदलने के लिए कोशिश कर रहा था (आप दो जगह एक ही समय में इसका इस्तेमाल करना चाहते हैं) यह, क्या हुआ यह है कि मैंने छवि का आकार बदलने के लिए इस कोड का उपयोग किया था।

private static Image resizeImage(Image imgToResize, Size size) 
{ 
    int sourceWidth = imgToResize.Width; 
    int sourceHeight = imgToResize.Height; 

    float nPercent = 0; 
    float nPercentW = 0; 
    float nPercentH = 0; 

    nPercentW = ((float)size.Width/(float)sourceWidth); 
    nPercentH = ((float)size.Height/(float)sourceHeight); 

    if (nPercentH < nPercentW) 
     nPercent = nPercentH; 
    else 
     nPercent = nPercentW; 

    int destWidth = (int)(sourceWidth * nPercent); 
    int destHeight = (int)(sourceHeight * nPercent); 

    Bitmap b = new Bitmap(destWidth, destHeight); 
    Graphics g = Graphics.FromImage((Image)b); 
    g.InterpolationMode = InterpolationMode.HighQualityBicubic; 

    g.DrawImage(imgToResize, 0, 0, destWidth, destHeight); 
    g.Dispose(); 

    return (Image)b; 
} 

और फिर फसल के लिए इस कोड को ...

private static Image cropImage(Image img, Rectangle cropArea) 
{ 
    Bitmap bmpImage = new Bitmap(img); 
    Bitmap bmpCrop = bmpImage.Clone(cropArea, 
    bmpImage.PixelFormat); 
    return (Image)(bmpCrop); 
} 

फिर यह कैसे मैं ऊपर कोड कहा जाता है ...

Image img = Image.FromFile(@"C:\Users\****\Pictures\image.jpg"); 
img = ImageHandler.ResizeImage(img, new Size(400, 300)); 
img = ImageHandler.CropImage(img, new Rectangle(0, 25, 400, 250)); 
long quality = 90; 

मैं फसल पर हो रही त्रुटियों रखा भाग, Resizer ठीक काम किया!

बाहर निकलता है, Resizer के अंदर क्या हो रहा था फसल समारोह में त्रुटियों को फेंक रहा था। आकार की गणना छवि के वास्तविक आयामों को 400 के बजाय 39 9 की तरह आने के लिए आ रही थी।

इसलिए, जब मैं फसल के लिए तर्क के रूप में 400 में पारित हुआ, तो यह 39 9 पीएक्स फसल करने की कोशिश कर रहा था 400px चौड़ाई बीएमपी के साथ विस्तृत छवि और यह स्मृति त्रुटि से बाहर फेंक दिया!

उपरोक्त कोड में से अधिकांश http://www.switchonthecode.com/tutorials/csharp-tutorial-image-editing-saving-cropping-and-resizing

5

पर पाया गया था मैं आज ही समस्या का मारा, जबकि छवियों से भरा एक फ़ोल्डर के लिए थंबनेल छवियों का निर्माण। यह पता चला है कि "आउट ऑफ़ मेमोरी" हर बार एक ही बिंदु पर ठीक से हुआ था। जब मैंने छवियों को परिवर्तित करने के लिए फ़ोल्डर को देखा तो मैंने पाया कि समस्या बनाने वाली फ़ाइल thumbs.db थी। मैंने यह सुनिश्चित करने के लिए कुछ कोड जोड़ा कि केवल छवि फ़ाइलों को परिवर्तित किया जा रहा है और समस्या हल हो गई थी।

मेरे कोड मूल रूप से

For Each imageFile as FileInfo in fileList 
If imageFile.Extension = ".jpg" Or imageFile.Extension = ".gif" Then 
    ...proceed with the conversion 
End If 
Next 

आशा इस मदद करता है।

0

मुझे एक ही समस्या बैच प्रोसेसिंग टिफ फाइलें हैं। अधिकांश फाइलें अपवाद नहीं फेंक रही हैं लेकिन कुछ फाइलें एएसपी.NET 4.0 में "मेमोरी आउट" अपवाद फेंक रही हैं। मैंने कुछ फाइलों के लिए और उसी फ़ोल्डर के भीतर क्यों पता लगाने के लिए बाइनरी डेटा का उपयोग किया है। यह एएसपी.NET एएसपीएनईटी या नेटवर्क सेवा खाते के लिए अनुमति समस्या नहीं हो सकती है क्योंकि अन्य फाइलें काम कर रही हैं।

मैंने iTextSharp.text.Image क्लास खोला है और पाया है कि GetInstance() के लिए कई ओवरलोडेड विधियां हैं। मैंने निम्नलिखित कोड का उपयोग करके अपनी समस्या का समाधान किया है: नोट: पकड़ ब्लॉक समस्याग्रस्त फ़ाइलों के लिए चलाएगा।

   iTextSharp.text.Image image = null; 
      try 
       { 
        var imgStream = GetImageStream(path); 
        image = iTextSharp.text.Image.GetInstance(imgStream); 
       } 
       catch { 
        iTextSharp.text.pdf.RandomAccessFileOrArray ra = null; 
        ra = new iTextSharp.text.pdf.RandomAccessFileOrArray(path); 
        image = iTextSharp.text.pdf.codec.TiffImage.GetTiffImage(ra, 1); 

        if (ra != null) 
         ra.Close(); 

       } 
+0

इस मामले में GetImageStream (पथ) विधि कहां है? एक बार जब आपके पास iTextSharp.text.Image की छवि ऑब्जेक्ट हो, तो आप इसे System.Drawing.Image ऑब्जेक्ट में कैसे परिवर्तित करते हैं? – Chirag

1

तो एक छवि एक आइकन तो अलग लदान से निपटने की आवश्यकता है अगले समारोह में की तरह, है:

public static Image loadImage(string imagePath) 
    { 
     Image loadedImage = null; 
     if (!File.Exists(imagePath)) return loadedImage; 
     try 
     { 
      FileInfo fileInfo = new FileInfo(imagePath); 
      if (fileInfo.Extension.Equals(".jpg") || fileInfo.Extension.Equals(".jpeg") || 
       fileInfo.Extension.Equals(".bmp") || fileInfo.Extension.Equals(".png") || 
       fileInfo.Extension.Equals(".gif")) 
      { 
       loadedImage = Image.FromFile(imagePath); 
      } 
      else if (fileInfo.Extension.Equals(".ico")) 
      { 
       Bitmap aBitmap = Bitmap.FromHicon(new 
              Icon(imagePath, new Size(200, 200)).Handle); 
       loadedImage = ImageFuncs.ResizeImage(aBitmap, new Size(30, 30)); 
      } 
     } 
     catch (Exception eLocal) 
     { 
      MessageBox.Show(imagePath + " loading error: " + eLocal.Message); 
     } 
     return loadedImage; 
    } 
1

मैं एक उपयोगिता के साथ एक ही समस्या थी मैं पीडीएफ के लिए TIFF (रों) कन्वर्ट करने के लिए लिखा था (रों)। अक्सर मुझे आपके जैसे ही लाइन पर "स्मृति से बाहर" त्रुटि मिल जाएगी।

System.Drawing.Image.FromFile(imageFile) 

तब मुझे पता चला त्रुटि केवल जब फाइल एक्सटेंशन था ".tiff" और ठीक काम के बाद मैं ".tif"

1

इसके अलावा का एक विस्तार के साथ इसका नाम बदलकर देखें कि क्या आप नहीं खोला है क्या हुआ कहीं और फाइलें। जाहिर है, जब आप दो बार फ़ाइल खोलते हैं (यहां तक ​​कि File.Open() के साथ भी OutOfMemoryException भी फेंक दिया जाता है ...

0

मेरे पास एक ही समस्या है, कोड को कहां देखना है, अगर मैं यह सुनिश्चित करना चाहता हूं कि मैं खोल सकता हूं किसी भी छवि दर्शक के साथ छवि और यह पता लगाया गया है कि छवि दूषित/क्षतिग्रस्त है हालांकि यह 1 केबी आकार के साथ एक पीएनजी फ़ाइल है। एक ही स्थान में एक नई छवि जोड़ा, तो यह ठीक काम किया।