У меня есть DrawingImage, который использует DynamicResources для своих цветов. Я хочу использовать этот образ в анимации, однако вы не можете использовать объекты, которые используют DynamicResources в анимации, потому что они не являются Freezable. Я знаю, что у меня не может быть, чтобы его цвета динамически менялись во время анимации, меня это не волнует. Я просто хочу создать версию этого изображения, которую я могу использовать в анимации. Таким образом, в основном, изображение оценивает все его ресурсы, а затем выплевывает версию, которую я могу вызвать Freeze для использования в анимации. Неужели это должно быть возможно? Должен ли я, например, записать этот образ на диск? Это должно создать версию Freezable, нет? Я googled и искал StackOverflow, но не могу найти ничего полезного ... Любая помощь была бы высоко оценена.Создать Freezable изображение с не-Freezable image
0
A
ответ
0
Это было удивительно сложно выкопать решение, но я, кажется, нашел его. Я сделал это удобное расширение, которое возьмет мой DrawingImage и закодирует его как PNG через PngBitmapEncoder, а затем напишет это в поток памяти, а затем загрузите его в BitmapImage, который является Freezable и может использоваться в моей анимации. Вся лотта работает на что-то такое простое!
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;
}
}
Смежные вопросы
- 1. Freezable DataContext
- 2. Почему CompositeCollection не Freezable?
- 3. Создать уникальное изображение (GUID to Image)
- 4. Является WPF StackPanel freezable
- 5. Как создать спрайт Image
- 6. Создать элемент XML с изображением «image: image»
- 7. Пытается создать шумовое изображение с шумом, numpy и Image
- 8. Изображение с рамкой background image
- 9. DataGrid CellStyle Setters с Freezable StaticRecource
- 10. Изображение загрузчика Ajax.AjaxLink image
- 11. Построить изображение докера с rhel6.5 image
- 12. не может построить изображение докера с ошибкой. Image image
- 13. Как переименовать JavaScript Image() и создать совершенно другое изображение()?
- 14. Как создать checkbox image base
- 15. Создать изображение с помощью php
- 16. Image Magick создать треугольник
- 17. Qt: Создать стек image
- 18. Загрузить изображение с помощью библиотеки image-chooser
- 19. Deblur изображение с использованием scikit-image
- 20. Image Slider с следующее изображение предварительного просмотра
- 21. Показать изображение с объекта IMAGE в MVC
- 22. заполнить изображение другим градиентом image
- 23. Image Magick создать миниатюру
- 24. background-image url отзывчивое изображение
- 25. Как создать файл из Image Url без скачивания Image
- 26. Хром Image Transform (изображение исчезает)
- 27. Как обрабатывать Freezable в пользовательской MarkupExtension?
- 28. Что такое поднемок «Freezable» в WPF/Silverlight?
- 29. Android - Image Picker, Wrong Изображение
- 30. Создать изображение с PHP
Вы попробовали метод 'GetAsFrozen()'? – Clemens
Да, но это работает только в том случае, если значение параметра CanFreeze истинно, а это не связано с DynamicResources. – StuartMorgan