二进制字符串先转为16进制字符串比较方便,每4位分组,按下表转换为16进制 0000 0 0001 1 0010 2 0011 3 0100 4 0101 5 0110 6 0111 7 1000 8 1001 9 1010 A 1011 B 1100 C 1101 D 1110 E 1111 F
哦 我那个是随手打的 是这个程序求得的 Public Sub CreateART() Dim R As Long, G As Long, B As Long, x As Long, y As Long Dim rR As Single, rG As Single, rB As Single Dim L As Long, Max As Single, Min As Single, s As String Dim N As Single, GD() As Integer CancelDraw = False ResetDraw = False ImageFrm.Pic.ScaleMode = vbPixels ReDim GD(0 To ImageFrm.Pic.ScaleWidth - 1, 0 To ImageFrm.Pic.ScaleHeight - 1) For y = 0 To ImageFrm.Pic.ScaleHeight - 1 For x = 0 To ImageFrm.Pic.ScaleWidth - 1 '扫描所有像 L = ImageFrm.Pic.Point(x, y) R = L And 256 G = L And 65280 B = L And 16711680 rR = R / 255: rG = G / 255: rB = B / 255 Max = Maximum(rR, rG, rB) Min = Minimum(rR, rG, rB) N = (Max + Min) / 2 If N <= 0.5 Then GD(x, y) = 0 Else GD(x, y) = 1 End If Next x Next y
'看看下面的算法吧,没测试过 Private Sub Command1_Click()Dim GD(0 To 99, 0 To 99) As Integer Dim result() As Byte Dim bytResult As Byte Dim lngRank As Long'先求出原始矩阵的秩 lngRank = UBound(GD, 1) - LBound(GD, 1) + 1 lngRank = lngRank * (UBound(GD, 2) - LBound(GD, 2) + 1)'判断秩是不是8的倍数 If (lngRank Mod 8) <> 0 Then ReDim result(0 To CLng(lngRank \ 8)) Else ReDim result(0 To CLng(lngRank \ 8) - 1) End IfDim i As Long, j As Long, k As LongDim m As Integerj = 0: k = 0For i = LBound(result) To UBound(result) bytResult = 0
For m = 0 To 7 bytResult = bytResult + GD(j, k) * 2 ^ m k = k + 1
If k > UBound(GD, 2) Then '如果超过了列数,则指向下一行
k = 0 j = j + 1: If j > UBound(GD, 1) Then Exit For End If Next result(i) = bytResult Next End Sub
是二进制数据(VB中一般用Byte数组来存储二进制数据)
还是保存"0"或"1"的字符串数组,数组元素是字符串吗?
我看你写了三行,每行13位二进制,是什么意思?
0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 8
1001 9
1010 A
1011 B
1100 C
1101 D
1110 E
1111 F
Public Sub CreateART()
Dim R As Long, G As Long, B As Long, x As Long, y As Long
Dim rR As Single, rG As Single, rB As Single
Dim L As Long, Max As Single, Min As Single, s As String
Dim N As Single, GD() As Integer
CancelDraw = False
ResetDraw = False
ImageFrm.Pic.ScaleMode = vbPixels
ReDim GD(0 To ImageFrm.Pic.ScaleWidth - 1, 0 To ImageFrm.Pic.ScaleHeight - 1)
For y = 0 To ImageFrm.Pic.ScaleHeight - 1
For x = 0 To ImageFrm.Pic.ScaleWidth - 1 '扫描所有像
L = ImageFrm.Pic.Point(x, y)
R = L And 256
G = L And 65280
B = L And 16711680
rR = R / 255: rG = G / 255: rB = B / 255
Max = Maximum(rR, rG, rB)
Min = Minimum(rR, rG, rB)
N = (Max + Min) / 2
If N <= 0.5 Then
GD(x, y) = 0
Else
GD(x, y) = 1
End If
Next x
Next y
定义一个整数N
判断第一位,如果是0,什么也不做,如果是1,N+128
第二位,N+64
三N+32
四N+16
五N+8
六N+4
七N+2
八N+1
最后得到的N就是这8位对应的数值(也不是10进制,计算机里的数都是二进制,但用CStr()函数转换为字符串就是十进制了)
好 这是另一个问题了 呵呵 我太笨了 一点都不会
恩我去试试看 8位一读 读取字符串是不是用MID()啊
Private Sub Command1_Click()Dim GD(0 To 99, 0 To 99) As Integer
Dim result() As Byte
Dim bytResult As Byte
Dim lngRank As Long'先求出原始矩阵的秩
lngRank = UBound(GD, 1) - LBound(GD, 1) + 1
lngRank = lngRank * (UBound(GD, 2) - LBound(GD, 2) + 1)'判断秩是不是8的倍数
If (lngRank Mod 8) <> 0 Then
ReDim result(0 To CLng(lngRank \ 8))
Else
ReDim result(0 To CLng(lngRank \ 8) - 1)
End IfDim i As Long, j As Long, k As LongDim m As Integerj = 0: k = 0For i = LBound(result) To UBound(result) bytResult = 0
For m = 0 To 7
bytResult = bytResult + GD(j, k) * 2 ^ m
k = k + 1
If k > UBound(GD, 2) Then '如果超过了列数,则指向下一行
k = 0
j = j + 1: If j > UBound(GD, 1) Then Exit For
End If
Next result(i) = bytResult
Next
End Sub