Wystąpił ogólny błąd w GDI +, JPEG Image to MemoryStream

326

To wydaje się być trochę niesławnym błędem w całej sieci. Tak bardzo, że nie byłem w stanie znaleźć odpowiedzi na mój problem, ponieważ mój scenariusz nie pasuje. Zgłaszany jest wyjątek, gdy zapisuję obraz w strumieniu.

Dziwnie działa to idealnie z png, ale daje powyższy błąd z jpg i gif, co jest dość mylące.

Najbardziej podobny problem dotyczy zapisywania obrazów do plików bez uprawnień. Jak na ironię rozwiązaniem jest użycie strumienia pamięci, tak jak ja ...

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

Więcej szczegółów do wyjątku. Powodem tego jest tak wiele problemów: brak wyjaśnień :(

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 rzeczy, których do tej pory próbowałem.

  1. Klonowanie obrazu i praca nad tym.
  2. Pobieranie enkodera dla tego MIME, który przekazuje go z ustawieniem jakości JPEG.
madcapnmckay
źródło
powiązane: stackoverflow.com/questions/4671449/…
Patrick Szalapski
3
Dla mnie problemem było to, że folder nie istniał. Naprawiono po prostu tworząc folder.
hazjack 17.07.17
Dla mnie był to indeks poza zasięgiem, który został połknięty.
Billy Jake O'Connor,

Odpowiedzi:

189

OK Wydaje mi się, że znalazłem przyczynę po prostu dzięki szczęściu i nie ma nic złego w tej konkretnej metodzie.

Wcześniej zmieniam rozmiar obrazu i jako część tej metody zwracam obiekt o zmienionym rozmiarze w następujący sposób. Do powyższej metody wstawiłem dwa wywołania i bezpośrednie zapisanie do pliku.

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

Wygląda na to, że strumień pamięci, na którym obiekt został utworzony, musi być otwarty w momencie zapisywania obiektu. Nie jestem pewien, dlaczego tak jest. Czy ktokolwiek jest w stanie mnie oświecić i jak sobie z tym poradzić.

Wracam tylko ze strumienia, ponieważ po użyciu kodu zmiany rozmiaru podobnego do tego plik docelowy ma nieznany typ mime (img.RawFormat.Guid) i podoba mi się typ Mime, aby był poprawny we wszystkich obiektach obrazu, ponieważ utrudnia to pisanie ogólne w przeciwnym razie kod obsługi.

EDYTOWAĆ

Nie pojawiło się to podczas moich pierwszych poszukiwań, ale oto odpowiedź Jona Skeeta

madcapnmckay
źródło
4
Nie zdawałem sobie sprawy, że kiedy otrzymujesz bitmapę ze strumienia pamięci, nie powinieneś go zamykać. bardzo pomocny, dziękuję
mcdon
38
Dziękuję Ci. To prawdopodobnie uratowało mi ostatnie włosy.
NotMe,
6
Dzięki! zaoszczędziło mi to wiele czasu, ale jedno, czy mógłbyś wskazać przyczynę błędu na początku twojej odpowiedzi, ponieważ ja (i chyba większość falks) tęskniłem za nią na oryginalnych przeglądach poprzez odpowiedzi, może coś w stylu „ NIE ZAMKNĄĆ STRUMIENIU PAMIĘCI, JEŚLI CHCESZ PONOWNIE UŻYWAĆ OBRAZU "byłoby świetnie; D
DorD
6
Jaka jest twoja zmienna „dst”?
WEFX
1
@madcapnmckay proszę wyjaśnić, czym jest zmienna „dst” i jakie jest jej znaczenie
Mike T
131

Jeśli pojawia się ten błąd, mogę powiedzieć, że twoja aplikacja nie ma uprawnień do zapisu w niektórych katalogach.

Na przykład, jeśli próbujesz zapisać obraz ze strumienia pamięci do systemu plików, możesz otrzymać ten błąd.

Jeśli używasz XP, pamiętaj o dodaniu uprawnień do zapisu dla konta aspnet w tym folderze.

Jeśli korzystasz z serwera Windows (2003,2008) lub Vista, upewnij się, że dodajesz uprawnienia zapisu dla konta usługi sieciowej.

Mam nadzieję, że to komuś pomoże.

Savindra
źródło
7
Ty nie! Zmarnowałem 2 godziny z cholernymi uprawnieniami do zapisu ... Przybyłem tutaj, żeby to opublikować. Mam nadzieję, że dostaniesz więcej głosów pozytywnych. :)
Gleno,
2
TO było dla mnie rozwiązanie. +1 całkowicie!
Grandizer,
5
Możesz zrobić File.WriteAllText („nazwa pliku.jpg”, „”), a następnie File.DeleteFile („nazwa pliku.jpg”) przed zapisaniem mapy bitowej. W mojej benmark to zajmuje tylko 0,001 sekundy i dostajesz miłe „Nie masz pozwolenia na zapisanie pliku nazwa_pliku.jpg tam”
Despertar
@Despertar Masz na myśli File.Delete (), ale jest to bardzo przydatna sztuczka! Zdecydowanie skorzystam z tego, ilekroć zapisam bitmapę.
D Coetzee,
2
W moim przypadku katalog nie istniał.
wyciszone
54

