Đã xảy ra lỗi chung trong GDI +, JPEG Image thành MemoryStream


326

Đây có vẻ là một lỗi của một tai tiếng trên web. Đến nỗi tôi không thể tìm được câu trả lời cho vấn đề của mình vì kịch bản của tôi không phù hợp. Một ngoại lệ được đưa ra khi tôi lưu hình ảnh vào luồng.

Điều kỳ lạ là nó hoạt động hoàn hảo với png nhưng lại đưa ra lỗi trên với jpg và gif khá khó hiểu.

Vấn đề tương tự nhất hiện có liên quan đến việc lưu hình ảnh vào các tệp mà không có quyền. Trớ trêu thay, giải pháp là sử dụng một luồng bộ nhớ như tôi đang làm ....

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

Chi tiết hơn đến ngoại lệ. Lý do điều này gây ra rất nhiều vấn đề là thiếu giải thích :(

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: 

OK những điều tôi đã cố gắng cho đến nay.

  1. Nhân bản hình ảnh và làm việc trên đó.
  2. Truy xuất bộ mã hóa cho MIME đó thông qua cài đặt chất lượng jpeg.



3
Đối với tôi, vấn đề là thư mục đó không tồn tại. Đã sửa bằng cách chỉ tạo thư mục.
hazjack

Đối với tôi đó là một chỉ số nằm ngoài phạm vi bị nuốt chửng.
Billy Jake O'Connor

Câu trả lời:


189

OK Tôi dường như đã tìm ra nguyên nhân chỉ bởi may mắn và không có gì sai với phương pháp cụ thể đó, nó tiếp tục sao lưu ngăn xếp cuộc gọi.

Trước đó tôi thay đổi kích thước hình ảnh và là một phần của phương thức đó, tôi trả về đối tượng đã thay đổi kích thước như sau. Tôi đã chèn hai cuộc gọi đến phương thức trên và lưu trực tiếp vào một tệp.

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

Dường như dòng bộ nhớ rằng đối tượng đã được tạo ra trên được mở đồng thời các đối tượng được lưu. Tôi không chắc tại sao lại như vậy. Có ai có thể soi sáng cho tôi và làm thế nào tôi có thể vượt qua điều này.

Tôi chỉ trả lại từ một dòng suối vì sau khi sử dụng mã thay đổi kích thước tương tự như này file đích có một loại mime chưa biết (img.RawFormat.Guid) và Id như kiểu Mime là đúng trên tất cả các đối tượng hình ảnh như nó làm cho nó cứng ghi chung chung xử lý mã khác.

BIÊN TẬP

Điều này đã không xuất hiện trong tìm kiếm ban đầu của tôi nhưng đây là câu trả lời từ Jon Skeet


4
Tôi đã không nhận ra rằng khi bạn nhận được một bitmap từ luồng bộ nhớ, bạn không nên đóng luồng. rất hữu ích, cảm ơn bạn
mcdon

38
Cảm ơn bạn. Điều này có lẽ đã lưu lại mái tóc cuối cùng của tôi.
NotMe

6
Cảm ơn! điều này đã tiết kiệm cho tôi rất nhiều thời gian, tuy nhiên, một điều bạn sẽ làm nổi bật nguyên nhân gây ra lỗi khi bắt đầu câu trả lời của bạn vì tôi (và tôi đoán hầu hết các falks) đã bỏ qua nó trong phần lướt qua các câu trả lời, có thể là một cái gì đó như " Đừng đóng NHỚ STREAM Nếu bạn dự định sử dụng hình ảnh AGAIN" sẽ là tuyệt vời; D
DorD

6
Biến "dst" của bạn là gì?
WEFX

1
@madcapnmckay vui lòng giải thích biến 'dst' là gì và tầm quan trọng của nó
Mike T

131

Nếu bạn gặp phải lỗi đó, thì tôi có thể nói rằng ứng dụng của bạn không có quyền ghi trên một số thư mục.

Ví dụ: nếu bạn đang cố lưu Hình ảnh từ luồng bộ nhớ vào hệ thống tệp, bạn có thể gặp lỗi đó.

Vui lòng nếu bạn đang sử dụng XP, hãy đảm bảo thêm quyền ghi cho tài khoản aspnet trên thư mục đó.

Nếu bạn đang sử dụng máy chủ windows (2003,2008) hoặc Vista, hãy đảm bảo thêm quyền ghi cho tài khoản dịch vụ Mạng.

Hy vọng nó sẽ giúp được ai đó.


7
Bạn đã không! Tôi đã lãng phí 2 giờ với quyền viết chết tiệt ... Đến đây để đăng bài này. Hy vọng bạn nhận được nhiều upvote. :)
Gleno

