জিডিআই +, জেপিজি ইমেজ টু মেমরিস্ট্রিমে একটি জেনেরিক ত্রুটি ঘটেছে


326

এটি পুরো ওয়েব জুড়ে একটি কুখ্যাত ত্রুটি বলে মনে হচ্ছে। আমার পরিস্থিতি ফিট না হওয়ায় আমি আমার সমস্যার উত্তর খুঁজে নিতে পারিনি। আমি যখন স্ট্রিমে ছবিটি সংরক্ষণ করি তখন একটি ব্যতিক্রম ছুঁড়ে যায়।

অদ্ভুতভাবে এটি একটি পিএনজি দিয়ে পুরোপুরি কাজ করে তবে উপরের ত্রুটিটি জেপিজি এবং জিআইএফ দিয়ে দেয় যা বরং বিভ্রান্তিকর।

বেশিরভাগ অনুরূপ সমস্যাটি অনুমতি ছাড়াই ফাইলগুলিতে চিত্রগুলি সংরক্ষণ করার সাথে সম্পর্কিত। হাস্যকরভাবে সমাধানটি হ'ল আমি যেমন করছি তেমন কোনও মেমরি স্ট্রিম ব্যবহার করা ....

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. সেই মাইমির জন্য এনকোডারটি পুনরুদ্ধার করা হচ্ছে জেপিগ মানের সেটিংস সহ passing



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) এবং মাইম টাইপের মতো আইডি সমস্ত চিত্রের বস্তুগুলিতে সঠিক হতে পারে কারণ এটি জেনারিক লেখা শক্ত করে তোলে অন্যথায় হ্যান্ডলিং কোড।

সম্পাদনা

এটি আমার প্রাথমিক অনুসন্ধানে আসে নি তবে এখানে জোন স্কীটের উত্তর


4
আমি বুঝতে পারি নি যে আপনি যখন কোনও মেমরি স্ট্রিম থেকে একটি বিটম্যাপ পাবেন তখন আপনার স্ট্রিমটি বন্ধ করা উচিত নয়। খুব সহায়ক, আপনাকে ধন্যবাদ
ম্যাকডন

38
ধন্যবাদ. এটি সম্ভবত আমার চুলের শেষ রক্ষা করেছে।
21

6
ধন্যবাদ! এটি আমার অনেক সময় সাশ্রয় করেছে, তবে একটি বিষয়, আপনার উত্তরটির শুরুতে ত্রুটির কারণটি তুলে ধরতে আপনি কি আপত্তি করবেন বলে আমি (এবং আমার ধারণা বেশিরভাগ অংশে) উত্তরের মাধ্যমে মূল স্কিমে মিস হয়েছে, সম্ভবত এমন কিছু " স্মৃতি স্ট্রিমটি বন্ধ করবেন না যদি আপনি আবারও চিত্রটি ব্যবহার করতে চান "দুর্দান্ত হবে; ডি
ডরড

6
আপনার "dst" পরিবর্তনশীল কি?
ডব্লিউইএফএক্স 21

1
@madcapnmckay দয়া করে 'ডিস্ট' ভেরিয়েবল কী এবং এর তাত্পর্য ব্যাখ্যা করুন
মাইক টি

131

যদি আপনি এই ত্রুটিটি পেয়ে থাকেন তবে আমি বলতে পারি যে আপনার অ্যাপ্লিকেশনটির কোনও ডিরেক্টরিতে লেখার অনুমতি নেই।

উদাহরণস্বরূপ, আপনি যদি মেমরি স্ট্রিম থেকে ফাইল সিস্টেমে চিত্রটি সংরক্ষণ করার চেষ্টা করছেন তবে আপনি এই ত্রুটিটি পেয়ে যেতে পারেন।

আপনি যদি এক্সপি ব্যবহার করে থাকেন তবে দয়া করে সেই ফোল্ডারে অ্যা্যাসপেট অ্যাকাউন্টের জন্য লেখার অনুমতি যুক্ত করতে ভুলবেন না।

