I have an application based on images with deep magnification (converting from PNG to JPG pyramid at various scales), for which we use DeepZoomTools.dll. It depends on PresentationCore.dll and works fine for many years.
After deploying KB4040972 and KB4040973, the conversion from PNG to JPG generates (depending on the coordinates) black images instead of the image that should contain.
If the code below runs in a console or desktop application, it works.
It ONLY does not work if it is running under the SYSTEM account with a high privilege (for example, from the task scheduler).
I created a project to reproduce the problem, the code below:
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(); } }
Any clues there?
wpf rendertargetbitmap drawingvisual
J johansson
source share