Dodam tę przyczynę błędu również w nadziei, że pomoże to niektórym przyszłym podróżnikom internetowym. :)

GDI + ogranicza maksymalną wysokość obrazu do 65500

Wykonujemy podstawowe zmiany rozmiaru obrazu, ale podczas zmiany rozmiaru staramy się zachować proporcje obrazu. Mamy faceta QA, który jest trochę zbyt dobry w tej pracy; postanowił przetestować to na JEDNYM pikselowym zdjęciu o wysokości 480 pikseli. Gdy obraz został przeskalowany, aby odpowiadał naszym wymiarom, wysokość wynosiła na północ od 68 000 pikseli, a nasza aplikacja eksplodowała A generic error occurred in GDI+.

Możesz to zweryfikować samodzielnie za pomocą testu:

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

Szkoda, że ​​w konstruktorze nie ArgumentExceptionwrzucono przyjaznego .net Bitmap.

Fred
źródło
17
Dziękujemy - ten podróżnik w czasie w Internecie jest bardzo wdzięczny za pozostawienie tej wiadomości.
Tom West
Z moich testów wynika, że ​​65535 jest w rzeczywistości wartością maksymalną. W 65536 zaczynam widzieć błąd ogólny.
ChaseMedallion
Po prostu spróbowałem tego jeszcze raz: Win10 .net 4.5 i .net 4.6.1, a wysadziło się w 65501, co wydaje się jeszcze bardziej losowe. Kod jest również pełen błędów składniowych, zaktualizuje się :)
Fred
37

W tym artykule szczegółowo wyjaśniono, co dokładnie się dzieje: zależności bitmapy i konstruktora obrazu

Krótko mówiąc, przez całe życie Imageskonstruowanego ze strumienia strumień nie może zostać zniszczona.

Więc zamiast

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

Spróbuj tego

Stream imageStream;
...

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

i zamknij imageStream w formularzu zamknij lub zamknij stronę internetową.

Ivan Mesic
źródło
Tak, ten mnie dopadł. Byłem sumienny i zawinąłem swój strumień w usinga następnie próbowałem skopiować obraz do strumienia pamięci i otrzymałem przerażający komunikat „Ogólny błąd w GDI +”.
Czy Appleby
Twój link dawał mi nieskończone przekierowania; ten działa. Miałem problem z oszczędzaniem, PixelFormat.Format32bppArgbale nie PixelFormat.Format1bppIndexed. Artykuł, który podłączyłeś, wyjaśnia dlaczego: GDI + może zdecydować się na dekodowanie danych bitmapowych ze strumienia źródłowego, zamiast utrzymywać wszystko w pamięci. Domyślam się, że nie dekoduje obrazów 1bpp.
labreuer
Nawet nowy link już nie działa. Proste wyszukiwanie w Google nie ujawniło prawidłowej strony. Ale bardzo się cieszyłem, że znalazłem tę odpowiedź! Moje obejście problemu
Katjoek
28

Otrzymasz również ten wyjątek, jeśli spróbujesz zapisać na nieprawidłowej ścieżce lub jeśli wystąpi problem z uprawnieniami.

Jeśli nie masz 100% pewności, że ścieżka do pliku jest dostępna, a uprawnienia są prawidłowe, spróbuj napisać a do pliku tekstowego. To zajmuje tylko kilka sekund, aby wykluczyć, co byłoby bardzo prostym rozwiązaniem.

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

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