2
Đây là giải pháp cho tôi. +1 hoàn toàn!
Grandizer

5
Bạn có thể thực hiện File.WriteAllText ("filename.jpg", "") sau đó File.DeleteFile ("filename.jpg") trước khi bạn lưu bitmap. Trong benmark của tôi, việc này chỉ mất 0,001 giây và bạn nhận được một câu 'Bạn không có quyền lưu filename.jpg ở đó'
Despertar

@Despertar Ý bạn là File.Delete (), nhưng đó là một mẹo rất tiện dụng! Chắc chắn sẽ sử dụng điều này bất cứ khi nào tôi lưu một bitmap.
D Coetzee

2
Trong trường hợp của tôi, thư mục không tồn tại.
im

54

Tôi sẽ thêm nguyên nhân gây ra lỗi này với hy vọng nó sẽ giúp một số khách du lịch internet trong tương lai. :)

GDI + giới hạn chiều cao tối đa của hình ảnh là 65500

Chúng tôi thực hiện thay đổi kích thước hình ảnh cơ bản, nhưng khi thay đổi kích thước, chúng tôi cố gắng duy trì tỷ lệ khung hình. Chúng tôi có một anh chàng QA, một người quá giỏi trong công việc này; ông quyết định thử nghiệm điều này với một bức ảnh rộng MỘT pixel cao 480 pixel. Khi hình ảnh được thu nhỏ để đáp ứng kích thước của chúng tôi, chiều cao ở phía bắc 68.000 pixel và ứng dụng của chúng tôi đã phát nổ A generic error occurred in GDI+.

Bạn có thể tự kiểm tra điều này bằng thử nghiệm:

  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+."
  }

Thật tệ khi không có .net thân thiện được ArgumentExceptionném vào hàm tạo của Bitmap.


17
Cảm ơn bạn - người du hành thời gian trên Internet này khá biết ơn vì bạn đã để lại tin nhắn này.
Tom West

Từ thử nghiệm của tôi, 65535 thực sự là giá trị tối đa. Tại 65536 tôi bắt đầu thấy lỗi chung.
ChaseMedallion

Chỉ cần thử lại lần nữa: Win10 .net 4.5 và .net 4.6.1, và nó đã xuất hiện ở 65501, điều này dường như còn ngẫu nhiên hơn. Mã cũng có nhiều lỗi cú pháp, sẽ cập nhật :)
Fred

37

Bài viết này giải thích chi tiết chính xác những gì xảy ra: phụ thuộc vào Bitmap và Image constructor

Nói tóm lại, trong suốt cuộc đời của một Imagecông trình được xây dựng từ một luồng , luồng không được phá hủy.

Vì vậy, thay vì

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

thử cái này

Stream imageStream;
...

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

và đóng imageStream ở dạng đóng hoặc trang web đóng.


Yep cái này có tôi. Tôi đã tận tâm và gói luồng của mình vào usingvà sau đó cố gắng sao chép hình ảnh vào luồng bộ nhớ và nhận được thông báo "Lỗi chung trong GDI +" đáng sợ.
Sẽ Appleby

Liên kết của bạn đã cho tôi chuyển hướng vô hạn; cái này hoạt động Tôi đã nhận được một vấn đề với tiết kiệm PixelFormat.Format32bppArgbnhưng không PixelFormat.Format1bppIndexed. Bài viết bạn liên kết giải thích lý do: GDI + có thể chọn giải mã lại dữ liệu bitmap từ luồng nguồn thay vì giữ mọi thứ trong bộ nhớ. Tôi đoán là nó không giải mã lại hình ảnh 1bpp.
labreuer

Ngay cả các liên kết mới không hoạt động nữa. Một tìm kiếm google đơn giản dường như không tiết lộ trang chính xác. Nhưng tôi rất vui mừng khi tìm thấy câu trả lời này! Công việc của tôi bằng cách sao chép vào một bitmap mới đã thất bại vì vấn đề này
Katjoek

28

Bạn cũng sẽ nhận được ngoại lệ này nếu bạn cố lưu vào một đường dẫn không hợp lệ hoặc nếu có vấn đề về quyền.

Nếu bạn không chắc chắn 100% rằng đường dẫn tệp có sẵn và quyền là chính xác thì hãy thử viết một tệp văn bản. Điều này chỉ mất vài giây để loại trừ những gì sẽ là một sửa chữa rất đơn giản.

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

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

