VB.NET-Tipp 0063: Helligkeit, Kontrast und Gamma eines Bildes ändern
von Frank Schüler
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: | 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: |
' 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.
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 :-(