Всем привет.
Хотел обсудить, кто как сохраняет картинки в файл из аксапты.
Столкнулся со странным поведением.
Дано:
Ax4.0
В серверном коде из бд начитывается контейнер с картинкой. Нужно сохранить его в файл.
Перегоняем картинку в System.IO.MemoryStream а его уже сохраняем на диск.
Все хорошо работало.
Но! В какой-то момент попалась нехорошая картинка, при сохранении которой на диск выскакивала ошибка "A generic error occurred in GDI+."
Сохранение на диск через вызов
X++:
image = System.Drawing.Image::FromStream(memoryStream);
image.Save(_fileName);
падало на этой вредной картинке. При этом сохраняло только 72 кб из 286.
Если переделать вызов на
X++:
byteArray = memoryStream.ToArray();
netFile = _fileName;
CLRInterop::staticInvoke(@'System.IO.File', @'WriteAllBytes', netFile, byteArray);
то все отлично работает.
Jpg файлы, получаемые этими методами - разные. При общем размере порядка 286 кб отличаются на 32 байта. При открытии в браузере IE визуально никакой разницы не заметно.
Вопрос:
1. Почему так происходит (ошибка GDI) ?
2. Почему размер и содержимое разное, хотя визуально разницы незаметно. Всегда ли так будет ?
3. Как правильно сохранять картинку в файл ?
P.S.
Зачем это было надо. В бд хранятся картинки, они начитываются, сохраняются на диск в виде файла, вставляются в Excel, который сохраняется как pdf отчет и отдается наружу через бизнес коннектор.
P.P.S. Image класс клиентский, поэтому для нашего случая не подходит.
P.P.P.S
Несколько ссылок где была подсказка при разработке исправленной версии:
1. В этой ссылке
https://habr.com/ru/post/482274/
идет критика System.Drawing и не рекомендуется его использовать при работе с изображениями в ASP.NET. Все из-за проблем с GDI и блокировками.
2. Здесь предложено решение:
https://stackoverflow.com/questions/...-save-the-file
Но нет уверенности, что результат эквивалентен и его везде можно применять.