Функция яркости/экспозиции с 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 секунд! Что я делаю не так? есть ли лучший способ реализовать это?

Спасибо


person jmasterx    schedule 13.08.2009    source источник


Ответы (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
person xpda    schedule 13.08.2009

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

вот пример использования 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

person John Boker    schedule 13.08.2009