Как использовать pixelformats.indexedx с redertargetbitmap?
-
30-09-2019 - |
Вопрос
Я хочу сделать DrawingVisual
(визуальный в примере) до растрового изображения, используя RenderTargetBitmap
с целью установить это растровое изображение в качестве фона к Canvas
Как показано ниже:
var bmp = new RenderTargetBitmap(2000, 50, 120, 96, PixelFormats.Indexed2);
bmp.Render(visual);
var brush = new ImageBrush(bmp) { Stretch = Stretch.Fill };
Canvas.Background = brush;
Когда используешь PixelFormats.Default
как последний аргумент RenderTargetBitmap
, изображение визуализации, как и ожидалось. Тем не менее, когда я выбираю PixelFormats.Indexed2
(или любой из PixelFormats.IndexedX
), мой код, кажется, выходит из метода без исключения, bmp.Render
линия никогда не вызывается и, следовательно, изображение не отображается на Canvas
.
Как использовать IndexedX
Форматы пикселей с RenderTargetBitmap
? Или есть ли другие способы уменьшить объем памяти изображения? Он использует только три цвета, поэтому используя палитру, а не 32-битное RGB, казалось, путь.
Решение
Вы не можете. RenderTargetBitmap
только поддерживает Pbgra32
формат пикселя. Это связано с тем, что система рендеринга WPF работает полностью в 32 битах на пиксель. Это формат, в котором он генерирует изображения, и это также формат, в котором он предпочитает изображения, если вы хотите сделать их. (Если вы предоставляете ему растровое изображение в любом другом формате, он должен сначала преобразовать его в 32 бит на пиксельное представление.)
Что вы планируете делать с этим растровым карманом? Если вы хотите сделать его в приложении WPF, это необходимо сначала преобразовать в формат 32BPP в любом случае, поэтому вы рискуете использовать более Память, если вы попытаетесь удержать его внутри в любом другом формате. (Вы будете иметь предположительное представление а также Версия WPF на самом деле способна работать.) Не говоря уже о дополнительном времени процессора, потраченного преобразования между выбранным форматом и форматом WPF.