Обновление 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://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 решило эту проблему. Это будет частью октябрьского развертывания (в настоящее время в режиме предварительного просмотра).