7,763
社区成员
发帖
与我相关
我的任务
分享
Option Explicit
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function GetCurrentObject Lib "gdi32" (ByVal hdc As Long, ByVal uObjectType As Long) As Long
Private Declare Function GetDIBits Lib "gdi32" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BitMapInfo, ByVal wUsage As Long) As Long
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Private Declare Function SetDIBitsToDevice Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal dx As Long, ByVal dy As Long, ByVal SrcX As Long, ByVal SrcY As Long, ByVal Scan As Long, ByVal NumScans As Long, Bits As Any, BitsInfo As BitMapInfo, ByVal wUsage As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)
Private Declare Function SendMessagebyString Lib "user32" Alias "SendMessageA" (ByVal hWND As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
'过程中用到的全局变量:
Const Bits As Long = 24 '颜色深度,这里把所有图像都按照32位来处理
Dim ColVal() As Byte '用于存放从DIB输入的像素值
Dim InPutHei As Long '用于记录输入图像的高度
Dim InPutWid As Long '用于记录输入图像的宽度
Dim bi24BitInfo As BitMapInfo '定义BMP信息
Dim ColLong() As String '长整形颜色值
Dim OutPutWid As Single
Dim OutPutHei As Single
'数据结构定义:
Private Type BitMapInfoHeader '文件信息头--BITMAPINFOHEADER
biSize As Long
biWidth As Long
biHeight As Long
biPlanes As Integer
biBitCount As Integer
biCompression As Long
biSizeImage As Long
biXPelsPerMeter As Long
biYPelsPerMeter As Long
biClrUsed As Long
biClrImportant As Long
End Type
Private Type RGBQuad
rgbRed As Byte
rgbGreen As Byte
rgbBlue As Byte
'rgbReserved As Byte
End Type
Private Type BitMapInfo
bmiHeader As BitMapInfoHeader
bmiColors As RGBQuad
End Type
Private Sub Command1_Click()
Dim ACount(16777215) As Long '16777215是RGB的长整数型上限数值
Dim OnlyRGB() As String
Dim X As Single, Y As Single, I As Long
Dim z As Single, zz As Single
Dim RGBs As Long
Text1.Text = ""
DibGet Picture1.hdc, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight
OutPutWid = Picture1.ScaleWidth
OutPutHei = Picture1.ScaleHeight
ReDim ColLong(OutPutWid, OutPutHei) '把R,G,B组合并转换成长整数型
For X = 0 To OutPutWid - 1
For Y = 0 To OutPutHei
RGBs = RGB(CByte(ColVal(2, X, Y)), CByte(ColVal(1, X, Y)), CByte(ColVal(0, X, Y)))
ColLong(X, Y) = String(8 - Len(CStr(RGBs)), "0") & RGBs
Next
Next
For X = 0 To OutPutWid - 1 '开始统计。原理是 遍历RGB的长整数型数组,若色值出现,则ACount(色值)数组的值 + 1
For Y = 0 To OutPutHei '下一步只需遍历ACount数组,元素的值代表色值出现的次数。
ACount(ColLong(X, Y)) = ACount(ColLong(X, Y)) + 1
Next
Next
ReDim OnlyRGB(10 - 1) '此处是待选取唯一颜色值的 个数。暂定10个
z = 0
'循环ACount数组,就能知道色值出现的次数。
For I = 16777215 To 0 Step -1 '倒序是应为喜欢选取亮色。心情设定 ^-^
If ACount(I) = 1 Then '根据需要选取出现规定次数的色值。此处选择出现 1 次
OnlyRGB(z) = String(8 - Len(CStr(I)), "0") & I '把长短不一的RGB的长整数型值统一前边补0,变成8位
If z = 10 - 1 Then Exit For '此处是待选取唯一颜色值的 个数。暂定 10 个
z = z + 1
End If
DoEvents
Next
If (CStr(Join(OnlyRGB, ""))) = "" Then
Text1.Text = "出现1次的颜色只有 0 个"
Else
Do
For X = 0 To OutPutWid - 1
For Y = 1 To OutPutHei
If OnlyRGB(zz) = ColLong(X, Y) Then
Text1.Text = String(6 - Len(Hex$(ColLong(X, Y))), "0") & Hex$(ColLong(X, Y)) & vbTab & X & "," & OutPutHei - Y & vbCrLf & Text1.Text
X = 0: Y = 0: zz = zz + 1
If zz = 10 Then Exit Sub
GoTo line1
End If
Next
DoEvents
Next
line1:
Loop 'until
End If
End Sub
Private Sub Picture1_Click()
Picture1.Picture = LoadPicture(App.Path & "\123.bmp")
End Sub
'获取像素
Private Sub DibGet(ByVal IdSource As Long, XBegin As Long, ByVal YBegin As Long, ByVal XEnd As Long, ByVal YEnd As Long)
Dim iBitmap As Long
Dim InPutWid As Long, InPutHei As Long
Dim iDC As Long, I As Long, W As Long, H As Long
On Error GoTo ErrLine
InPutWid = XEnd - XBegin
InPutHei = YEnd - YBegin
W = InPutWid + 1
H = InPutHei + 1
I = (Bits \ 8) - 1
ReDim ColVal(I, InPutWid, InPutHei)
With bi24BitInfo.bmiHeader
.biBitCount = Bits
.biCompression = 0&
.biPlanes = 1
.biSize = Len(bi24BitInfo.bmiHeader)
.biWidth = W
.biHeight = H
End With
iBitmap = GetCurrentObject(IdSource, 7&)
GetDIBits IdSource, iBitmap, 0&, H, ColVal(0, 0, 0), bi24BitInfo, 0&
DeleteObject iBitmap
Exit Sub
ErrLine:
MsgBox "错误号:" & Err.Number & ":" & Err.Description
End Sub
iBitmap = GetCurrentObject(IdSource, 7&)
GetDIBits IdSource, iBitmap, 0&, H, ColVal(0, 0, 0), bi24BitInfo, 0&
DeleteObject iBitmap