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.
- Klonowanie obrazu i praca nad tym.
- Pobieranie enkodera dla tego MIME, który przekazuje go z ustawieniem jakości JPEG.
Odpowiedzi:
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.
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
źródło
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.
źródło
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:
Szkoda, że w konstruktorze nie
ArgumentException
wrzucono przyjaznego .netBitmap
.źródło
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
Image
skonstruowanego ze strumienia strumień nie może zostać zniszczona.Więc zamiast
Spróbuj tego
i zamknij imageStream w formularzu zamknij lub zamknij stronę internetową.
źródło
using
a następnie próbowałem skopiować obraz do strumienia pamięci i otrzymałem przerażający komunikat „Ogólny błąd w GDI +”.PixelFormat.Format32bppArgb
ale niePixelFormat.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.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.
I nie zapomnij wyczyścić pliku.
źródło
Zapisz obraz w zmiennej bitmapowej
źródło
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 +”
źródło
Wystąpił również ten błąd podczas zapisywania plików JPEG, ale tylko w przypadku niektórych zdjęć.
Mój końcowy kod:
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:
źródło
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.
źródło
jeśli twój kod jest następujący, to również ten błąd występuje
Prawidłowy to
Może to być spowodowane tym, że wracamy z bloku używającego
źródło
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.
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.
źródło
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
Mam nadzieję że to pomoże.
źródło
Wystąpił błąd z powodu pozwolenia. upewnij się, że folder ma CAŁĄ ZEZWOLENIE.
źródło
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.
źródło
W moim przypadku problem polegał na ścieżce, którą zapisywałem (root
C:\
). ZmianaD:\111\
na wyjątek zniknęła.źródło
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ę!
źródło
Moja kolej!
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.
źródło
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.
źródło
Zauważam, że twoja sprawa „jpeg” to w rzeczywistości:
Czy jesteś pewien, że format to JPEG, a nie coś innego?
Spróbowałbym:
Lub sprawdź, co
imageToConvert.MimeType()
faktycznie powraca.AKTUALIZACJA
Czy jest jakaś inna inicjalizacja, którą należy wykonać dla obiektu MemoryStream?
źródło
źródło
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.Save
zgł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łbyBitmap.Save
poprzedzony,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:
źródło
Wystąpił podobny problem przy generowaniu
PDF
lub zmianie rozmiaru obrazu przy użyciu lib ImageProcessor na serwerze produkcyjnym.Ponownie uruchom pulę aplikacji, aby rozwiązać problem.
źródło
Jeśli próbujesz zapisać obraz w zdalnej lokalizacji , dodaj
NETWORK_SERVICE
konto użytkownika do ustawień zabezpieczeń i daj temu użytkownikowi uprawnienia do odczytu i zapisu. W przeciwnym razie to nie zadziała.źródło
źródło
Występuje również ten błąd, ponieważ próbuję zapisać obrazy o tej samej nazwie co poprzednie zapisane obrazy.
Upewnij się, że nie zapisujesz zdjęć ze zduplikowaną nazwą.
Użyj na przykład funkcji „Losowe” ( jak działa generator liczb losowych w języku C #? ) Lub na przykład wygeneruj Guid ( http://betterexplained.com/articles/the-quick-guide-to-guids/ )
źródło
Proste, utwórz nową instancję Bitmapy rozwiązuje problem.
źródło
Dla mnie korzystałem
Image.Save(Stream, ImageCodecInfo, EncoderParameters)
i najwyraźniej powodowało to niesławnyA generic error occurred in GDI+
błąd.Próbowałem użyć,
EncoderParameter
aby 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
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ć:
zamiast
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.
źródło
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.
źródło
Możliwe problemy, które powodują taki błąd, to:
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!
źródło