Это кажется немного печально известной ошибкой во всей сети. Настолько, что я не смог найти ответ на мою проблему, так как мой сценарий не подходит. Исключение выдается, когда я сохраняю изображение в поток.
Странно, но это прекрасно работает с png, но выдает вышеуказанную ошибку с jpg и gif, что довольно запутанно.
Большинство подобных проблем связаны с сохранением изображений в файлы без разрешений. По иронии судьбы решение состоит в том, чтобы использовать поток памяти, как я делаю ....
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:
ОК, вещи, которые я пробовал до сих пор.
- Клонирование изображения и работа над этим.
- Извлечение кодера для этого MIME, передавая его с настройкой качества JPEG.
Ответы:
Хорошо, я, кажется, нашел причину просто по счастливой случайности, и в этом конкретном методе нет ничего плохого, он еще больше копирует стек вызовов.
Ранее я изменял размер изображения и как часть этого метода я возвращал объект с измененным размером следующим образом. Я вставил два вызова в вышеупомянутый метод и прямое сохранение в файл.
Представляется , что поток памяти , что объект был создан должен быть открыт в то время объект будет сохранен. Я не уверен, почему это так. Кто-нибудь может просветить меня и как я могу обойти это.
Я только возвращаюсь из потока, потому что после использования кода изменения размера, подобного этому, у файла назначения есть неизвестный тип MIME (img.RawFormat.Guid) и Id как тип MIME, чтобы быть корректным на всех объектах изображения, поскольку это делает его трудным написать универсальный обработка кода в противном случае.
РЕДАКТИРОВАТЬ
Это не появилось в моем первоначальном поиске, но вот ответ от Джона Скита
источник
Если вы получаете эту ошибку, то я могу сказать, что ваше приложение не имеет разрешения на запись в какой-либо каталог.
Например, если вы пытаетесь сохранить образ из потока памяти в файловую систему, вы можете получить эту ошибку.
Пожалуйста, если вы используете XP, обязательно добавьте разрешение на запись для учетной записи aspnet в этой папке.
Если вы используете Windows Server (2003, 2008) или Vista, убедитесь, что добавили разрешение на запись для учетной записи сетевой службы.
Надеюсь, это поможет кому-нибудь.
источник
Я добавлю эту причину ошибки также в надежде, что это поможет некоторым будущим интернет-путешественникам. :)
GDI + ограничивает максимальную высоту изображения до 65500
Мы делаем некоторые базовые изменения размера изображения, но при изменении размера мы стараемся поддерживать соотношение сторон. У нас есть парень по контролю качества, который слишком хорош в этой работе; он решил проверить это с фотографией шириной ОДИН пиксель, которая была 480 пикселей в высоту. Когда изображение было масштабировано в соответствии с нашими размерами, высота была выше 68 000 пикселей, и наше приложение взорвалось
A generic error occurred in GDI+
.Вы можете проверить это самостоятельно с помощью теста:
Жаль, что нет дружественного .net,
ArgumentException
брошенного в конструкторBitmap
.источник
В этой статье подробно объясняется, что именно происходит: зависимости растровых изображений и изображений
Короче говоря, в течение жизни созданного
Image
из потока поток не должен быть уничтожен.Итак, вместо
попробуй это
и закройте imageStream при закрытии формы или веб-страницы.
источник
using
а затем попытался скопировать изображение в поток памяти и получил ужасное сообщение «Общая ошибка в GDI +».PixelFormat.Format32bppArgb
но нетPixelFormat.Format1bppIndexed
. В статье, на которую вы ссылаетесь, объясняется, почему: GDI + может предпочесть повторно декодировать растровые данные из исходного потока, а не хранить все в памяти. Я предполагаю, что он не перекодирует изображения 1bpp.Вы также получите это исключение, если попытаетесь сохранить по неверному пути или если есть проблема с разрешениями.
Если вы не уверены на 100%, что путь к файлу доступен, а права доступа правильные, попробуйте записать текстовый файл. Это займет всего несколько секунд, чтобы исключить то, что было бы очень просто исправить.
И не забудьте почистить файл.
источник
Сохранить изображение в растровую переменную
источник
На всякий случай, если кто-то делает такие глупости, как я. 1. убедитесь, что путь существует. 2. убедитесь, что у вас есть права на запись. 3. убедитесь, что ваш путь правильный, в моем случае мне не хватало имени файла в TargetPath :(
он должен был сказать, что ваш путь отстой, чем "Общая ошибка произошла в GDI +"
источник
Я также получил эту ошибку при сохранении JPEG, но только для определенных изображений.
Мой окончательный код:
Я не создавал изображения, поэтому я не могу сказать, в чем разница.
Буду признателен, если кто-нибудь сможет это объяснить.
Это моя функция SaveJpeg просто для справки:
источник
Я обнаружил, что если в одной из родительских папок, в которой я сохранял файл, был завершающий пробел, то GDI + генерировал бы общее исключение.
Другими словами, если я попытался сохранить в «C: \ Documents and Settings \ myusername \ Local Settings \ Temp \ ABC DEF M1 Trended Values \ Images \ picture.png», он выдал общее исключение.
Имя моей папки было сгенерировано из имени файла, в котором, как оказалось, есть завершающий пробел, поэтому было легко выполнить .Trim () и двигаться дальше.
источник
если ваш код выглядит следующим образом, то также возникает эта ошибка
Правильный
Это может быть потому, что мы возвращаемся из блока использования
источник
Это расширение / уточнение ответа Фреда, который гласил: «GDI ограничивает высоту изображения до 65534». Мы столкнулись с этой проблемой в одном из наших приложений .NET, и, увидев этот пост, наша команда аутсорсинга подняла руки и сказала, что не может решить проблему без серьезных изменений.
Основываясь на моем тестировании, можно создавать / манипулировать изображениями с высотой более 65534, но проблема возникает при сохранении в поток или файл В НЕКОТОРЫХ ФОРМАТАХ . В следующем коде вызов метода t.Save () вызывает у нашего друга общее исключение, когда высота пикселя для меня равна 65501. Из любопытства я повторил тест на ширину, и для сохранения был применен тот же предел.
Та же ошибка возникает и при записи в поток памяти.
Чтобы обойти это, вы можете повторить приведенный выше код и заменить ImageFormat.Tiff или ImageFormat.Bmp на ImageFormat.Jpeg.
Это достигает высоты / ширины 100 000 для меня - я не проверял пределы. Как это бывает. Tiff был жизнеспособным вариантом для нас.
ИМЕЙТЕ В ВИДУ
Потоки / файлы TIFF в памяти занимают больше памяти, чем их JPG-аналоги.
источник
Была очень похожая проблема, а также попытался клонировать изображение, которое не работает. Я обнаружил, что лучшим решением было создание нового объекта Bitmap из изображения, которое было загружено из потока памяти. Таким образом, поток может быть удален, например,
Надеюсь это поможет.
источник
Произошла ошибка из-за разрешения. убедитесь, что в папке есть ВСЕ РАЗРЕШЕНИЕ.
источник
Решено - у меня была именно эта проблема. Для меня исправлением было увеличение дисковой квоты для IUSR на сервере IIS. В этом случае у нас есть приложение каталога с изображениями предметов и тому подобное. Квота загрузки для «Анонимного веб-пользователя» была установлена равной 100 МБ, что является значением по умолчанию для серверов IIS данной конкретной хостинговой компании. Я увеличил его до 400 МБ и смог загрузить изображения без ошибок.
Возможно, это не ваша проблема, но если это так, то это легко исправить.
источник
В моем случае проблема была в пути, который я сохранял (корень
C:\
). Его изменениеD:\111\
сделало исключение исключенным.источник
Другая причина этой ошибки - путь, который вы указываете в методе Save экземпляра Bitmap, не существует или вы не указали полный / действительный путь.
Просто была эта ошибка, потому что я передавал имя файла, а не полный путь!
Такое случается!
источник
Мой ход!
Получил его на .Save ... потому что использование () держит файл открытым, поэтому я не могу перезаписать его. Может быть, это поможет кому-то в будущем.
источник
Та же проблема, с которой я столкнулся. Но в моем случае я пытался сохранить файл на диске C, и он не был доступен. Поэтому я попытался сохранить его на диске D, который был полностью доступен, и мне это удалось.
Поэтому сначала проверьте ваши папки, в которых вы пытаетесь сохранить. У вас должны быть все права (для чтения и записи) для этой конкретной папки.
источник
Я заметил, что ваш случай "JPEG" на самом деле:
Вы уверены, что формат jpeg, а не что-то еще?
Я бы попробовал:
Или проверь что
imageToConvert.MimeType()
на самом деле возвращается.ОБНОВИТЬ
Есть ли какая-либо другая инициализация, которую вам нужно сделать для объекта MemoryStream?
источник
источник
Просто, чтобы добавить другое возможное решение, я упомяну случай, с которым столкнулся, с этим сообщением об ошибке. Метод
Bitmap.Save
выдает это исключение при сохранении растрового изображения, которое я преобразовал и отображал. Я обнаружил, что оно не будет генерировать исключение, если в операторе есть точка останова, и не будет, если перед нимBitmap.Save
стоитThread.Sleep(500)
поэтому я предполагаю, что происходит некий конфликт ресурсов.Простого копирования изображения в новый растровый объект было достаточно для предотвращения появления этого исключения:
источник
У нас была похожая проблема при создании
PDF
или изменении размера изображения с помощью библиотеки ImageProcessor lib на производственном сервере.Перезапустите пул приложений, чтобы устранить проблему.
источник
Если вы пытаетесь сохранить изображение в удаленном месте , обязательно добавьте
NETWORK_SERVICE
учетную запись пользователя в настройки безопасности и предоставьте этому пользователю права на чтение и запись. Иначе это не сработает.источник
источник
Я также получаю эту ошибку, потому что я пытаюсь сохранить изображения с тем же именем предыдущих сохраненных изображений.
Убедитесь, что вы не сохраняете изображения с повторяющимся именем.
Используйте, например, функцию «Случайно» ( как работает генератор случайных чисел в C #? ) Или, например, сгенерируйте Guid ( http://betterexplained.com/articles/the-quick-guide-to-guids/ ).
источник
Все просто, создание нового экземпляра Bitmap решает проблему.
источник
Для меня я использовал
Image.Save(Stream, ImageCodecInfo, EncoderParameters)
и, по-видимому, это было причиной печальноA generic error occurred in GDI+
ошибки.Я пытался использовать,
EncoderParameter
чтобы сохранить JPEG в 100% качестве. Это отлично работало на «моей машине» (дох!), А не на производстве.Когда я использовал
Image.Save(Stream, ImageFormat)
вместо этого, ошибка исчезла! Поэтому, как идиот, я продолжал использовать последний, хотя он сохраняет их в качестве по умолчанию, которое, как я полагаю, составляет всего 50%.Надеюсь, эта информация кому-то поможет.
источник
Я тоже столкнулся с проблемой. Проблема была в том, что поток загрузки был утилизирован. Но я не распоряжался им, это было внутри .Net framework. Все, что мне нужно было сделать, это использовать:
вместо того
image_instance имеет тип System.Windows.Forms.PictureBox! Функция PictureBox Load () удаляет поток, из которого было загружено изображение, и я этого не знал.
источник
Основываясь на ответе @savindra, если вы RHM в своем приложении и пытаетесь работать от имени администратора, это должно решить вашу проблему.
У меня, похоже, была проблема с разрешением.
источник
Возможные проблемы, которые вызывают такую ошибку:
Надеюсь, это поможет, это исправило мою проблему, я просто убедился, что выходной каталог существует, прежде чем сохранять выходное изображение!
источник