سؤال

أود القيام ببعض معالجة الصور في تطبيق WPF. ومع ذلك ، أود تعديل وحدات البكسل من Bitmapsource في الذاكرة في وقت التشغيل.

أتمكن حاليًا من القيام بذلك باستخدام رمز "غير آمن" مقابل نظام قديم. تم وصف النهج في هذا المنشور: http://blogs.msdn.com/b/ericgu/archive/2007/06/20/lost-2-2-unsafe-image-processing.aspx

للحصول على هذا العمل في WPF ، أقوم بعد ذلك بإنشاء صورة BITMapsource WPF باستخدام هذا النهج:

    BitmapSource destination;
    IntPtr hBitmap = bitmap.GetHbitmap();
    BitmapSizeOptions sizeOptions = BitmapSizeOptions.FromEmptyOptions();
    destination = Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, sizeOptions);
    destination.Freeze();
    return destination;

ومع ذلك ، فإن هذا يخلق الكثير من النسخ في الذاكرة وأريد حقًا الدخول إلى هناك وأتعامل مع البتات الأساسية داخل صورة نقطية مثلما أظهر إريكو في مثال نقطية. هل هذا ممكن؟

أدرك أن Pixelshaders يمكن أن يفعل ذلك على الأرجح ، لكن هذا تمرين أكاديمي يتضمن خيوط متعددة (يتم دعمها عند تحرير صورة نقطية في وضع غير آمن).

شكرا مقدما

هل كانت مفيدة؟

المحلول

سأخبرك بقدر ما أعرف.

أولاً ، يبدو أنك تعرف بالفعل عن تجميد الخلايا النقطية قبل إعادتها إلى الخيط الرئيسي. هذه بداية جيدة.

لقد حاولت ذات مرة تقليل النسخ عن طريق استخلاص تنفيذ جديد من Bitmapsource ، وتجاوز الوظائف الافتراضية التي تنسخ بياناتك من صورة نقطية. نجحت ولكن أنتجت تسربات الذاكرة الضخمة. لم أحسب ذلك.

يمكنك بالطبع إنشاء صورة نقطية مباشرة من مجموعة من البايتات (وفقدان النفقات العامة لنقطات النقطة GDI). مستندات MSDN

هل فكرت crinablebitmap؟ كان ذلك استجابة فريق WPF للشكوى المشتركة حول جميع النسخ.

يحرر: يقول MSDN صراحة (في وثائق critablebitmap.backbuffer) أنه يمكن استخدامه من موضوع خلفية:

يمكنك تمرير مؤشر Backbuffer إلى المكونات الخارجية وغيرها من المواضيع للمعالجة ، ولكن إذا قمت بذلك ، فيجب أن توفر لك تنسيق مؤشر ترابط. على وجه الخصوص ، يجب عليك التأكد من أن مؤشر ترابط واجهة المستخدم يحدد المناطق التي تم تغييرها عن طريق استدعاء طريقة AddDirtyRect ، وأن مؤشر ترابط واجهة المستخدم يفتح المخزن المؤقت عن طريق استدعاء طريقة إلغاء القفل.

لذلك إذا تركت واجهة المستخدم تقوم بتعيين القفل والمؤشر ، فيمكنك السماح لخيط العامل بكتابة البكسلات.

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