Và đừng quên làm sạch tập tin của bạn.


Đây là vấn đề đối với tôi ... Tôi ước rằng lỗi ít mơ hồ hơn, sẽ giúp tôi tiết kiệm rất nhiều thời gian.
Oofpez

Đúng! Thư mục bạn đang lưu phải tồn tại. Bây giờ tôi sẽ kiểm tra cái đó trước, trước khi tôi cố lưu một hình ảnh. (Tuy nhiên, lỗi vẫn khiến tôi hiểu ra, khoảng một năm một lần.)
Magnus Smith

My Path là một thư mục, thay vì một tập tin.
Asen Kasimov

20

Lưu hình ảnh vào biến bitmap

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

Điều này đã giải quyết vấn đề của tôi. Bạn có thể giải thích tại sao việc lưu hình ảnh vào Bitmap lại khiến ngoại lệ sợ hãi không?
jmc

Đã lưu ngày của tôi .. không biết điều gì đã gây ra sự cố nhưng Bitmap lưu hoạt động .. System.Drawing.Image sẽ không lưu vào luồng bộ nhớ nhưng Bitmap thì có !!!
San

Đây là giải pháp tốt nhất cho tôi. Tạo Bitmap mới và chuyển đổi từ nó.
uzay95

Không biết làm thế nào phép thuật này hoạt động - nhưng nó làm.
Ziv Weissman

17

Chỉ trong trường hợp nếu ai đó đang làm những thứ ngu ngốc như tôi. 1. đảm bảo đường dẫn tồn tại. 2. đảm bảo bạn có quyền viết. 3. đảm bảo đường dẫn của bạn là chính xác, trong trường hợp của tôi, tôi đã thiếu tên tệp trong TargetPath :(

cần phải nói rằng, đường dẫn của bạn tệ hơn "Một lỗi chung xảy ra trong GDI +"


16

Tôi cũng gặp lỗi này khi lưu JPEG, nhưng chỉ với một số hình ảnh nhất định.

Mã cuối cùng của tôi:

  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
  }

Tôi đã không tạo ra hình ảnh để tôi không thể biết sự khác biệt là gì.
Tôi sẽ đánh giá cao nếu bất cứ ai có thể giải thích điều đó.

Đây là chức năng SaveJpeg của tôi chỉ 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
Điều này giải quyết ngày kéo tóc. Đó là mã wtf nhất tôi nghĩ tôi từng viết :)
Jeff Dunlop

13

Tôi thấy rằng nếu một trong các thư mục mẹ mà tôi đang lưu tệp có dấu cách thì GDI + sẽ ném ngoại lệ chung.

Nói cách khác, nếu tôi cố lưu vào "C: \ Documents and Settings \ myusername \ Local Settings \ Temp \ ABC DEF M1 Xu hướng giá trị \ Images \ Picture.png" thì nó đã ném ngoại lệ chung.

Tên thư mục của tôi đã được tạo từ một tên tệp tình cờ có một khoảng trắng ở cuối để dễ dàng .Trim () và tiếp tục.


3
tuyệt vời - tôi sẽ không bao giờ nghĩ rằng nhìn vào đường dẫn thư mục chặt chẽ
jharr100

11

nếu mã của bạn như sau thì cũng xảy ra lỗi này

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

Một trong những chính xác là

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

Điều này có thể là do chúng tôi đang quay trở lại từ khối sử dụng


Đối với tôi đó là sự trở lại trong khối sử dụng. Tôi vẫn sử dụng bằng cách sử dụng nhưng tôi trả lại giá trị bên ngoài khối. cảm ơn!
Dragouf

1
Tôi đã phát hiện ra "cách khó" rằng nếu bạn muốn lưu lại Hình ảnh đó vào Luồng mới (ví dụ như httpContext.Response.OutputStream), bạn cũng sẽ cần phải thực hiện một luồng.Flush (), nếu không xảy ra lỗi lần nữa.
Lucian

11

Đây là bản mở rộng / đủ điều kiện trả lời của Fred, trong đó nêu rõ: "GDI giới hạn chiều cao của hình ảnh là 65534". Chúng tôi gặp vấn đề này với một trong những ứng dụng .NET của chúng tôi và khi thấy bài đăng, nhóm gia công của chúng tôi đã giơ tay và nói rằng họ không thể khắc phục vấn đề mà không có thay đổi lớn.

