Исключение WPF BitmapImage «Данные изображения вызвали переполнение во время обработки»

#c# #wpf #.net-core-3.1

#c# #wpf #.net-core-3.1

Вопрос:

Я имею дело с очень странной проблемой в WPF, которая пока что возникает только на ОДНОМ компьютере. Рассматриваемое приложение устанавливалось сотни раз, поэтому я подозреваю, что в нем отсутствуют какие-либо зависимости, хотя это приложение для .NET Core 3.1.

Таким образом, приложение загружает изображения значков, и представление привязывается к значку через открытое свойство в ViewModel:

 IconImage = new BitmapImage();
IconImage.BeginInit();
IconImage.UriSource = new Uri("LocalFilePath");
IconImage.DecodePixelWidth = 50;
IconImage.EndInit();
  

Где LocalFilePath — это путь к кэшированному изображению значка.
Изображение представляет собой файл PNG, его размер составляет 50×50 пикселей.

Приведенный выше код завершается ошибкой с исключением:

 Message -> The image data generated an overflow during processing.
Source ->PresentationCore
 Trace ->    at System.Windows.Media.Imaging.ColorConvertedBitmap.FinalizeCreation()
   at System.Windows.Media.Imaging.ColorConvertedBitmap..ctor(BitmapSource source, ColorContext sourceColorContext, ColorContext destinationColorContext, PixelFormat format)
   at System.Windows.Media.Imaging.BitmapImage.FinalizeCreation()
   at System.Windows.Media.Imaging.BitmapImage.EndInit()
InnerException -> Overflow or underflow in the arithmetic operation
  

Что меня сбивает с толку, так это то, что это происходит только на одном компьютере, работающем под управлением Windows 10 Home Edition с последними обновлениями.
Кто-нибудь видел эту ошибку раньше?
Может ли быть лучший альтернативный способ предоставления изображений PNG для просмотра?

Комментарии:

1. Вам не нужно устанавливать свойство decode pixel width, если это действительно файл png размером 50×50.

2. Это правда, в исходном коде не было этого набора фрагментов. Я подумал, что все равно добавлю это, чтобы предотвратить какое-либо вычисление, которое приводит к переполнению. Но обе версии вызывают одно и то же исключение: csharp IconImage = new BitmapImage("LocalFilePath");

3. UriSource не является строкой и должен быть таким: iconImage. UriSource = новый Uri (путь)

4. Спасибо, это должен был быть Uri, я соответствующим образом отредактировал вопрос

5. Содержит ли изображение встроенный цветовой профиль?

Ответ №1:

Несколько наших клиентов недавно получили такое же сообщение об ошибке. Чтобы исправить это, мы убедились, что все настройки в окне управления цветом являются «системными по умолчанию». В одном случае для «профиля устройства» было установлено значение «virtual SRGB», что вызвало эту проблему.

Это также может помочь установить IgnoreColorProfile в BitmapImage.CreateOptions .

Управление цветом Windows

Комментарии:

1. Только что был клиент, который столкнулся с описанной ошибкой, настройка image.CreateOptions = BitmapCreateOptions.IgnoreColorProfile решила проблему. Спасибо!

2. Спасибо! Это решило проблему, с которой столкнулся мой клиент. Если бы не этот пост, я бы все еще был в неведении.

3. Спасибо! Точно такая же проблема возникла и с одним из наших клиентов. Приложение WPF продолжило бы работу, просто не отображало бы элементы строки в некоторых окнах. Было очень запутанно пытаться устранить неполадки в том, что могло происходить.

Ответ №2:

Привязка непосредственно к свойству Uri вместо BitmapImage решила проблему. Хотя на самом деле это не исправление и не объясняет, почему исключение было сгенерировано в первую очередь, это, по крайней мере, обходной путь.

Комментарии:

1. Не могли бы вы, пожалуйста, поделиться примером кода для этого? Я столкнулся с точно такой же проблемой здесь. Для меня похоже, что это как-то связано с последними обновлениями Windows 10 (сборка 2004)

2. Чтобы ответить самому себе, вот 2 фрагмента кода, которые я в конечном итоге использовал: <Image Source="pack://application:,,,/MyApp;component/Assets/MyImage.png" /> для XAML кода и image.Source = new ImageSourceConverter().ConvertFromString("pack://application:,,,/MyApp;component/Assets/MyImage.png") as ImageSource; для кода за / viewmodels.