先读入数据,每三个字节转换成一个象素点,再限定一个图片的宽度,最后依次画点.这样,即可以把数据转化成图象.问题是,如何实现最后一步,即画点?VB中坐标单位不是象素,画点时往往四五个点重叠在一起.请各位高手给出代码,编译出程序.多谢

解决方案 »

  1.   

    坐标单位转换成像素X坐标 / screen.TwipsPerPixelX 
    Y坐标 / screen.TwipsPerPixelY 
      

  2.   

    这种办法并不能加密,这样画出的图象在内存里几乎就是数据的原貌。原数据: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*3
    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。这个办法据说曾经被拉登用来传递密文,并且在图象学专著里有详细的记载。我做过关于该方法的一些程序。如果你确实有兴趣把数据作为图象,那是很容易的。只要根据固定宽度计算出该数据文件的扫描线数(高度),然后将宽度和高度数据写入位图文件头,接着将数据文件的字节作为位图矩阵数据就可以了。非常简单。但是这样根本无法加密。如果你确实有兴趣,我可以抽点时间写个足够说明问题的程序给你。我在位图数据方面比较擅长一些。
      

  3.   

    Agree with KiteGirl(小仙妹).这种“加密”对于任何有心解密的人来说是完全没用的呀。除非做一个图片出来,然后用某种算法嵌个水印进去,把水印当做加密的原文似乎还有一点点作用。毕竟大家对数字水印了解相对少些。
      

  4.   

    关于重复的帖子,我也不知道是怎么一回事.
    图象的安全性嘛....可以先进行异或运算.其实我的意思是,加密后,一般人(没有进行专门高等训练或学习)并不会在意一幅图满乱点的图片.
    进一步把bmp图象转换成没有失真的jpg图象也是一种好方法.另外,还是请高手给出完整的代码喔...先谢了!!
      

  5.   

    BMP的结构是这样的(RGB方式24位):BitMapFileHeader '文件头
    BitMapInfoHeader '图象信息头部
    BitMapBytes      '位图矩阵数据(Byte数组)把一个文件直接“变”成位图,那是特别简单的。1、把文件读为Byte数组。2、在内存中建立一个位图。定义位图的属性(色深、面数等等),尤其是宽度。3、将文件数组作为位图矩阵数据。4、计算位图高度,并写到BitMapInfoHeader。高度=(文件数组字节长度)/(宽度*(位数/8))5、写位图文件。具体代码梢后完成。
      

  6.   

    [窗体部分]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
      
      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
      

  7.   

    从上面的程序你应该可以知道:如果把数据转换成图象方式根本用不到画点也用不到任何画点的语句。因为画点、画线本身就是另一种方式的写数据,在X,Y坐标画一个点其实就是在:字节((Y*Width+X)*色深)/8处写数据。而数据的转换根本不用这种直观的间接方式。除了这种程序,其他的比如把多副图片合成为一副图片的程序也用不着图片显示在窗体或者Picture控件上完成,只要在内存当中进行字节运算就可以了。至于编码成JPG也是以“信号”角度来处理图片,在这个角度,图象仅仅是一种“信号”。上面的程序始终没有在窗体上显示任何图象。
      

  8.   

    不知道您在编程后有没有调试啊,KiteGirl(小仙妹) 
      程序报错,Function BitMapGetByBytes(ByRef pBytes() As Byte, Optional ByVal pWidth As Long = 800) As tpBitMapHeader一句,错误为  类型未定义
      

  9.   

    另外,再请教一点:怎样处理汉字问题?它的ASCII代码不在 0~127 之内,也不在0~255之内
      

  10.   

    错误是由于缺少一个类型定义引起的,因为这段程序是在我一个已经完成的大程序里裁出来的,所以缺少了一个定义。在如下定义部分后面: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压缩效果好。我和你一样研究过用图象加密信息,但是最后总结是这样的:图象仅仅可以作为一种传递的介质,这种特殊介质的价值在于不容易引人注意。但缺点是非常多的,尤其是你要用很高的空间代价去传递信息。对于专业的截获者来说,通过分析的方法可以很容易辨认出哪些图象可能加载有额外的信息。因为加载信息的图片经过数学分析之后会有很明显的破绽(比如滤波),相对于位图的自然特征是很容易被察觉的。尽管如此,图象加载信息还是有一些特殊用途。比如发给你的女友一张电子贺卡,通过这种特殊方式传递你的密语也是一种有趣的方式。另外,我还发现一种更有趣的隐蔽办法:多维直方图空间法,但是这个办法浪费的空间代价太大。