Private Sub TransformImage(ByVal from_picture As _
PictureBox, ByVal to_picture As PictureBox, ByVal _
to_color As OLE_COLOR, ByVal target_mostly As _
MostlyEnum)
Dim bitmap_info As BITMAPINFO
Dim pixels() As Byte
Dim bytes_per_scanLine As Integer
Dim pad_per_scanLine As Integer
Dim X As Integer
Dim Y As Integer
Dim pixel_mostly As MostlyEnum
Dim to_red As Byte
Dim to_green As Byte
Dim to_blue As Byte
' Prepare the bitmap description.
With bitmap_info.bmiHeader
.biSize = 40
.biWidth = from_picture.ScaleWidth
' Use negative height to scan top-down.
.biHeight = -from_picture.ScaleHeight
.biPlanes = 1
.biBitCount = 32
.biCompression = BI_RGB
bytes_per_scanLine = ((((.biWidth * .biBitCount) + _
31) \ 32) * 4)
pad_per_scanLine = bytes_per_scanLine - (((.biWidth _
_
* .biBitCount) + 7) \ 8)
.biSizeImage = bytes_per_scanLine * Abs(.biHeight)
End With
' Load the bitmap's data.
ReDim pixels(1 To 4, 1 To from_picture.ScaleWidth, 1 To _
_
from_picture.ScaleHeight)
GetDIBits from_picture.hdc, from_picture.Image, _
0, from_picture.ScaleHeight, pixels(1, 1, 1), _
bitmap_info, DIB_RGB_COLORS
' Get to_color's red, green, and blue components.
UnRGB to_color, to_red, to_green, to_blue
' Modify the pixels.
For Y = 1 To from_picture.ScaleHeight
For X = 1 To from_picture.ScaleWidth
' See if this pixel is mostly
' red, green, or blue.
If pixels(pixR, X, Y) > pixels(pixG, X, Y) And _
pixels(pixR, X, Y) > pixels(pixB, X, Y) _
Then
pixel_mostly = mostly_Red
ElseIf pixels(pixG, X, Y) > pixels(pixR, X, Y) _
And _
pixels(pixG, X, Y) > pixels(pixB, X, Y) _
Then
pixel_mostly = mostly_Green
ElseIf pixels(pixB, X, Y) > pixels(pixR, X, Y) _
And _
pixels(pixB, X, Y) > pixels(pixG, X, Y) _
Then
pixel_mostly = mostly_Blue
Else
pixel_mostly = mostly_Tied
End If
' See if this is the target color.
If pixel_mostly = target_mostly Then
pixels(pixR, X, Y) = to_red
pixels(pixG, X, Y) = to_green
pixels(pixB, X, Y) = to_blue
End If
Next X
Next Y
' Display the result.
SetDIBits to_picture.hdc, to_picture.Image, _
0, to_picture.ScaleHeight, pixels(1, 1, 1), _
bitmap_info, DIB_RGB_COLORS
to_picture.Picture = to_picture.Image
End Sub
|