2009-08-13 3 views
3

Я делаю простой редактор изображений в VB.NET, и одна из функций - яркость/экспозиция.Яркость/экспозиция с vb .net

это, как я это делаю:

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 

где 2 является яркость, которая делает его в два раза ярче.

Только проблема в том, что это не работает хорошо, потому что он делает это, но занимает около 30 секунд! Что я делаю неправильно? есть ли лучший способ его реализовать?

Благодаря

ответ

2

Вы можете использовать ColorMatrix и ImageAttributes сделать это намного быстрее. Вот как это делается:

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

Используя следующие примеры, это должно быть довольно легко собрать проект, который изменяет яркость/контрастность и другие характеристики изображения.

вот пример использования ColorMatrix, чтобы иметь возможность изменить изображение, оно должно быть намного быстрее:

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

и вот пример делает яркость и контрастность в то же время:

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

другой пример использования в ColorMatrix:

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

и для справки на ColorMatrix:

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