I nie zapomnij wyczyścić pliku.

Kirk Broadhurst
źródło
To był problem dla mnie ... Chciałbym, żeby błąd był mniej niejasny, zaoszczędziłby mi dużo czasu.
Oofpez,
Tak! Folder, w którym zapisujesz, musi istnieć. Teraz najpierw sprawdzam to, zanim spróbuję zapisać obraz. (Mimo to błąd mnie łapie, mniej więcej raz w roku.)
Magnus Smith
Moja ścieżka była katalogiem, a nie plikiem.
Asen Kasimov
20

Zapisz obraz w zmiennej bitmapowej

using (var ms = new MemoryStream())
{
    Bitmap bmp = new Bitmap(imageToConvert);
    bmp.Save(ms, format);
    return ms.ToArray();
}
Amir Atashin
źródło
To rozwiązało mój problem. Czy możesz wyjaśnić, dlaczego zapisanie obrazu w mapie bitowej odstrasza wyjątek?
JMC
Zapisałem mój dzień .. nie wiem, co spowodowało problem, ale zapisywanie bitmap działa. System.Drawing.Image nie zapisuje do pamięci, ale Bitmap robi !!!
San
To było dla mnie najlepsze rozwiązanie. Tworzenie nowej bitmapy i konwertowanie z niej.
uzay95
17

Na wszelki wypadek, jeśli ktoś robi tak głupie rzeczy jak ja. 1. upewnij się, że ścieżka istnieje. 2. upewnij się, że masz uprawnienia do pisania. 3. Upewnij się, że Twoja ścieżka jest poprawna, w moim przypadku brakowało nazwy pliku w Ścieżce docelowej :(

powinien był powiedzieć, że twoja ścieżka jest do bani niż „Wystąpił ogólny błąd w GDI +”

Ahsant
źródło
16

Wystąpił również ten błąd podczas zapisywania plików JPEG, ale tylko w przypadku niektórych zdjęć.

Mój końcowy kod:

  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
  }

Nie tworzyłem obrazów, więc nie mogę powiedzieć, jaka jest różnica.
Byłbym wdzięczny, gdyby ktokolwiek mógł to wyjaśnić.

To jest moja funkcja SaveJpeg po prostu dla ciebie:

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;
}
Aximili
źródło
1
To rozwiązało dni ciągnięcia włosów. To chyba najbardziej wtfowy kod, jaki kiedykolwiek napisałem :)
Jeff Dunlop,
13

Odkryłem, że jeśli jeden z folderów nadrzędnych, w których zapisywałem plik, ma końcowe miejsce, GDI + zgłosi ogólny wyjątek.

Innymi słowy, jeśli spróbuję zapisać w folderze „C: \ Documents and Settings \ moja nazwa_użytkownika \ Ustawienia lokalne \ Temp \ ABC DEF M1 Trended Values ​​\ Images \ picture.png”, zwróci to ogólny wyjątek.

Nazwa mojego folderu była generowana na podstawie nazwy pliku, która miała spację końcową, więc łatwo było ją .Trim () i przejść dalej.

Igilima
źródło
3
niesamowite - nigdy bym nie pomyślał, aby przyjrzeć się tak dokładnie ścieżce katalogu
jharr100
11

jeśli twój kod jest następujący, to również ten błąd występuje

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

Prawidłowy to

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

Może to być spowodowane tym, że wracamy z bloku używającego

dhinesh
źródło
dla mnie był to powrót w bloku używającym. Nadal używam przy użyciu, ale zwracam wartość poza blok. dzięki!
Dragouf,
1
Dowiedziałem się „na własnej skórze”, że jeśli ponownie zapisujesz ten obraz do nowego strumienia (takiego jak na przykład HttpContext.Response.OutputStream), musisz także wykonać stream.Flush (), jeśli nie, wystąpi błąd jeszcze raz.
Lucian,
11

Jest to rozszerzenie / kwalifikacja odpowiedzi Freda, która stwierdza: „GDI ogranicza wysokość obrazu do 65534”. Napotkaliśmy ten problem z jedną z naszych aplikacji .NET i po zapoznaniu się z postem nasz zespół outsourcingowy podniósł ręce w górę i powiedział, że nie mogą rozwiązać problemu bez większych zmian.

