У меня есть приложение, работающее на Windows Server 2008, который обрабатывает загруженные изображения. В настоящее время это успешно обрабатывает приблизительно 8 000 изображений в день, создавая 11 различных размеров каждого изображения.
Проблема, которую я имею, состоит в том, что иногда приложению не удается загрузить некоторые изображения, я получаю ошибку "Система. Время выполнения. InteropServices. ExternalException: универсальная ошибка произошла в GDI +"..
Загрузка только принимает файлы с расширением JPEG (jpg/jpeg/jpe) или с типом MIME JPEG, и от того, что я могу сказать, что те изображения являются действительно изображениями JPEG. Если я смотрю на файл изображения в Windows Explorer на сервере, он может успешно извлечь миниатюру из файла, но если я пытаюсь открыть его, я получаю сообщение об ошибке, "Это не допустимый растровый файл, или это - формат, в настоящее время не поддерживается". от Краски.
Если я копирую изображение в свой собственный компьютер, запуская Windows 7, нет никакой проблемы, открывающей изображение. Это работает в Краске, Windows Photo Viewer, Adobe Bridge и Photoshop. Если я пытаюсь загрузить изображение с помощью Изображения. FromStream тот же путь как в приложении, работающем на сервере, это загружается очень хорошо. (Я скопировал файл назад в сервер, и он все еще не работает, таким образом, нет ничего в процессе копирования, который изменяет его.)
Когда я смотрю на данные изображения в Мосту, я вижу, что изображения создаются с помощью Picasa 3.0, но кроме этого я не вижу ничего специального о них. Я еще не нашел никого имеющего ту же проблему или любые известные проблемы как это с приложением Picasa.
Кто-либо имел какую-либо подобную проблему или знает, существует ли что-то специальное об изображениях, созданных с помощью Picasa? Есть ли какой-либо кодек изображения, которому нужна установка на сервере для обработки всех видов изображений JPEG?
Вот пример изображения, которое не загружается на сервере: gdi-example.jpg (192 КБ).
Из обмена экспертами я получил пример использования объекта BitmapImage для загрузки изображения и повторного сохранения его в MemoryStream. BitmapImage может по какой-то причине загружать изображения, которые объект Bitmap не может.
Мне также пришлось загрузить данные из файла и передать их BitmapImage как MemoryStream, чтобы файл не блокировался.
Итак, это последний код (без записи в журнал), который я использую сейчас:
using WpfImaging = System.Windows.Media.Imaging;
...
byte[] data = File.ReadAllBytes(FileName);
Image master;
using (MemoryStream source = new MemoryStream(data)) {
var img = new WpfImaging.BitmapImage();
img.BeginInit();
img.StreamSource = source;
img.EndInit();
WpfImaging.BmpBitmapEncoder encoder = new WpfImaging.BmpBitmapEncoder();
using (MemoryStream m = new MemoryStream()) {
encoder.Frames.Add(WpfImaging.BitmapFrame.Create(img));
encoder.Save(m);
master = new Bitmap(m);
}
}