যদি আপনি উইন্ডোজ সার্ভার (2003,2008) বা ভিস্তা ব্যবহার করে থাকেন তবে নিশ্চিত হয়ে নিন যে নেটওয়ার্ক পরিষেবা অ্যাকাউন্টের জন্য লেখার অনুমতি যুক্ত করুন।

আশা করি এটি কারও সাহায্য করবে।


7
আপনি না! জঘন্য লেখার অনুমতি নিয়ে আমি ২ ঘন্টা নষ্ট করেছি ... এটি পোস্ট করতে এখানে এসেছি। আশা করি আপনি আরও উচ্চতর সুযোগ পাবেন। :)
গ্লেনো

2
এটিই ছিল আমার জন্য সমাধান। +1 সম্পূর্ণ!
গ্র্যান্ডাইজার

5
আপনি বিটম্যাপ সংরক্ষণ করার আগে ফাইল.ড্রাইটআলটেক্সট ("filename.jpg", "") এর পরে ফাইল.ডিলিটফিল ("filename.jpg") করতে পারেন। আমার বেনমার্কে এটি মাত্র .001 সেকেন্ড সময় নেয় এবং আপনি একটি চমৎকার 'আপনার কাছে ফাইল নাম সংরক্ষণ করার অনুমতি নেই।
Jpg

@ ডেস্পটার আপনি ফাইল বলতে চাইছেন।ডিলিট (), তবে এটি খুব সহজ কৌশল! আমি যখনই বিটম্যাপটি সংরক্ষণ করি অবশ্যই এটি ব্যবহার করতে যাচ্ছি।
ডি কোয়েজি

2
আমার ক্ষেত্রে ডিরেক্টরিটি বিদ্যমান ছিল না।
সাইলেন্সডমেজেজ

54

আমি ত্রুটির এই কারণটি যুক্ত করব এবং আশা করি এটি ভবিষ্যতের কিছু ইন্টারনেট ভ্রমণকারীকে সহায়তা করে। :)

জিডিআই + একটি চিত্রের সর্বোচ্চ উচ্চতা 65500 এর মধ্যে সীমাবদ্ধ করে to

আমরা কিছু বেসিক ইমেজ রাইজাইটিং করি, তবে মাপ পরিবর্তন করে আমরা অনুপাতের অনুপাত বজায় রাখার চেষ্টা করি। আমাদের একজন কিউএর ছেলে আছে যিনি এই চাকরিতে কিছুটা ভাল আছেন; 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এবং পরে চিত্রটিকে একটি মেমরি স্ট্রিমে অনুলিপি করার চেষ্টা করেছি এবং ভয় পেয়েছি "জিডিআইতে জেনেরিক ত্রুটি" বার্তাটি।
অ্যাপলবি

আপনার লিঙ্কটি আমাকে অসীম পুননির্দেশনা দিচ্ছিল; এই এক কাজ করে। আমি সঞ্চয় PixelFormat.Format32bppArgbকরতে সমস্যা হচ্ছিলাম তবে তা নয় PixelFormat.Format1bppIndexed। আপনি যে নিবন্ধটি সংযুক্ত করেছেন তা কেন ব্যাখ্যা করেছে: জিডিআই + সবকিছু স্মৃতিতে রাখার চেয়ে উত্স স্ট্রিম থেকে বিটম্যাপের ডেটা পুনরায় ডিকোড করতে পছন্দ করতে পারে। আমার অনুমান যে এটি 1bpp চিত্রগুলি পুনরায় ডিকোড করে না।
labreuer

এমনকি নতুন লিঙ্কটি আর কাজ করে না। একটি সাধারণ গুগল অনুসন্ধান সঠিক পৃষ্ঠাটি প্রকাশ করবে বলে মনে হচ্ছে না। তবে আমি এই উত্তরটি পেয়ে খুব আনন্দিত! এই সমস্যাটির
কাটজয়েক

28

