Создание изображения Freezable из изображения non-Freezable

У меня есть DrawingImage, который использует DynamicResources для своих цветов. Я хочу затем использовать это изображение в анимации, однако вы не можете использовать объекты, которые используют DynamicResources в анимации, потому что они не замораживаются. Я знаю, что не могу динамически менять цвета во время анимации, меня это не волнует. Я просто хочу создать версию этого изображения, которое я могу использовать в анимации. Таким образом, в основном, есть изображение оценить все его ресурсы, а затем выплюнуть версию, которую я могу вызвать Freeze on, чтобы использовать в анимации. Наверняка это возможно? Я должен быть в состоянии, например, записать этот образ на диск? Это должно создать Freezable версию его, нет? Я гуглил и искал StackOverflow, но не могу найти ничего полезного… Любая помощь была бы очень признательна.

Метки

1 ответ

  1. Это было удивительно трудно найти решение,но я, кажется, нашел. Я сделал это удобное расширение, которое возьмет мой DrawingImage и закодирует его как PNG через PngBitmapEncoder, затем запишет это в поток памяти, а затем загрузит это в BitmapImage, который замораживается и может использоваться в моей анимации. Whole lotta work for something so simple!

    public static class DrawingExtensions
    {
        public static BitmapImage GetAsFreezableBitmapImage(this DrawingImage drawingImage)
        {
            return drawingImage?.Drawing?.GetAsFreezableBitmapImage();
        }
    
        public static BitmapImage GetAsFreezableBitmapImage(this Drawing drawing)
        {
            if (drawing == null)
                return null;
    
            var drawingVisual = new DrawingVisual();
    
            using (var drawingContext = drawingVisual.RenderOpen())
            {
                drawingContext.PushTransform(new TranslateTransform(-drawing.Bounds.X, -drawing.Bounds.Y));
                drawingContext.DrawDrawing(drawing);
            }
    
            var bitmap = new RenderTargetBitmap((int)drawing.Bounds.Width, (int)drawing.Bounds.Height, 96, 96, PixelFormats.Pbgra32);
            bitmap.Render(drawingVisual);
    
            var encoder = new PngBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(bitmap));
    
            var bitmapImage = new BitmapImage();
            using (var stream = new MemoryStream())
            {
                encoder.Save(stream);
                bitmapImage.BeginInit();
                bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
                bitmapImage.StreamSource = stream;
                bitmapImage.DecodePixelHeight = bitmap.PixelHeight;
                bitmapImage.DecodePixelWidth = bitmap.PixelWidth;
                bitmapImage.EndInit();
            }
    
            return bitmapImage;
        }
    }