سؤال

لديّ قناع صورة نقطية (BMPMASK) التي أرسمها على صورة نقطية (BMPDEST). تحتوي كلا النقطتين على قنوات ألفا ولكنها مليئة بالفعل بالمحتوى غير المعتاد.

ما أريد القيام به هو إنتاج مناطق شفافة باستخدام طرق GDI+ "Draw ..." على BMPMask بحيث تظهر BMPDest عندما أرسم BMPMASK فوقه.

بالتاكيد gMask.DrawLine(Pens.Transparent, 0, y, wMax, y) لا يسبب أي تغيير في BMPMask ، لأن GDI+ يعمل على النحو المصمم ولا يرسم أي شيء عندما يكون شفافًا. حتى مع الألوان شبه الشفافة ، يتم تحديث قيم R و G و B فقط من وحدات بكسل BMPMASK.

لكن ما أريد القيام به هو إصدار طريقة سحب من شأنها تغيير قناة ألفا من BMPMask بحيث تكون شفافة عند رسمها على BMPDest. أعلم أنه يمكنني القيام بذلك باستخدام بدائل setpixel أو أسرع من بدائل غير آمنة أو مارشال ، لكن ذلك قد يتسبب في حل أكثر تعقيدًا. شكرًا.

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

المحلول

وجدت "الجواب" بعد 3 سنوات!

لم أتجول أبدًا في تجربة حل دان ، لذلك لا أريد أن أخرج منه ، لكن هذا يفعل بالضبط ما أريد:

    ' (setting composting mode is the key to getting the transparent
    ' line to actually result in setting the pixels to transparent-
    ' instead of just not drawing anything 'because it's transparent dummy' - 
    ' because it turns off the 'math' that is done to cause transparent
    ' image drawing to occur and just verbatim copies the bits).
    g1.CompositingMode = Drawing2D.CompositingMode.SourceCopy
    g1.DrawLine(Pens.Transparent, 0, y, wMax, y)
    g1.CompositingMode = Drawing2D.CompositingMode.SourceOver

CompostingMode هو المفتاح! كنت أحاول أخيرًا إصلاح هذا النقص مرة أخرى في برنامجي ، وقام بحث Google بتشغيل هذا العنصر الذي لا علاقة له بما بحثت عنه (مهلا ، يمكن لـ Google قراءة عقلك).

هل الرسومات.

رائع! الآن 10 دولارات يقول ، لا أحد في العالم بأسره يقرأ هذا. 755

نصائح أخرى

على حد علمي ، فإن الطريقة الوحيدة لتغيير قناة ألفا هي ، كما تقول ، استخدام مؤشرات setpixel أو (بالطبع أفضل بكثير). اعتمادًا على ما تحاول القيام به ، أنت يستطع احصل على الاستخدام الإبداعي لـ colormatrix. سيتيح لك ذلك تغيير عملية السحب بطريقة يمكنك تبادل معنى R/G/B/A أثناء رسمها. جرب هذا للحصول على فكرة:

        using ( var bmp = new Bitmap( 100, 100 ) )
        using ( var g = Graphics.FromImage( bmp ) )
        using ( var ia = new ImageAttributes() )
        {
            float R = 1;
            float G = 0;
            float B = 0;
            ia.SetColorMatrix( new ColorMatrix( new float[][] {
                new float[] {1, 0, 0, R, 0},
                new float[] {0, 1, 0, G, 0},
                new float[] {0, 0, 1, B, 0},
                new float[] {0, 0, 0, 0, 0},
                new float[] {0, 0, 0, 0, 1}} ) );
            g.Clear( Color.White );
            g.FillEllipse( Brushes.Blue, 10, 10, 30, 30 );
            g.FillEllipse( Brushes.Red, 60, 10, 30, 30 );
            g.FillEllipse( Brushes.Green, 10, 60, 30, 30 );
            g.FillEllipse( Brushes.Black, 60, 60, 30, 30 );
            e.Graphics.DrawImage(
                bmp,
                new Rectangle( 0, 0, 100, 100 ),
                0, 0, 100, 100,
                GraphicsUnit.Pixel,
                ia );
        }

حاول إعداد R/G/B إلى 1 على التوالي وشاهد كيف يغير ذلك الألوان التي تظهر صلبة/شفافة. ولكن ، إذا كنت ترغب في تغيير قناة Alpha لنقطة النقطة مباشرة ، فإليك كيفية القيام بذلك: صور ذات حافة ناعمة في GDI+.

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