[VB.Net]Bild einfärben


Nightking

Grünschnabel
Hallo zusammen :)

Ich habe ein Problem beim einfärben eines Bildes, und zwar, wenn ich ein Bild einfärbe zB rot,sprich, ich entferne den Grün- und Blauanteil des Bildes und füge ich den Grünanteil wieder hinzu wird es Gelb. Soweit korrekt, nur wenn ich das Bild, rot eingefärbt, übernehme und den Grünanteil im nachhinein hinzufügen möchte ändert sich das Bild nicht mehr. Theoretisch müsste es ja Gelb werden

Ablauf:
Der Benutzer öffnet ein Bild und dieses wird in eine Picturebox geladen. Neben der Picturebox hat es drei Trackbars (RGB) mit dennen man den Farbanteil regeln kann.

Code:
Sub farbdef()
   
        Dim image As Image = Me.PictureBox1.Image

        Dim imageAttributes As New ImageAttributes()
        Dim width As Integer = image.Width
        Dim height As Integer = image.Height

        Dim colorMatrixElements As Single()() = { _
         New Single() {Me.TrackBar_red.Value / 100, 0, 0, 0, 0}, _
         New Single() {0, Me.TrackBar_green.Value / 100, 0, 0, 0}, _
         New Single() {0, 0, Me.TrackBar_blue.Value / 100, 0, 0}, _
         New Single() {0, 0, 0, Me.TrackBar_Alpha.Value / 100, 0}, _
         New Single() {0, 0, 0, 0, 1}}

        Dim colorMatrix As New ColorMatrix(colorMatrixElements)

        imageAttributes.SetColorMatrix( _
           colorMatrix, _
           ColorMatrixFlag.Default, _
           ColorAdjustType.Default)

        'Neue 32bit Bitmap erstellen
        Dim NewBitmap = New Bitmap(image)

        'Resolution (DPI) vom Quellbitmap auf Zielbitmap übertragen
        'NewBitmap.SetResolution(Bild.HorizontalResolution, Bild.VerticalResolution)



        'Graphicsobjekt von NewBitmap erstellen
        Dim NewGraphics As Graphics = Graphics.FromImage(NewBitmap)

        'NewBitmap auf NewGraphics zeichnen
        NewGraphics.DrawImage(image, New Rectangle(0, 0, width, height), 0, 0, width, height, GraphicsUnit.Pixel, _
        imageAttributes)


        'Ressource freigeben
        NewGraphics.Dispose()
        imageAttributes.Dispose()

        farbpic = NewBitmap

        Me.PictureBox1.Image = farbpic
        Me.PictureBox1.Refresh()

    End Sub


 Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar_Red.Scroll
                 Bildfarbe()
    End Sub

Hat jemand eine Idee wie ich dies realisieren könnte? Ich hab echt nichts brauchbares gefunden. bzw nichts was mir weiterhelfen konnte.

Wer mehr Infos braucht, einfach melden!! :)

PS: Bitte eine ausführliche Erklärung, da ich erst seit zwei Monaten VB programmiere sind meine Kenntnisse noch beschrenkt :).
 

PhoenixLoe

Erfahrenes Mitglied
Hallo Nightking,

das Problem ist rein mathematischer Natur. Da es sich hier um eine Farbmatrix handelt, werden die einzelnen Farbwerte auf relativ kompliziertem Wege mit der Matrix multipliziert. Da der ursprüngliche Grünwert 0 beträgt, kann er per Multiplikation nicht verändert werden. Die Farbmatrix ist also dafür nicht geeignet (zumindest nicht, soweit mir bekannt ist).

Die Alternative wäre, den Grünwert über das BitmapData-Objekt von Hand einzutragen und das Bild anschließend wieder per Farbmatrix zu manipulieren.

Vielleicht kennt noch jemand eine Alternative?

Gruß
PhoenixLoe
 

PhoenixLoe

Erfahrenes Mitglied
Hallo Nightking,

ich habe nochmal darüber nachgedacht. Eigentlich ist es doch möglich, einen Null-Wert zu manipulieren, da es sich ja um eine 5x5-Matrix handelt. Das Stichwort lautet Verschiebungsmatrix. Eine Lösung Deines Problems wäre, zwei Matrizen zu verwenden. Die erste Matrix verschiebt den Grünwert oder einen entsprechenden anderen Wert auf die maximale Itensität, während die zweite Matrix diesen Wert wieder abdunkelt.

Hier mal ein Beispiel für eine Translationsmatrix:

Code:
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
r g b a 1
Die Werte r, g, b und a werden entsprechend auf Deinen Farbwert aufaddiert.
Anschließend kannst Du wie gewohnt die Matrix zur Manipulation des Grünwertes verwenden.

OK, ich hoffe, dass das dieses Mal stimmt, was ich hier erzähle :rolleyes:.

Vielleicht suchst Du in der MSDN auch mal nach GDI+ und ColorMatrix. Da gab's glaub ich sogar einen Artikel über die Möglichkeiten der ColorMatrix.

Gruß
PhoenixLoe
 

Nightking

Grünschnabel
Danke Ich schau es mir morgen mal an.
Sobald ichs gelöst hab schreib ichs hier rein :)!


mfg Nightking
 
Zuletzt bearbeitet:

Neue Beiträge

Forum-Statistiken

Themen
272.360
Beiträge
1.558.632
Mitglieder
187.834
Neuestes Mitglied
jordanx0206