Na podstawie moich testów można tworzyć / manipulować obrazami o wysokości większej niż 65534, ale problem pojawia się podczas zapisywania w strumieniu lub pliku W NIEKTÓRYCH FORMATACH . W poniższym kodzie wywołanie metody t.Save () rzuca naszemu przyjacielowi ogólny wyjątek, gdy wysokość piksela wynosi dla mnie 65501. Ze względu na ciekawość powtórzyłem test szerokości i ten sam limit zastosowałem do zapisywania.

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

Ten sam błąd występuje również w przypadku zapisu do strumienia pamięci.

Aby obejść ten problem, możesz powtórzyć powyższy kod i podstawić ImageFormat.Tiff lub ImageFormat.Bmp na ImageFormat.Jpeg.

To dla mnie osiąga wysokość / szerokość 100 000 - nie testowałem limitów. Tak się składa. Tiff był dla nas opłacalną opcją.

BYĆ OSTRZEŻONYM

Strumienie / pliki TIFF w pamięci zużywają więcej pamięci niż ich odpowiedniki JPG.

vipes
źródło
10

Miałem bardzo podobny problem, a także próbował klonować obraz, który nie działa. Odkryłem, że najlepszym rozwiązaniem było utworzenie nowego obiektu Bitmap z obrazu załadowanego ze strumienia pamięci. W ten sposób strumień można usunąć np

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

Mam nadzieję że to pomoże.

HU
źródło
6

Wystąpił błąd z powodu pozwolenia. upewnij się, że folder ma CAŁĄ ZEZWOLENIE.

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")
Gaurang s
źródło
Zgadzam się z Tobą. Rozwiązałem ten problem
PERMISSION
5

ROZWIĄZANE - Miałem dokładnie ten problem. Dla mnie rozwiązaniem było zwiększenie przydziału dysku dla IUSR na serwerze IIS. W tym przypadku mamy aplikację katalogu z obrazami przedmiotów i tym podobne. Limit przesyłania dla „Anonimowego użytkownika sieci” został ustawiony na 100 MB, co jest wartością domyślną dla serwerów IIS tej firmy hostingowej. Podniosłem go do 400 MB i mogłem przesyłać zdjęcia bez błędów.

To może nie być twój problem, ale jeśli tak, to łatwa naprawa.

Marco
źródło
4

W moim przypadku problem polegał na ścieżce, którą zapisywałem (root C:\). Zmiana D:\111\na wyjątek zniknęła.

Ani
źródło
4

Inna przyczyna tego błędu - ścieżka wskazana w metodzie Save instancji Bitmap nie istnieje lub nie podałeś pełnej / poprawnej ścieżki.

Właśnie miałem ten błąd, ponieważ podawałem nazwę pliku, a nie pełną ścieżkę!

Zdarza się!

MytyMyky
źródło
4

Moja kolej!

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

Mam go w .Save ..., ponieważ using () utrzymuje plik otwarty, więc nie mogę go zastąpić. Może to pomoże komuś w przyszłości.

Andy
źródło
4

Ten sam problem, z którym miałem do czynienia. Ale w moim przypadku próbowałem zapisać plik na dysku C i nie był on dostępny. Próbowałem go zapisać na dysku D, który był w pełni dostępny i udało mi się.

Najpierw sprawdź foldery, w których próbujesz zapisać. Musisz mieć wszystkie prawa (do odczytu i zapisu) do tego konkretnego folderu.

Jaimin
źródło
ponieważ normalnie c nie zezwala bez zgody administratora.
Aneeq Azam Khan
2

Zauważam, że twoja sprawa „jpeg” to w rzeczywistości:

            default:
                format = ImageFormat.Jpeg;
                break;

Czy jesteś pewien, że format to JPEG, a nie coś innego?

Spróbowałbym:

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

Lub sprawdź, co imageToConvert.MimeType()faktycznie powraca.

AKTUALIZACJA

Czy jest jakaś inna inicjalizacja, którą należy wykonać dla obiektu MemoryStream?