আপনি যদি কোনও অবৈধ পথে বাঁচানোর চেষ্টা করেন বা অনুমতি সংক্রান্ত কোনও সমস্যা থাকে তবে আপনি এই ব্যতিক্রমটিও পাবেন।

যদি আপনি 100% নিশ্চিত না হন যে ফাইলের পাথ উপলব্ধ এবং অনুমতিগুলি সঠিক আছে তবে কোনও পাঠ্য ফাইলে একটি লেখার চেষ্টা করুন। খুব সাধারণ ফিক্সটি কী হতে পারে তা প্রকাশ করতে এটি কয়েক সেকেন্ড সময় নেয়।

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

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

এবং আপনার ফাইলটি পরিষ্কার করতে ভুলবেন না।


এটি আমার জন্য সমস্যা ছিল ... আমি আশা করি ত্রুটিটি কম অস্পষ্ট হত, আমার অনেক সময় বাঁচাত।
ওফপেজ

হ্যাঁ! আপনি যে ফোল্ডারে সংরক্ষণ করছেন সেটি অবশ্যই বিদ্যমান। আমি এখন একটি চিত্র সংরক্ষণ করার চেষ্টা করার আগে, আমি প্রথমে এটির জন্য একটি চেক করব। (তবুও, ত্রুটিটি আমাকে বছরে প্রায় একবার ধরে ফেলে))
ম্যাগনাস স্মিথ

আমার পাথ ফাইলের পরিবর্তে একটি ডিরেক্টরি ছিল।
আসেন কাসিমভ

20

চিত্রটি বিটম্যাপ ভেরিয়েবলে সংরক্ষণ করুন

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

এটি আমার সমস্যার সমাধান করেছে। আপনি কী ব্যাখ্যা করতে পারেন যে বিটম্যাপে ছবিটি সংরক্ষণ করা ব্যতিক্রমকে ভয় পেয়েছে?
জেএমসি

আমার দিন বাঁচিয়েছে .. সমস্যাটি কী কারণে হয়েছে তা জানেন না তবে বিটম্যাপ কাজগুলি সংরক্ষণ করুন .. সিস্টেম.ড্রয়িং.আইমেজ মেমরি স্ট্রিমে সংরক্ষণ করবে না তবে বিটম্যাপ করে !!!
সান

এটি আমার জন্য সেরা সমাধান ছিল। নতুন বিটম্যাপ তৈরি করা এবং এটি থেকে রূপান্তর করা।
uzay95

এই যাদুটি কীভাবে কাজ করে তা ধারণা নেই - তবে এটি করে।
জিভ ওয়েসম্যান

17

যদি কেউ আমার মতো বোকা জিনিস হিসাবে কাজ করে তবেই। 1. নিশ্চিত করুন যে পথের অস্তিত্ব রয়েছে। ২. আপনার লেখার অনুমতি রয়েছে কিনা তা নিশ্চিত করুন। ৩. আপনার পথটি সঠিক কিনা তা নিশ্চিত করুন, আমার ক্ষেত্রে আমি টার্গেটপথে ফাইলের নাম অনুপস্থিত ছিল :(

এটি বলা উচিত ছিল, আপনার পথটি "জিডিআই + তে জেনেরিক ত্রুটি ঘটেছে" এর চেয়ে সফল হয়


16

জেপিইজি সংরক্ষণ করার সময় আমি এই ত্রুটিটি পেয়েছি তবে কেবলমাত্র নির্দিষ্ট চিত্রের জন্য।

আমার চূড়ান্ত কোড:

  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
  }

আমি ছবিগুলি তৈরি করি নি তাই পার্থক্য কী তা আমি বলতে পারি না।
কেউ যদি এটি ব্যাখ্যা করতে পারে আমি প্রশংসা করব।

এটি আমার সেভজেপিগ ফাংশনটি কেবলমাত্র এফওয়াইআই:

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

আমি দেখতে পেয়েছি যে আমি যে সকল পিতৃ ফোল্ডারটি ফাইলটি সংরক্ষণ করছি তার মধ্যে যদি একটি স্থানের স্থান থাকে তবে জিডিআই + জেনেরিক ব্যতিক্রম নষ্ট করে দেয়।

