Обновление Windows KB4040972/73 вызывает черные изображения с классами WPF

У меня есть приложение, основанное на изображениях с глубоким увеличением (преобразование из PNG в пирамиду JPG различного масштаба), для которых мы используем DeepZoomTools.dll. Это зависит от PresentationCore.dll и работал хорошо в течение многих лет.

После развертывания KB4040972 и KB4040973 преобразование из PNG в JPG создает (в зависимости от координат) черные изображения вместо изображения, которое оно должно содержать.

Если приведенный ниже код запускается в консольном или настольном приложении, он работает.

Он ТОЛЬКО не работает, если работает под учетной записью SYSTEM с высоким уровнем привилегий (например, из планировщика заданий).

Я создал проект для воспроизведения проблемы, код ниже:

public static void TestConvert2(string strFileName, string strOutFileName) {
 JpegBitmapEncoder jpegBitmapEncoder = new JpegBitmapEncoder();
 jpegBitmapEncoder.QualityLevel = 1 + (int) Math.Round(0.95 * 99.0);
 BitmapEncoder encoder = jpegBitmapEncoder;

 Int32Rect inputRect = new Int32Rect(0, 0, 255, 255);
 Rect outputRect = new Rect(0, 0, 255, 255);
 Uri bitmapUri = new Uri(strFileName, UriKind.RelativeOrAbsolute);
 BitmapDecoder bitmapDecoder = BitmapDecoder.Create(bitmapUri,
  BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
 bitmapDecoder = BitmapDecoder.Create(bitmapUri, BitmapCreateOptions.IgnoreImageCache, BitmapCacheOption.None);

 BitmapSource inputFrame = (BitmapSource) bitmapDecoder.Frames[0];
 BitmapSource source1 = (BitmapSource) new CroppedBitmap(inputFrame, inputRect);
 DrawingVisual drawingVisual = new DrawingVisual();
 using(DrawingContext drawingContext = drawingVisual.RenderOpen()) {
  drawingContext.DrawRectangle(new SolidColorBrush(Color.FromArgb(255, 255, 255, 255)), null, outputRect);
  drawingContext.DrawImage((ImageSource) source1, outputRect);
  drawingContext.Close();
 }
 RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap(255, 255, 96.0, 96.0, PixelFormats.Default);
 renderTargetBitmap.Render((Visual) drawingVisual);
 source1 = (BitmapSource) new FormatConvertedBitmap((BitmapSource) renderTargetBitmap, PixelFormats.Bgr24, (BitmapPalette) null, 0.0);
 BitmapFrame frameToCache = BitmapFrame.Create(source1, (BitmapSource) null, null, (ReadOnlyCollection < ColorContext > ) null);
 encoder.Frames.Add(frameToCache);
 using(FileStream fileStream = new FileStream(strOutFileName, FileMode.Create)) {
  encoder.Save((Stream) fileStream);
  fileStream.Flush();
 }
}

Есть какие-нибудь подсказки?

3 ответа

Microsoft опубликовала статью, в которой говорится, что они знают об этой проблеме и работают над ее решением. Они также предоставляют обходной путь, в основном, для временного удаления обновления 12 сентября 2017 года, накопительного обновления по безопасности и качеству.

См.: https://support.microsoft.com/en-us/help/4043601/rendering-issues-after-the-september-12-2017-net-security-and-quality

Обсуждение продолжилось на https://social.msdn.microsoft.com/Forums/vstudio/en-US/0f14f14c-5cd3-4505-9168-2ef9dc1f7031/kb-4041083-kb-4040973-has-broken-wpf-rendering-in-services?forum=wpf Кажется, больше, чем у меня эта проблема.

Для нас в итоге рекомендованное обновление от Microsoft KB4043767 решило эту проблему. Это будет частью октябрьского развертывания (в настоящее время в режиме предварительного просмотра).

Другие вопросы по тегам