Dựa trên thử nghiệm của tôi, có thể tạo / thao tác hình ảnh với chiều cao lớn hơn 65534, nhưng vấn đề phát sinh khi lưu vào luồng hoặc tệp IN FORMATS FORMATS . Trong đoạn mã sau, lệnh gọi phương thức t.Save () ném cho bạn của chúng ta ngoại lệ chung khi chiều cao pixel là 65501 đối với tôi. Vì lý do tò mò, tôi đã lặp lại thử nghiệm về chiều rộng và giới hạn tương tự được áp dụng để tiết kiệm.

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

Lỗi tương tự cũng xảy ra nếu bạn ghi vào luồng bộ nhớ.

Để làm tròn nó, bạn có thể lặp lại đoạn mã trên và thay thế ImageFormat.Tiff hoặc ImageFormat.Bmp cho ImageFormat.Jpeg.

Điều này chạy lên tới độ cao / chiều rộng 100.000 đối với tôi - Tôi đã không kiểm tra giới hạn. Khi nó xảy ra .Tiff là một lựa chọn khả thi cho chúng tôi.

ĐƯỢC CẢNH BÁO

Các luồng / tệp TIFF trong bộ nhớ tiêu thụ nhiều bộ nhớ hơn so với các đối tác JPG của chúng.


10

Có một vấn đề rất giống nhau và cũng đã thử nhân bản hình ảnh không hoạt động. Tôi thấy rằng giải pháp tốt nhất là tạo một đối tượng Bitmap mới từ hình ảnh được tải từ luồng bộ nhớ. Bằng cách đó, luồng có thể được xử lý, vd

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

Hi vọng điêu nay co ich.


6

Xảy ra lỗi vì sự cho phép. đảm bảo thư mục có TẤT CẢ CÁC GIẤY PHÉP.

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")

Tôi đồng ý với bạn. Tôi đã giải quyết vấn đề này với PERMISSION
praguan

5

GIẢI QUYẾT - Tôi đã có vấn đề chính xác này. Đối với tôi, cách khắc phục là tăng dung lượng đĩa cho IUSR trên máy chủ IIS. Trong trường hợp này, chúng tôi có một ứng dụng danh mục với hình ảnh của các mặt hàng và như vậy. Hạn ngạch tải lên cho "Người dùng web ẩn danh" được đặt thành 100 MB, đây là mặc định cho các máy chủ IIS của công ty lưu trữ cụ thể này. Tôi đã tăng nó lên 400MB và có thể tải lên hình ảnh mà không gặp lỗi.

Đây có thể không phải là vấn đề của bạn, nhưng nếu có, đây là một sửa chữa dễ dàng.


4

Trong trường hợp của tôi, vấn đề là ở đường dẫn tôi đang lưu (root C:\). Thay đổi nó để D:\111\làm cho ngoại lệ biến mất.


4

Một nguyên nhân khác gây ra lỗi này - đường dẫn bạn chỉ ra trong phương thức Lưu của đối tượng Bitmap không tồn tại hoặc bạn chưa cung cấp đường dẫn đầy đủ / hợp lệ.

Chỉ có lỗi này vì tôi đã chuyển qua một tên tệp và không phải là một đường dẫn đầy đủ!

Nó xảy ra!


4

Đến lượt tôi!

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

Có nó trên .Save ... vì việc sử dụng () đang giữ tệp đang mở, vì vậy tôi không thể ghi đè lên nó. Có lẽ điều này sẽ giúp ai đó trong tương lai.


4

Vấn đề tương tự tôi đã phải đối mặt. Nhưng trong trường hợp của tôi, tôi đã cố lưu tệp trong ổ C và nó không thể truy cập được. Vì vậy, tôi đã thử lưu nó vào ổ D có thể truy cập đầy đủ và tôi đã thành công.

Vì vậy, trước tiên hãy kiểm tra các thư mục mà bạn đang cố lưu. Bạn phải có tất cả các quyền (đọc và viết) cho thư mục cụ thể đó.


nguyên nhân thông thường c không cho phép mà không có sự cho phép của quản trị viên.
Aneeq Azam Khan

2

Tôi nhận thấy rằng trường hợp "jpeg" của bạn thực sự là:

            default:
                format = ImageFormat.Jpeg;
                break;

Bạn có chắc chắn rằng định dạng là jpeg và không phải cái gì khác không?

Tôi sẽ thử:

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

Hoặc kiểm tra những gì imageToConvert.MimeType()thực sự trở lại.

CẬP NHẬT

Có bất kỳ khởi tạo nào khác mà bạn cần phải làm với đối tượng MemoryStream không?


