Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0063: Helligkeit, Kontrast und Gamma eines Bildes ändern

 von 

Beschreibung

Dieses Beispiel zeigt, wie per ColorMatrix die Helligkeit und der Kontrast eines Bildes geändert werden kann. Zusätzlich kann über das ImageAttribute-Objekt der Gammawert eines Bildes geändert werden.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Framework-Version(en):

.NET Framework 1.0, .NET Framework 1.1, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5

.NET-Version(en):

Visual Basic 2005, Visual Basic 2008

Download:

Download des Beispielprojektes [50,52 KB]

' Dieser Quellcode stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!

' Projektversion:   Visual Studio 2005
' Option Strict:    An
'
' Referenzen: 
'  - System
'  - System.Data
'  - System.Deployment
'  - System.Drawing
'  - System.Windows.Forms
'  - System.Xml
'
' Imports: 
'  - Microsoft.VisualBasic
'  - System
'  - System.Collections
'  - System.Collections.Generic
'  - System.Data
'  - System.Drawing
'  - System.Diagnostics
'  - System.Windows.Forms
'

' ##############################################################################
' ################################# Form1.vb ###################################
' ##############################################################################
Option Strict On
Option Explicit On

Imports System.Drawing
Imports System.Drawing.Imaging

Public Class Form1
    ''' <summary>
    ''' Helligkeit, Kontrast und Gammawert eines Bitmaps ändern
    ''' </summary>
    ''' <param name="InBitmap">Bitmap-Objekt</param>
    ''' <param name="Brightness">Heligkeit (-1 bis 1) 0 = Normal</param>
    ''' <param name="Contrast">Kontrast (-1 bis 1) 0 = Normal</param>
    ''' <param name="Gamma">Gammawert (0 bis 2) 1 = Normal</param>
    ''' <returns>Bitmap-Objekt</returns>
    Private Function SetBrightnessContrastGamma(ByVal InBitmap As Bitmap, _
        ByVal Brightness As Single, _
        ByVal Contrast As Single, _
        ByVal Gamma As Single) As Bitmap

        ' Min/Max
        If Brightness > 1 Then Brightness = 1
        If Brightness < -1 Then Brightness = -1
        If Contrast > 1 Then Contrast = 1
        If Contrast < -1 Then Contrast = -1

        ' Gammawert darf nicht = 0 sein (Bug in GDI+)
        If Gamma = 0 Then Gamma = CSng(Gamma + 1.0E-45)

        ' Zur korrekten Darstellung:
        Dim Diff As Single = (Brightness / 2) - (Contrast / 2)

        ' ColorMatrix erstellen
        Dim Matrix As New Imaging.ColorMatrix(New Single()() _
                       {New Single() {1 + Contrast, 0, 0, 0, 0}, _
                        New Single() {0, 1 + Contrast, 0, 0, 0}, _
                        New Single() {0, 0, 1 + Contrast, 0, 0}, _
                        New Single() {0, 0, 0, 1, 0}, _
                        New Single() {Brightness + Diff, _
                                      Brightness + Diff, _
                                      Brightness + Diff, 0, 1}})


        ' Neue Bitmap erstellen
        Dim NewBmp As New Bitmap(InBitmap.Width, InBitmap.Height, _
            Drawing.Imaging.PixelFormat.Format24bppRgb)

        ' ImageAttribute-Objekt erstellen
        Using ImageAttr As New Imaging.ImageAttributes()

            ' ColorMatrix für das ImageAttribute-Objekt setzen
            ImageAttr.SetColorMatrix(Matrix)

            ' Gamma für das ImageAttribute-Objekt setzen
            ImageAttr.SetGamma(Gamma)

            ' Graphics-Objekt von NewBmp erstellen
            Using NewBmpGra As Graphics = Graphics.FromImage(NewBmp)

                ' InBitmap in das Graphics-Objekt zeichnen
                NewBmpGra.DrawImage(InBitmap, New Rectangle(0, 0, _
                    InBitmap.Width, InBitmap.Height), 0, 0, _
                    InBitmap.Width, InBitmap.Height, _
                    GraphicsUnit.Pixel, ImageAttr)

                'Graphics-Objekt löschen
            End Using

            ' ImageAttribute-Objekt löschen
        End Using

        Return NewBmp
    End Function

    Private Sub ChangeParam()
        ' Ist ein Bild in der PictureBox vorhanden?
        If Not PictureBox2.Image Is Nothing Then
            ' Bild löschen  
            PictureBox2.Image.Dispose()
        End If

        PictureBox2.Image = SetBrightnessContrastGamma( _
            CType(PictureBox1.Image, Bitmap), _
            CSng(HScrollBar1.Value / 100), _
            CSng(HScrollBar2.Value / 100), _
            CSng(HScrollBar3.Value / 1000))
    End Sub

    Private Sub Form1_Load(ByVal sender As Object, _
        ByVal e As System.EventArgs) Handles Me.Load

        ' Bild aus der Ressource laden und anzeigen
        PictureBox1.Image = My.Resources.City005
        PictureBox2.Image = My.Resources.City005
    End Sub

    Private Sub HScrollBar1_Scroll( _
        ByVal sender As System.Object, _
        ByVal e As System.Windows.Forms.ScrollEventArgs) _
        Handles HScrollBar1.Scroll

        ChangeParam()
    End Sub

    Private Sub HScrollBar2_Scroll( _
        ByVal sender As System.Object, _
        ByVal e As System.Windows.Forms.ScrollEventArgs) _
        Handles HScrollBar2.Scroll

        ChangeParam()
    End Sub

    Private Sub HScrollBar3_Scroll( _
        ByVal sender As System.Object, _
        ByVal e As System.Windows.Forms.ScrollEventArgs) _
        Handles HScrollBar3.Scroll

        ChangeParam()
    End Sub
End Class

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Da ist ein Fehler im Code - Sirrus 07.09.15 16:47 8 Antworten

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 1 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Jürgen am 04.12.2010 um 13:42

Mit dem Bild aus den Resourcen geht das gut.
Wenn ich aber aus Bilder lade und in die Boxen gebe, functioniert der Code nicht mehr.
Dim bmp as new bitmap(Datei)
Picutrebox.image = bmp

Ist sicher nur eine Kleinigkeit.
Komme aber nicht drauf :-(