سؤال

أنا أتطلع إلى تقديم ملف 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 يمكن أن يعمل معه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top