Cảm ơn. Nó chắc chắn được gọi với định dạng chính xác. Tôi tải một jpg, gỡ lỗi và xác nhận mime được nhận dạng là hình ảnh / jpeg và định dạng là JPG.
madcapnmckay

3
Oh well - Tôi luôn cố gắng để loại bỏ rõ ràng đầu tiên. Tôi không thể đếm số lần tôi đã không làm điều đó và nó sẽ quay lại cắn tôi sau.
ChrisF

2
  • Tôi gặp vấn đề này trên máy chủ thử nghiệm nhưng không phải trên máy chủ trực tiếp.
  • Tôi đã viết hình ảnh thành một luồng, vì vậy đó không phải là vấn đề cho phép.
  • Tôi đã trực tiếp triển khai một số của các máy chủ đến máy chủ thử nghiệm.
  • Việc triển khai toàn bộ giải pháp đã khắc phục sự cố, vì vậy đây có thể là một sự không phù hợp biên dịch kỳ lạ

2

Chỉ cần ném một giải pháp khả thi khác vào đống, tôi sẽ đề cập đến trường hợp tôi gặp phải với thông báo lỗi này. Phương thức Bitmap.Savesẽ đưa ra ngoại lệ này khi lưu một bitmap mà tôi đã chuyển đổi và đang hiển thị. Tôi phát hiện ra nó sẽ không ném ngoại lệ nếu tuyên bố có điểm dừng trên đó, cũng như nếu điều đó Bitmap.Saveđược đặt ra trước Thread.Sleep(500)nên tôi cho rằng có một sự tranh chấp tài nguyên nào đó đang diễn ra.

Chỉ cần sao chép hình ảnh vào một đối tượng Bitmap mới là đủ để ngăn ngoại lệ này xuất hiện:

new Bitmap(oldbitmap).Save(filename);

2

Chúng tôi đã gặp vấn đề tương tự khi tạo PDFhoặc thay đổi kích thước hình ảnh bằng cách sử dụng lib ImageProcessor trên máy chủ sản xuất.

Tái chế nhóm ứng dụng khắc phục sự cố.


1

Nếu bạn đang cố lưu hình ảnh vào một vị trí từ xa, hãy đảm bảo thêm NETWORK_SERVICEtài khoản người dùng vào cài đặt bảo mật và cấp cho người dùng quyền đọc và ghi. Nếu không thì nó sẽ không hoạt động.


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

Đơn giản, tạo một phiên bản mới của Bitmap giải quyết vấn đề.

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

0

Đối với tôi, tôi đã sử dụng Image.Save(Stream, ImageCodecInfo, EncoderParameters)và rõ ràng điều này đã gây ra A generic error occurred in GDI+lỗi khét tiếng .

Tôi đã cố gắng sử dụng EncoderParameterđể lưu jpeg với chất lượng 100%. Điều này đã hoạt động hoàn hảo trên "máy của tôi" (doh!) Và không sản xuất.

Khi tôi sử dụng Image.Save(Stream, ImageFormat)thay thế, lỗi biến mất! Vì vậy, giống như một thằng ngốc, tôi tiếp tục sử dụng cái thứ hai mặc dù nó tiết kiệm chúng với chất lượng mặc định mà tôi cho là chỉ 50%.

Hy vọng thông tin này sẽ giúp được ai đó.


0

Tôi gặp phải vấn đề quá. Vấn đề là do dòng tải được xử lý. Nhưng tôi đã không loại bỏ nó, nó nằm trong khung .Net. Tất cả tôi phải làm là sử dụng:

image_instance = Image.FromFile(file_name);

thay vì

image_instance.Load(file_name);

image_instance thuộc loại System.Windows.Forms.PictureBox! LoadBox của PictureBox xử lý luồng mà hình ảnh được tải từ đó và tôi không biết điều đó.


0

Dựa trên câu trả lời từ @savindra, nếu bạn sử dụng ứng dụng RHM trên ứng dụng của mình và thử và chạy với tư cách quản trị viên thì nó sẽ giải quyết vấn đề của bạn.

Của tôi dường như là một vấn đề cho phép.


0

Các vấn đề có thể gây ra lỗi như vậy là:

  1. Thư mục không tồn tại (Phương thức bạn đang gọi sẽ không tự động tạo thư mục này cho bạn)
  2. Các quyền bảo mật để ghi vào thư mục đầu ra không cho phép người dùng chạy ứng dụng để ghi

Tôi hy vọng điều này có ích, đây là cách khắc phục sự cố của tôi, tôi chỉ cần đảm bảo rằng thư mục đầu ra tồn tại trước khi lưu hình ảnh đầu ra!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.