অন্য কথায়, আমি যদি "সি: \ ডকুমেন্টস এবং সেটিংস \ মাইউজারনেম \ স্থানীয় সেটিংস \ টেম্প \ এবিসি ডিএফ এম 1 ট্রেন্ড করা মান \ চিত্রগুলি। চিত্র.png" এ সংরক্ষণ করার চেষ্টা করি তবে এটি সাধারণ ব্যতিক্রম ছুঁড়ে ফেলেছে।

আমার ফোল্ডারের নাম একটি ফাইলের নাম থেকে উত্পন্ন হচ্ছিল যাতে পিছনের জায়গার জায়গাটি ঘটেছিল তাই .Trim () করা সহজ ছিল এবং এটি এগিয়ে যান।


3
দুর্দান্ত - আমি কখনই ডিরেক্টরি পথটি ঘনিষ্ঠভাবে দেখার চিন্তা করতাম না
jharr100

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) আপনাকে একটি স্ট্রিমও করতে হবে F ফ্লাশ (), যদি ত্রুটি না ঘটে তবে আবার।
লুসিয়ান

11

এটি ফ্রেডের প্রতিক্রিয়ার একটি প্রসার / যোগ্যতা যা বলেছিল: "জিডিআই একটি চিত্রের উচ্চতা সীমাবদ্ধ করে 65534"। আমরা আমাদের নেট নেট অ্যাপ্লিকেশনগুলির মধ্যে একটি নিয়ে এই সমস্যাটি ছড়িয়েছি এবং পোস্টটি দেখে আমাদের আউটসোর্সিং টিম বাতাসে হাত বাড়িয়েছে এবং বলেছে যে তারা বড় ধরনের পরিবর্তন না করে সমস্যার সমাধান করতে পারে না।

আমার পরীক্ষার উপর ভিত্তি করে উচ্চতা 65534 চেয়ে বড় তৈরি করতে / ইমেজ নিপূণভাবে সম্ভব, কিন্তু সমস্যা দেখা দেয় যখন একটি স্ট্রিম বা ফাইল সংরক্ষণ নির্দিষ্ট বিন্যাসে । নিম্নলিখিত কোডে, 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();
    }

আপনি যদি কোনও মেমরি স্ট্রিম লিখেন তবে একই ত্রুটি ঘটে occurs

এটির গোলটি পেতে, আপনি উপরের কোডটির পুনরাবৃত্তি করতে পারবেন এবং চিত্র ফরম্যাট.টিফ বা ইমেজ ফরম্যাট.বিএমপি বিকল্পের জন্য বিকল্প প্রতিস্থাপন করতে পারেন।

এটি আমার জন্য 100,000 এর উচ্চতা / প্রস্থ পর্যন্ত চলে - আমি সীমা পরীক্ষা করিনি। এটি যেমন ঘটে থাকে। টিফ আমাদের জন্য একটি কার্যকর বিকল্প ছিল।

সতর্ক করা হবে

মেমরি টিআইএফএফ স্ট্রিম / ফাইলগুলি তাদের জেপিজি অংশগুলির চেয়ে বেশি মেমরি গ্রাস করে।


10

খুব অনুরূপ সমস্যা ছিল এবং চিত্রটি ক্লোন করার চেষ্টা করে যা কাজ করে না। আমি খুঁজে পেলাম যে মেমরি স্ট্রিম থেকে লোড হওয়া চিত্র থেকে একটি নতুন বিটম্যাপ অবজেক্ট তৈরি করা সবচেয়ে ভাল সমাধান। এইভাবে প্রবাহটি যেমন নিষ্পত্তি করা যায়

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

আশাকরি এটা সাহায্য করবে.


6

অনুমতি থাকার কারণে ত্রুটি ঘটছে। নিশ্চিত হয়ে নিন যে ফোল্ডারে সমস্ত অনুমতি রয়েছে ION

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 দিয়ে এই সমস্যার সমাধান করেছি
প্রাগুয়ান

