سؤال

الطريقة أدناه ، تأخذ مصفوفة الألوان وتطبقها على الصورة الموردة. هناك بعض الأشياء التي يجب ملاحظة:

(1) إنها ليست وظيفة
(2) يتم استخدام نفس الصورة لإنشاء كائن الرسومات ، وكمصدر طريقة السحب.

Public Sub ApplyMatrixToImage(ByVal matrix As ColorMatrix, ByVal image As Image)
    Using atts As New ImageAttributes
        atts.SetColorMatrix(matrix)
        Using g As Graphics = Graphics.FromImage(image)
            Dim width As Integer = image.Width
            Dim height As Integer = image.Height
            Dim rect As New Rectangle(0, 0, width, height)
            g.DrawImage(image, rect, 0, 0, width, height, GraphicsUnit.Pixel, atts)
        End Using
    End Using
End Sub

لا أعرف ما إذا كان من الممارسات السيئة عدم إنشاء صورة نقطية أخرى لتقديم الصورة النهائية ، ولكن الشيء الغريب هو أن الطريقة تعمل بشكل جيد لتعديل توازن اللون (Matrix30 و 31 و 32) ، ولكن لا يفعل شيئًا لتعديل العتامة (Matrix33).

ماذا يحدث هنا؟

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

المحلول

لو أفهم سؤالك بشكل صحيح: أنت تسأل لماذا لا يمكنك تغيير قناة ألفا بهذه الطريقة؟ (لماذا يجب أن تكون وظيفة بدلاً من الفرعية تمامًا.)

ولكن لماذا لا يعمل كما قد تتوقع مع Opactiy/الشفافية أفهم تمامًا. :-)

سوف ترسم طريقة .DrawImage (إلى جانب ImageAttributes) كل بكسل تم تغييره على نفسه (لأن العرض والارتفاع متماثلان). لاحظ أنه سوف رسم - ليس يحل محل. هذا يعني أن قيمة البكسل الأصلية سوف يمزج مع قيمة بكسل محسوبة حديثا. من بين أشياء أخرى ، هذا يعني أنه إذا كانت البكسل الأصلي إذا كانت غير شفافة تمامًا ، فلا توجد طريقة تتغير. الطلاء بلون شفافية جزئيًا على شيء غير شفاف سيظل لونه غير شفاف.

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