[窗体部分]Private Sub Form_Load() Dim tBytes() As Byte Dim tBitMap As tpBitMapHeader tBytes() = BytesGetByFile("tactic06.wav") '原文件。读原文件为字节数组。 tBitMap = BitMapGetByBytes(tBytes()) '根据字节数组生成一个文件头。 '写图象文件。 Open "SYOUT.BMP" For Binary As #1 '目的图象文件 Put #1, 1, tBitMap Put #1, LenB(tBitMap) + 1, tBytes() Close #1 Text1.Text = LenB(tBitMap.bhInfoHeader) ' UBound(tBytes()) End Sub[模块部分]Public Type tpBitMapFileHeader bfType As Integer bfSize As Long bfReserved1 As Integer bfReserved2 As Integer bfOffBits As Long End TypePublic Type tpBitMapInfoHeader 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 TypeFunction BitMapGetByBytes(ByRef pBytes() As Byte, Optional ByVal pWidth As Long = 800) As tpBitMapHeader Dim tOutAny As tpBitMapHeader
Dim tOffByte As Long
tOffByte = UBound(pBytes)
tOutAny = BitMapGetBySpace(pWidth)
With tOutAny.bhFileHeader .bfSize = LenB(tOutAny) + tOffByte + 1 End With
With tOutAny.bhInfoHeader .biHeight = tOffByte \ .biWidth \ 3 End With
BitMapGetByBytes = tOutAny End FunctionFunction BitMapGetBySpace(Optional ByVal pWidth As Long = 800) As tpBitMapHeader Dim tOutAny As tpBitMapHeader
With tOutAny.bhFileHeader .bfType = &H4D42 .bfSize = LenB(tOutAny) .bfReserved1 = 0 .bfReserved2 = 0 .bfOffBits = LenB(tOutAny) End With
不知道您在编程后有没有调试啊,KiteGirl(小仙妹) 程序报错,Function BitMapGetByBytes(ByRef pBytes() As Byte, Optional ByVal pWidth As Long = 800) As tpBitMapHeader一句,错误为 类型未定义
另外,再请教一点:怎样处理汉字问题?它的ASCII代码不在 0~127 之内,也不在0~255之内
错误是由于缺少一个类型定义引起的,因为这段程序是在我一个已经完成的大程序里裁出来的,所以缺少了一个定义。在如下定义部分后面:Public Type tpBitMapFileHeader bfType As Integer bfSize As Long bfReserved1 As Integer bfReserved2 As Integer bfOffBits As Long End TypePublic Type tpBitMapInfoHeader 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补充如下定义:Public Type tpBitMapHeader bhFileHeader As tpBitMapFileHeader bhInfoHeader As tpBitMapInfoHeader End Type在VB里,无论汉字还是英文都是双字节的,用MidB函数可以取绝对的字节内容。 OutByte=AscB(MidB(tString,tIndex,1))另外,你还可以问问别人StrConv函数怎么用。这个函数可以把字符串和数组之间进行转换,而且速度很快。但是我并不习惯这么用,尽管这个方法很不错。对于任何文件,你不用考虑它是不是文本文件,只要当做Byte数组处理就好了。加密的时候一切文件对你来说是“256进制”数字而不具备任何意义,记得对于电脑来说,你的文字、图片、音乐都是数字。电脑里其实没有别的,只有数字。最后警告你:将文件变成图片后编码成JPG会造成文件信息的丢失。因为编码过程不是针对字节也不是针对像素,而是针对“信号”(更类似一种波的形式)。“不失真”的JPG仅仅是视觉上来说的,对于数学那仅仅是近似值。比如说会有类似2和3,5和6这样轻微的差距。在图象领域是可以接受的,但是对于数据是不能接受的。而且,图象专用的压缩算法并不是针对其他数据的。所以,你将数据作为图象以图象方法压缩效果很不好。我曾经采用图象字节的低位Bit加载数据,实验过用JPG传递。但是最后要把“载荷”放大很多倍,否则解码之后失真很大。即使这样,JPG压缩后的压缩比很差,远远不如把位图作为ZIP压缩效果好。我和你一样研究过用图象加密信息,但是最后总结是这样的:图象仅仅可以作为一种传递的介质,这种特殊介质的价值在于不容易引人注意。但缺点是非常多的,尤其是你要用很高的空间代价去传递信息。对于专业的截获者来说,通过分析的方法可以很容易辨认出哪些图象可能加载有额外的信息。因为加载信息的图片经过数学分析之后会有很明显的破绽(比如滤波),相对于位图的自然特征是很容易被察觉的。尽管如此,图象加载信息还是有一些特殊用途。比如发给你的女友一张电子贺卡,通过这种特殊方式传递你的密语也是一种有趣的方式。另外,我还发现一种更有趣的隐蔽办法:多维直方图空间法,但是这个办法浪费的空间代价太大。
Y坐标 / screen.TwipsPerPixelY
23 42 12 23 45 12 23 75 34
2A 4D 6F C2 43 10 00 00 12
C9 86 12 00 12 12 3C F4 E8内存数据:23 42 12 23 45 12 23 75 34 2A 4D 6F C2 43 10 00 00 12 C9 86 12 00 12 12 3C F4 E8对于电脑来说,图象不是二维数组而是一维数组。除非你的宽度不等于图象的宽度。比如上面的例子,你把3*N的点阵画在X*N的点阵里(X>3)。即使这样,一个扫描线上依旧原样保留了数据的片段,该片段的长度就是图象的宽度。这几乎和不加密没什么区别。在电脑里,无论是图象还是音乐、文字都是数据。不会因为你把信息作为图象就有什么区别。有一个办法是将信息分解成Bit隐藏在每个图象文件每个Byte的最后一位,一个图象用这种方式可以隐藏的信息数量是(Hight*Width)/位平面数/8。这个办法据说曾经被拉登用来传递密文,并且在图象学专著里有详细的记载。我做过关于该方法的一些程序。如果你确实有兴趣把数据作为图象,那是很容易的。只要根据固定宽度计算出该数据文件的扫描线数(高度),然后将宽度和高度数据写入位图文件头,接着将数据文件的字节作为位图矩阵数据就可以了。非常简单。但是这样根本无法加密。如果你确实有兴趣,我可以抽点时间写个足够说明问题的程序给你。我在位图数据方面比较擅长一些。
图象的安全性嘛....可以先进行异或运算.其实我的意思是,加密后,一般人(没有进行专门高等训练或学习)并不会在意一幅图满乱点的图片.
进一步把bmp图象转换成没有失真的jpg图象也是一种好方法.另外,还是请高手给出完整的代码喔...先谢了!!
BitMapInfoHeader '图象信息头部
BitMapBytes '位图矩阵数据(Byte数组)把一个文件直接“变”成位图,那是特别简单的。1、把文件读为Byte数组。2、在内存中建立一个位图。定义位图的属性(色深、面数等等),尤其是宽度。3、将文件数组作为位图矩阵数据。4、计算位图高度,并写到BitMapInfoHeader。高度=(文件数组字节长度)/(宽度*(位数/8))5、写位图文件。具体代码梢后完成。
Dim tBytes() As Byte
Dim tBitMap As tpBitMapHeader
tBytes() = BytesGetByFile("tactic06.wav") '原文件。读原文件为字节数组。
tBitMap = BitMapGetByBytes(tBytes()) '根据字节数组生成一个文件头。
'写图象文件。
Open "SYOUT.BMP" For Binary As #1 '目的图象文件
Put #1, 1, tBitMap
Put #1, LenB(tBitMap) + 1, tBytes()
Close #1
Text1.Text = LenB(tBitMap.bhInfoHeader) ' UBound(tBytes())
End Sub[模块部分]Public Type tpBitMapFileHeader
bfType As Integer
bfSize As Long
bfReserved1 As Integer
bfReserved2 As Integer
bfOffBits As Long
End TypePublic Type tpBitMapInfoHeader
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 TypeFunction BitMapGetByBytes(ByRef pBytes() As Byte, Optional ByVal pWidth As Long = 800) As tpBitMapHeader
Dim tOutAny As tpBitMapHeader
Dim tOffByte As Long
tOffByte = UBound(pBytes)
tOutAny = BitMapGetBySpace(pWidth)
With tOutAny.bhFileHeader
.bfSize = LenB(tOutAny) + tOffByte + 1
End With
With tOutAny.bhInfoHeader
.biHeight = tOffByte \ .biWidth \ 3
End With
BitMapGetByBytes = tOutAny
End FunctionFunction BitMapGetBySpace(Optional ByVal pWidth As Long = 800) As tpBitMapHeader
Dim tOutAny As tpBitMapHeader
With tOutAny.bhFileHeader
.bfType = &H4D42
.bfSize = LenB(tOutAny)
.bfReserved1 = 0
.bfReserved2 = 0
.bfOffBits = LenB(tOutAny)
End With
With tOutAny.bhInfoHeader
.biBitCount = 24
.biClrImportant = 0
.biClrUsed = 0
.biCompression = 0
.biHeight = 0
.biPlanes = 1
.biSize = 40
.biSizeImage = 0
.biWidth = pWidth
.biXPelsPerMeter = 0
.biYPelsPerMeter = 0
End With
BitMapGetBySpace = tOutAny
End FunctionFunction BytesGetByFile(ByVal pFileName As String) As Byte()
Dim tOutBytes() As Byte
Dim tFileNumber As Integer
Dim tOffByte As Long
tFileNumber = FreeFile
Open pFileName For Binary As #tFileNumber
tOffByte = LOF(tFileNumber) - 1
ReDim tOutBytes(tOffByte)
Get #tFileNumber, 1, tOutBytes()
Close #tFileNumber
BytesGetByFile = tOutBytes()
End Function
程序报错,Function BitMapGetByBytes(ByRef pBytes() As Byte, Optional ByVal pWidth As Long = 800) As tpBitMapHeader一句,错误为 类型未定义
bfType As Integer
bfSize As Long
bfReserved1 As Integer
bfReserved2 As Integer
bfOffBits As Long
End TypePublic Type tpBitMapInfoHeader
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补充如下定义:Public Type tpBitMapHeader
bhFileHeader As tpBitMapFileHeader
bhInfoHeader As tpBitMapInfoHeader
End Type在VB里,无论汉字还是英文都是双字节的,用MidB函数可以取绝对的字节内容。
OutByte=AscB(MidB(tString,tIndex,1))另外,你还可以问问别人StrConv函数怎么用。这个函数可以把字符串和数组之间进行转换,而且速度很快。但是我并不习惯这么用,尽管这个方法很不错。对于任何文件,你不用考虑它是不是文本文件,只要当做Byte数组处理就好了。加密的时候一切文件对你来说是“256进制”数字而不具备任何意义,记得对于电脑来说,你的文字、图片、音乐都是数字。电脑里其实没有别的,只有数字。最后警告你:将文件变成图片后编码成JPG会造成文件信息的丢失。因为编码过程不是针对字节也不是针对像素,而是针对“信号”(更类似一种波的形式)。“不失真”的JPG仅仅是视觉上来说的,对于数学那仅仅是近似值。比如说会有类似2和3,5和6这样轻微的差距。在图象领域是可以接受的,但是对于数据是不能接受的。而且,图象专用的压缩算法并不是针对其他数据的。所以,你将数据作为图象以图象方法压缩效果很不好。我曾经采用图象字节的低位Bit加载数据,实验过用JPG传递。但是最后要把“载荷”放大很多倍,否则解码之后失真很大。即使这样,JPG压缩后的压缩比很差,远远不如把位图作为ZIP压缩效果好。我和你一样研究过用图象加密信息,但是最后总结是这样的:图象仅仅可以作为一种传递的介质,这种特殊介质的价值在于不容易引人注意。但缺点是非常多的,尤其是你要用很高的空间代价去传递信息。对于专业的截获者来说,通过分析的方法可以很容易辨认出哪些图象可能加载有额外的信息。因为加载信息的图片经过数学分析之后会有很明显的破绽(比如滤波),相对于位图的自然特征是很容易被察觉的。尽管如此,图象加载信息还是有一些特殊用途。比如发给你的女友一张电子贺卡,通过这种特殊方式传递你的密语也是一种有趣的方式。另外,我还发现一种更有趣的隐蔽办法:多维直方图空间法,但是这个办法浪费的空间代价太大。