5

সলভড - আমার এই সঠিক সমস্যা ছিল। আমার কাছে ঠিক ছিল, আইআইএস সার্ভারে আইইএসআর-এর ডিস্ক কোটা আপ করা। এই উদাহরণে, আমাদের আইটেম এবং এর মতো চিত্রগুলির সাথে একটি ক্যাটালগ অ্যাপ রয়েছে। "বেনামে ওয়েব ব্যবহারকারী" এর জন্য আপলোড কোটা 100MB তে সেট করা হয়েছিল, যা এই নির্দিষ্ট হোস্টিং সংস্থার আইআইএস সার্ভারগুলির জন্য ডিফল্ট। আমি এটিকে 400 এমবিতে আপ করেছি এবং ত্রুটি ছাড়াই চিত্র আপলোড করতে সক্ষম হয়েছি।

এটি আপনার সমস্যা নাও হতে পারে তবে এটি যদি হয় তবে এটি একটি সহজ সমাধান।


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

একই সমস্যার মুখোমুখি হয়েছিলাম। তবে আমার ক্ষেত্রে, আমি সি ড্রাইভে ফাইল সংরক্ষণের চেষ্টা করছিলাম এবং এটি অ্যাক্সেসযোগ্য ছিল না। তাই আমি এটি ডি ড্রাইভে সংরক্ষণ করার চেষ্টা করেছি যা সম্পূর্ণ অ্যাক্সেসযোগ্য ছিল এবং আমি সফল হয়েছিলাম।

সুতরাং প্রথমে আপনার ফোল্ডারগুলি পরীক্ষা করুন যেখানে আপনি সংরক্ষণের চেষ্টা করছেন। আপনার অবশ্যই সেই নির্দিষ্ট ফোল্ডারের জন্য সমস্ত (পড়ুন এবং লিখুন) অধিকার থাকতে হবে।


কারণ সি সাধারণত প্রশাসকের অনুমতি ব্যতীত অনুমতি দেয় না।
আনেক আজম খান

2

আমি লক্ষ্য করেছি যে আপনার "jpeg" কেসটি আসলে:

            default:
                format = ImageFormat.Jpeg;
                break;

আপনি কি নিশ্চিত যে ফর্ম্যাটটি জেপিগ এবং অন্য কিছু নয়?

আমি চেষ্টা করব:

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

বা imageToConvert.MimeType()আসলে কী ফিরে আসছে তা পরীক্ষা করে দেখুন ।

হালনাগাদ

মেমরি স্ট্রিম অবজেক্টটি করার জন্য আপনার আর কি কোনও আরম্ভ করার দরকার নেই?


ধন্যবাদ। এটি অবশ্যই সঠিক বিন্যাসের সাথে ডাকা হচ্ছে। আমি একটি জেপিজি লোড করি, ডিবাগ করি এবং নিশ্চিত করি মাইমটি চিত্র / জেপিগ হিসাবে স্বীকৃত এবং ফর্ম্যাটটি জেপিজি।
madcapnmckay

3
ওহ ভাল - আমি সবসময় প্রথমে সুস্পষ্টটিকে বাদ দেওয়ার চেষ্টা করি। আমি যে সংখ্যাটি করেছি তা আমি গণনা করতে পারি না এবং এটি পরে আমাকে কামড়ানোর জন্য ফিরে আসে।
ক্রিসএফ

2
  • আমার কাছে এই সমস্যাটি টেস্ট সার্ভারে ছিল কিন্তু লাইভ সার্ভারে নয়।
  • আমি একটি স্ট্রিমে ছবিটি লিখছিলাম, সুতরাং এটি কোনও অনুমতিের সমস্যা ছিল না।
  • আমি .dll এর কিছু সরাসরি পরীক্ষার সার্ভারে স্থাপন করছিলাম।
  • পুরো সমাধানটি মোতায়েন করার ফলে সমস্যাটি স্থির হয়ে গেছে, সুতরাং এটি সম্ভবত একটি অদ্ভুত সংকলন mat

