調整圖形的明暗對比

原始來源:MicroSfot Visual Basic5.0 Developer's WorkShop  cww 更改

: :   可否請問一下,我在 VB 中如何將一幅在
: :  PictureBox 中的圖形,調整它的明暗對比?
: :   我想應該是用 API,但試了好久還是沒辦
: : 法!期望您抽空幫我試看看!謝謝!

: 這個問題有些麻煩,因為我也找不到取得或控制明暗、飽和度的api
: 所以我利用松崗 vb5進階程式開發指南 第12章的 RGB<->HSV 來做,
: 可以WORK,但是比較慢,我的方法是:取得每個Pixel的RGB值,將之
: 轉為HSV值(色調、飽和度、明暗),如果調明暗,則依您所需的明暗度去增減
: 明暗值,再將HSV 轉成RGB值,再將這RGB值寫到原來的Pixel上。

'form上有三個物件  pictureBox, Label, Slider
Private Declare Function GetPixel Lib "gdi32"  _
    (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Private Declare Function SetPixelV Lib "gdi32" _
    (ByVal hdc As Long, ByVal x As Long, _
     ByVal y As Long, ByVal crColor As Long) As Long
Private tmpPic As Picture
Private Sub Form_Load()
Picture1.ScaleMode = 3   '設為Pixel
Picture1.AutoRedraw = True  '設定所有Pixel的改變不立即在pictureBox上顯示
Slider1.SelStart = 50
Slider1.Max = 100          '設定Slider範圍由0-100
Slider1.Min = 0
Slider1.TickFrequency = 10
Set tmpPic = Picture1.Picture
End Sub
Private Sub Slider1_Change()
Dim rr As New RGB
Dim hh As New HVS
Dim width5  As Long, heigh5 As Long, rgb5 As Long
Dim hdc5 As Long, i As Long, j As Long
width5 = Picture1.ScaleWidth
heigh5 = Picture1.ScaleHeight
hdc5 = Picture1.hdc
Label1.Caption = "running"
DoEvents
For i = 1 To width5
   For j = 1 To heigh5
       rgb5 = GetPixel(hdc5, i, j)
       rr.Color = rgb5
       hh.Blue = rr.Blue
       hh.Red = rr.Red
       hh.Green = rr.Green
       hh.ToHsv
       hh.Value = hh.Value + (Slider1.Value - 50)  '設定明暗增減值
       If hh.Value > 100 Then  '明暗值介於0-100之間
          hh.Value = 100
       Else
          If hh.Value < 0 Then
             hh.Value = 0
          End If
       End If
       hh.ToRgb
       rgb5 = RGB(hh.Red, hh.Green, hh.Blue)
       SetPixelV hdc5, i, j, rgb5
   Next j
 Next i
 Label1.Caption = "OK"
 Set Picture1.Picture = Picture1.Image  '此時才真正顯示Picture
 End Sub
'RGB.CLS
   Option Explicit

   Private mlColor As Long

   '~~~Color
   Property Let Color(lColor As Long)
       mlColor = lColor
   End Property

   '~~~Red
   Property Get Red() As Byte
       Red = mlColor And &HFF
   End Property

   '~~~Green
   Property Get Green() As Byte
       Green = (mlColor \ &H100) And &HFF
   End Property

   '~~~Blue
   Property Get Blue() As Byte
       Blue = (mlColor \ &H10000) And &HFF
   End Property


'HSV.CLS
   Option Explicit

   '~~~RGB color properties
   Public Red As Integer
   Public Green As Integer
   Public Blue As Integer

   '~~~HSV color properties
   Public Hue As Single
   Public Saturation As Single
   Public Value As Single

   '~~~Converts RGB to HSV
   Public Sub ToHsv()
       Dim fRed As Single
       Dim fGreen As Single
       Dim fBlue As Single
       Dim fMx As Single
       Dim fMn As Single
       Dim fVa As Single
       Dim fSa As Single
       Dim fRc As Single
       Dim fGc As Single
       Dim fBc As Single
       fRed = Red / 255
       fGreen = Green / 255
       fBlue = Blue / 255
       fMx = fRed
       If fGreen > fMx Then fMx = fGreen
       If fBlue > fMx Then fMx = fBlue
       fMn = fRed
       If fGreen < fMn Then fMn = fGreen
       If fBlue < fMn Then fMn = fBlue
       fVa = fMx
       If fMx Then
           fSa = (fMx - fMn) / fMx
       Else
           fSa = 0
       End If
       If fSa = 0 Then
           Hue = 0
       Else
           fRc = (fMx - fRed) / (fMx - fMn)
           fGc = (fMx - fGreen) / (fMx - fMn)
           fBc = (fMx - fBlue) / (fMx - fMn)
           Select Case fMx
           Case fRed
               Hue = fBc - fGc
           Case fGreen
               Hue = 2 + fRc - fBc
           Case fBlue
               Hue = 4 + fGc - fRc
           End Select
           Hue = Hue * 60
           If Hue < 0 Then Hue = Hue + 360
       End If
       Saturation = fSa * 100
       Value = fVa * 100
   End Sub

   '~~~Converts HSV to RGB
   Public Sub ToRgb()
       Dim fSaturation As Single
       Dim fValue As Single
       Dim fHue As Single
       Dim nI As Integer
       Dim fF As Single
       Dim fP As Single
       Dim fQ As Single
       Dim fT As Single
       Dim fRed As Single
       Dim fGreen As Single
       Dim fBlue As Single
       fSaturation = Saturation / 100
       fValue = Value / 100
       If Saturation = 0 Then
           fRed = fValue
           fGreen = fValue
           fBlue = fValue
       Else
           fHue = Hue / 60
           If fHue = 6 Then fHue = 0
           nI = Int(fHue)
           fF = fHue - nI
           fP = fValue * (1 - fSaturation)
           fQ = fValue * (1 - (fSaturation * fF))
           fT = fValue * (1 - (fSaturation * (1 - fF)))
           Select Case nI
           Case 0
               fRed = fValue
               fGreen = fT
               fBlue = fP
           Case 1
               fRed = fQ
               fGreen = fValue
               fBlue = fP
           Case 2
               fRed = fP
               fGreen = fValue
               fBlue = fT
           Case 3
               fRed = fP
               fGreen = fQ
               fBlue = fValue
           Case 4
               fRed = fT
               fGreen = fP
               fBlue = fValue
           Case 5
               fRed = fValue
               fGreen = fP
               fBlue = fQ
           End Select
       End If
       Red = Int(255.9999 * fRed)
       Green = Int(255.9999 * fGreen)
       Blue = Int(255.9999 * fBlue)
   End Sub