وظيفة السطوع / التعرض مع VB .NET
-
13-09-2019 - |
سؤال
أقوم بإجراء محرر صور بسيط في 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.