2

স্তূপের উপর কেবল অন্য সম্ভাব্য সমাধান নিক্ষেপ করতে, আমি এই ত্রুটি বার্তাটি নিয়ে যে মামলাটি দিয়েছিলাম তা উল্লেখ করব। Bitmap.Saveআমার রূপান্তরিত এবং বিটম্যাপটি সংরক্ষণ করার সময় পদ্ধতিটি এই ব্যতিক্রমটিকে ছুঁড়ে ফেলবে। আমি আবিষ্কার যদি বিবৃতি এটি একটি ব্রেকপয়েন্ট ছিল এটা ব্যতিক্রম নিক্ষেপ করবে না, কিংবা would যদি Bitmap.Saveদ্বারা preceeded ছিলThread.Sleep(500) তবে আমি মনে করি যে কোনও ধরণের সংস্থান বিতর্ক চলছে।

কেবলমাত্র একটি নতুন বিটম্যাপ অবজেক্টে চিত্রটি অনুলিপি করা এই ব্যতিক্রমটি উপস্থিত হতে আটকাতে যথেষ্ট ছিল:

new Bitmap(oldbitmap).Save(filename);

2

PDFপ্রোডাকশন সার্ভারে ইমেজপ্রসেসর লিব ব্যবহার করে একটি বা পুনরায় আকারের চিত্র উত্পন্ন করার ক্ষেত্রে আমাদের একই সমস্যা ছিল ।

অ্যাপ্লিকেশন পুলটি পুনরায় চক্রটি সমাধান করুন।


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

আমি এই ত্রুটিটিও পেয়েছি কারণ আমি আগের সংরক্ষিত চিত্রগুলির একই নামের সাথে চিত্রগুলি সংরক্ষণ করার চেষ্টা করছি।

নিশ্চিত করুন যে আপনি নকল নাম দিয়ে ছবিগুলি সংরক্ষণ করবেন না।

থার জন্য উদাহরণস্বরূপ একটি 'র‌্যান্ডম' ফাংশন ( সি # র এলোমেলো নম্বর জেনারেটর কীভাবে কাজ করে? ) বা উদাহরণস্বরূপ একটি গাইড তৈরি করে ( 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);

ইমেজ_ইনস্ট্যান্স হ'ল সিস্টেম.আর উইন্ডোজ.ফর্মস.পিকচারবক্স! পিকচারবক্সের লোড () যে চিত্রটি লোড করা হয়েছিল সেটিকে সরিয়ে দেয় এবং আমি এটি জানতাম না।


0

@ সাভিন্দ্রের উত্তরের ভিত্তিতে, আপনি যদি নিজের অ্যাপ্লিকেশনটিতে আরএইচএম করেন এবং প্রশাসক হিসাবে চালানোর চেষ্টা করেন তবে এটি আপনার সমস্যার সমাধান করা উচিত।

আমার কাছে মনে হয়েছে এটি একটি অনুমতি সংক্রান্ত সমস্যা।


0

সম্ভাব্য সমস্যাগুলি যা এই জাতীয় ত্রুটির কারণ হয়:

  1. ডিরেক্টরি বিদ্যমান নেই (আপনি যে পদ্ধতিতে কল দিচ্ছেন তা স্বয়ংক্রিয়ভাবে আপনার জন্য এই ডিরেক্টরিটি তৈরি করবে না)
  2. আউটপুট ডিরেক্টরিতে লেখার জন্য সুরক্ষা অনুমতিগুলি অ্যাপ্লিকেশন চালিত ব্যবহারকারীকে লিখতে দেয় না

আমি আশা করি এটি সাহায্য করে, এটিই ছিল আমার সমস্যার সমাধান, আমি কেবল নিশ্চিত করেছিলাম আউটপুট ডিরেক্টরি সংরক্ষণ করার আগে আউটপুট ডিরেক্টরি উপস্থিত রয়েছে!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.