2009-08-13 9 views
3

Je crée un simple éditeur d'image dans VB.NET, et l'une de ses fonctions est la luminosité/l'exposition.Fonction luminosité/exposition avec vb .net

Voilà comment je fais:

For i = 0 To img.Width - 1 
    For j = 0 To img.Height - 1 
     Dim s As Color = img.GetPixel(i, j) 

     Dim r As Integer = s.R * 2 
     Dim g As Integer = s.G * 2 
     Dim b As Integer = s.B * 2 
     If s.R * 2 > 255 Then 
      r = 255 
     End If 

     If s.G * 2 > 255 Then 
      g = 255 
     End If 
     If s.B * 2 > 255 Then 
      b = 255 
     End If 
     Dim x As Color = Color.FromArgb(255, r, g, b) 
     img.SetPixel(i, j, x) 

    Next 
Next 

où 2 est la luminosité qui le rend deux fois plus brillant.

Seul le problème est que cela ne semble pas fonctionner parce qu'il le fait, mais prend environ 30 secondes! Qu'est-ce que je fais de mal? Y a-t-il une meilleure façon de le mettre en œuvre?

Merci

Répondre

2

Vous pouvez utiliser un ColorMatrix et ImageAttributes de le faire beaucoup plus rapidement. Voici comment:

Imports System.Drawing.Imaging 

Public Class Form1 

Dim g As Graphics 
Dim img As Image 
Dim r As Rectangle 

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    ' load photo file into picture box and initialize graphics 
    img = Image.FromFile("c:\tmp.jpg") 
    PictureBox1.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height, PixelFormat.Format32bppArgb) 
    g = Graphics.FromImage(PictureBox1.Image) 
    r = New Rectangle(0, 0, PictureBox1.Width, PictureBox1.Height) 
    g.DrawImage(img, r) 
End Sub 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    Call setBrightness(0.2) 
End Sub 

Sub setBrightness(ByVal Brightness As Single) 
    ' Brightness should be -1 (black) to 0 (neutral) to 1 (white) 

    Dim colorMatrixVal As Single()() = { _ 
    New Single() {1, 0, 0, 0, 0}, _ 
    New Single() {0, 1, 0, 0, 0}, _ 
    New Single() {0, 0, 1, 0, 0}, _ 
    New Single() {0, 0, 0, 1, 0}, _ 
    New Single() {Brightness, Brightness, Brightness, 0, 1}} 

    Dim colorMatrix As New ColorMatrix(colorMatrixVal) 
    Dim ia As New ImageAttributes 

    ia.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap) 

    g.DrawImage(img, r, 0, 0, img.Width, img.Height, GraphicsUnit.Pixel, ia) 
    PictureBox1.Refresh() 
End Sub 

End Class 
1

En utilisant les exemples suivants, il devrait être assez facile à mettre en place un projet qui change la luminosité/contraste et d'autres caractéristiques des images.

voici un exemple d'utiliser un ColorMatrix pour être en mesure de changer une image, il devrait être beaucoup plus rapide:

http://www.developerfusion.com/forum/thread/35125/

et voici un exemple de faire luminosité et le contraste en même temps:

http://www.codeproject.com/KB/graphics/multiple_color_matrices.aspx

un autre exemple d'utiliser un ColorMatrix:

http://www.codeproject.com/KB/GDI-plus/colormatrix.aspx

et référence ColorMatrix:

http://msdn.microsoft.com/en-us/library/ms534063%28VS.85%29.aspx

Questions connexes