سؤال

أقوم بإجراء محرر صور بسيط في 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 ثانية! ما الخطأ الذي افعله؟ هل هناك طريقة أفضل لتنفيذها؟

شكرا

هل كانت مفيدة؟

المحلول

يمكنك استخدام ColorMatrix و ImageIatributes للقيام بذلك بشكل أسرع بكثير. إليك الطريقة:

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

نصائح أخرى

باستخدام الأمثلة التالية، يجب أن يكون من السهل جدا وضع مشروع يغير سطوع / بلون مغاير وغيرها من ميزات الصور.

إليك مثال على استخدام 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top