ChrisF
źródło
Dzięki. Jest to zdecydowanie wywoływane w poprawnym formacie. Ładuję plik jpg, debuguję i potwierdzam, że mime jest rozpoznawany jako image / jpeg, a format to JPG.
madcapnmckay
3
No cóż - zawsze staram się najpierw wyeliminować oczywiste. Nie mogę policzyć, ile razy tego nie zrobiłem i wrócił, by mnie ugryźć później.
ChrisF
2
  • Miałem ten problem na serwerze testowym, ale nie na serwerze na żywo.
  • Pisałem obraz do strumienia, więc nie był to problem z uprawnieniami.
  • Bezpośrednio wdrażałem niektóre pliki DLL na serwerze testowym.
  • Wdrożenie całego rozwiązania naprawiło problem, więc prawdopodobnie było to dziwne niedopasowanie kompilacji
Chris Halcrow
źródło
2

Aby rzucić na stos inne możliwe rozwiązanie, wspomnę o przypadku, w którym natrafiłem na ten komunikat o błędzie. Metoda Bitmap.Savezgłasza ten wyjątek podczas zapisywania mapy bitowej, którą przekształciłem i wyświetlałem. Odkryłem, że nie wyrzuciłby wyjątku, gdyby instrukcja zawierała punkt przerwania, ani nie byłby Bitmap.Savepoprzedzony, Thread.Sleep(500)więc przypuszczam, że trwa jakaś rywalizacja o zasoby.

Wystarczy skopiować obraz do nowego obiektu Bitmap, aby zapobiec pojawieniu się tego wyjątku:

new Bitmap(oldbitmap).Save(filename);
Segfault
źródło
2

Wystąpił podobny problem przy generowaniu PDFlub zmianie rozmiaru obrazu przy użyciu lib ImageProcessor na serwerze produkcyjnym.

Ponownie uruchom pulę aplikacji, aby rozwiązać problem.

tech-gayan
źródło
1

Jeśli próbujesz zapisać obraz w zdalnej lokalizacji , dodaj NETWORK_SERVICEkonto użytkownika do ustawień zabezpieczeń i daj temu użytkownikowi uprawnienia do odczytu i zapisu. W przeciwnym razie to nie zadziała.

JAH
źródło
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);
}
jeka
źródło
1

Proste, utwórz nową instancję Bitmapy rozwiązuje problem.

string imagePath = Path.Combine(Environment.CurrentDirectory, $"Bhatti{i}.png");
Bitmap bitmap = new Bitmap(image);
bitmap.Save(imagePath);
Hassan Rahman
źródło
0

Dla mnie korzystałem Image.Save(Stream, ImageCodecInfo, EncoderParameters)i najwyraźniej powodowało to niesławny A generic error occurred in GDI+błąd.

Próbowałem użyć, EncoderParameteraby zapisać pliki JPEG w 100% jakości. Działa to doskonale na „mojej maszynie” (doh!), A nie na produkcji.

Kiedy użyłem Image.Save(Stream, ImageFormat)zamiast tego, błąd zniknął! Tak jak idiota nadal używałem tego drugiego, chociaż zapisuje je w domyślnej jakości, która, jak zakładam, wynosi zaledwie 50%.

Mam nadzieję, że ta informacja komuś pomoże.

Ε Г И І И О
źródło
0

Też napotkałem problem. Problem był spowodowany usunięciem strumienia ładowania. Ale nie wyrzuciłem go, to było w ramach .Net. Wszystko, co musiałem zrobić, to użyć:

image_instance = Image.FromFile(file_name);

zamiast

image_instance.Load(file_name);

image_instance jest typu System.Windows.Forms.PictureBox! Funkcja Load () programu PictureBox usuwa strumień, z którego obraz został załadowany, i nie wiedziałem o tym.

Klaus
źródło
0

Na podstawie odpowiedzi @savindra, jeśli korzystasz z aplikacji RHM i próbujesz działać jako administrator , powinno to rozwiązać problem.

Wydawało mi się, że to kwestia pozwolenia.

AltF4_
źródło
0

Możliwe problemy, które powodują taki błąd, to:

  1. Katalog nie istnieje (metoda, którą wywołujesz, nie utworzy automatycznie tego katalogu)
  2. Uprawnienia bezpieczeństwa do zapisu w katalogu wyjściowym nie pozwalają użytkownikowi na uruchomienie aplikacji do zapisu

Mam nadzieję, że to pomoże, to była poprawka dla mojego problemu, po prostu upewniłem się, że katalog wyjściowy istnieje przed zapisaniem obrazu wyjściowego!

Ihab Hadżdż
źródło