كيفية استخدام pixelformats.indexedx مع RenderTargetBitMap؟
-
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 يمكن أن يعمل معه.