24位的BMP图像的内容保存为字节数组后,怎么显示在其他Picture控件中?小弟我用 SetBitmapBits 显示出来的图像变形了

24位的BMP图像的内容保存为字节数组后,如何显示在其他Picture控件中?我用 SetBitmapBits 显示出来的图像变形了。
我的方法如下:
        Private   Declare   Function   SetBitmapBits   Lib   "gdi32 "   (ByVal   hBitmap   As   Long,   ByVal   dwCount   As   Long,   lpBits   As   Any)   As   Long
        Private   gblByteAry()   As   Byte       '图像文件的内容字节数组

Private   Sub   Form_Load()
        ReDim   gblPicBits(FileLen(App.Path   &   "\test.bmp ")   -   1)
        Open   App.Path   &   "\test.bmp "   For   Binary   As   #1
        Get   #1,   1,   gblByteAry
        Close   #1
End   Sub

Private   Sub   Command1_Click()
        SetBitmapBits   Picture1.Image,   UBound(gblByteAry),   gblByteAry(0)
End   Sub

可是显示出来的图像发生了变形。我测试的图像是24位的BMP,宽和高都是8个像素。

这样做的目的是,我把所有程序需要的图像文件保存在一个我自己定义的二进制文件中,程序中需要图像时,不是用LoadPicture函数,而是从自定义的文件中读取文件内容的字节数组,再显示在Picture控件中。
我可以对图像的内容随意加密,一般人除了截屏,很难用得上我的图像。

找了一天,研究了SetBitmapBits、SetDIBits、OleLoadPicture,还有一个什么什么Device。没有找到好用的代码。
不需要原理,请给出代码。谢谢!

------解决方案--------------------
我只知道原理,没有代码^_^

位图分为DIB与DDB两种,存成文件的都是DIB,因为文件传播必须做到设备无关性。SetBitmapBits是用于设置DDB位图数据的,与显示设备当前的位图格式有关,现在显卡几乎没有24位格式的了,不是16位就是32位,你将DIB数据强行放入DDB,会出问题的。不仅色深格式不对,而且扫描线还是相反的。

以上只是其一,位图文件还会有一个文件头部,而内存DIB是没有文件头部的,二者不能直接Set。

你的设想是可行的,将位图文件合并在一起,需要时用Byte数组加载,然后用OleLoadPicture转成Picture对象,是完全能做到的。至于放弃Bmp头部,直接存DIB数据,用时先CreateDIBSection,再SetDIBits,估计也是可行了,但我没试过,只是猜测。
------解决方案--------------------
看http://topic.****.net/t/20040319/16/2862487.html里我的回复,其中olelib.tlb的下载地址现在已经失效 ,可以尝试从http://www.mvps.org/emorcillo/download/vb6/tl_ole.zip下载

------解决方案--------------------
位图文件会有一个文件信息头部,你这样读取的数据有冗余部分!