調整圖形的明暗對比 原始來源: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
|