http://download.csdn.net/detail/wowfiowow/413719932位可以,24位load和show貌似没问题,可是一操作RGB再显示出来就异常,麻烦会的给找找原因,我想他支持24和32位

解决方案 »

  1.   

        ReDim p(1 To lWidth, 1 To lHeight) As RGBQUAD
    这个定义有问题,在24位模式下不能使用RGBQUAD中的保留字节在24位模式,
    Public Type RGBQUAD                  '只有bibitcount为1,2,4时才有调色板
        Blue As Byte                     '蓝色分量
        Green As Byte                    '绿色分量
        Red As Byte                      '红色分量
        'Reserved As Byte                 '保留值  24位时,不能有这个参数
    End Type但去掉这个参数,你的代码还有问题,会崩溃
      

  2.   

    24位的图像 用这个ReDim p(1 To lWidth, 1 To lHeight) As RGBQUAD(RGBQUAD不包含Reserved 成员时)方式来保存图像数据只有在图像宽度本身是4的倍数时才是正确的,否则都得不到正确的结果,并且可能会导致访问内存错误。
    具体参考:http://www.cnblogs.com/laviewpbt/archive/2009/05/31/1492878.html
      

  3.   

    扫描行需4字节对齐,用多维结构数组取位图数据,当且仅当32位时,才能完全成立!
    建议换成一维Byte数组,或采用32位DIB中转
      

  4.   

    有没有不管byte是24位还是32位图片,也不管是不是宽度是4的倍数都可以读入2维数组的办法???
      

  5.   

    那就先建一个DIB,用Bitblt把图绘入这个DIB,系统会帮你转成32位图
    这只是个习惯问题,多维数组速度上要吃些亏
      

  6.   

    Public Function LoadFromStdPicture(ByRef StdPic As StdPicture, Optional ByVal Bits As Integer = 24)
        Dim mHdc As Long, mPtr As Long, hDc As Long
        
        Erase p
        lWidth = StdPic.Width * 1440 / 2540 / Screen.TwipsPerPixelX
        lHeight = StdPic.Height * 1440 / 2540 / Screen.TwipsPerPixelY
        
        mHdc = CreateCompatibleDC(0)        '创建DIB设备场景
        With bMapinfo.bmiHeader             '位图信息头
            .biSize = Len(bMapinfo.bmiHeader)
            .biPlanes = 1
            .biBitCount = Bits              '24或32
            .biWidth = lWidth
            .biHeight = lHeight
            .biCompression = BI_RGB
            Select Case Bits                '保证每个扫描行必须是4的倍数
                Case 1
                    mWidthBytes = (((.biWidth + 7) \ 8 + 3) And &HFFFFFFFC)
                Case 4
                    mWidthBytes = (((.biWidth + 1) \ 2 + 3) And &HFFFFFFFC)
                Case 8
                    mWidthBytes = ((.biWidth + 3) And &HFFFFFFFC)
                Case 16
                    mWidthBytes = ((.biWidth * 2 + 3) And &HFFFFFFFC)
                Case 24
                    mWidthBytes = ((.biWidth * 3 + 3) And &HFFFFFFFC)
                Case 32
                    mWidthBytes = .biWidth * 4
                Case Else
                    'ERR
            End Select
            .biSizeImage = mWidthBytes * .biHeight
        End With
        mhDib = CreateDIBSection(mHdc, bMapinfo.bmiHeader, DIB_RGB_COLORS, mPtr, 0, 0)  'mPtr就是创建的DIBSECTION的内存地址
        mhOldDib = SelectObject(mHdc, mhDib)
        StdPic.Render mHdc + 0, 0, 0, lWidth + 0, lHeight + 0, 0, StdPic.Height, StdPic.Width, -StdPic.Height, ByVal 0
        
        hDc = GetDC(0)
        ReDim p(1 To lWidth, 1 To lHeight) As RGBQUAD
        'GetDIBits hDc, StdPic.Handle, 0, lHeight, p(1, 1), bMapinfo, DIB_RGB_COLORS
        这里要怎么写?????
        
        SelectObject mHdc, mhOldDib
        DeleteObject mhDib: DeleteObject mHdc: ReleaseDC 0, hDc
    End Function
    帮我看下改的可对?有问题吗?复制那里要怎么写??
      

  7.   

    高手们,就直接帮我改个无论如何都不出问题的把各种位深的stdPicture转入2维数组的调用吧
    我已经百度的头晕了。。
      

  8.   

    LZ的代码这个24位32位问题很容易解决,主要问题在于Gdiplus一直造成系统崩溃,昨晚让我忙活了三个小时,终于找到了解决办法,迟点给你代码,到时候,分数记得要给哦,嘿嘿
      

  9.   

    终于给LZ搞好了,记得给分,嘿嘿
    Command1_Click()使用本代码替代Private Sub Command1_Click()
        Dim PicX As StdPicture
            
        Set p = New Class1
        sUrl = "http://www1.yaoshi.com/TestImageServlet"
        Set XMLHTTP = CreateObject("Msxml2.XMLHTTP")
        XMLHTTP.Open "GET", sUrl, False
        XMLHTTP.send
            
        Dim GUID(3) As Long
        GUID(0) = &H7BF80981      'stdPicture的GUID
        GUID(1) = &H101ABF32
        GUID(2) = &HAA00BB8B
        GUID(3) = &HAB0C3000    Call OleLoadPicture(ByVal ObjPtr(XMLHTTP.responseStream), 0&, 0&, GUID(0), PicX)
        
        p.LoadFromStdPicture PicX, 32
        p.ShowToPicture Picture1(0)
        Set Image1(0) = Picture1(0).image
        XMLHTTP.abort ’应该没有必要
        Set XMLHTTP = Nothing
    End SubDim mPixByte As Long'定义到class1的模块变量中class1中,LoadFromStdPicture使用以下代码替代
    Public Function LoadFromStdPicture(ByRef StdPic As StdPicture, Optional ByVal Bits As Integer = 24)
        Dim mHdc As Long, mBmp As Long
        Dim mLine As Long
        
        Erase p
        lWidth = StdPic.Width * 1440 / 2540 / Screen.TwipsPerPixelX
        lHeight = StdPic.Height * 1440 / 2540 / Screen.TwipsPerPixelY
        
        mHdc = CreateCompatibleDC(0)    With bMapinfo.bmiHeader
            .biSize = Len(bMapinfo.bmiHeader)
            .biWidth = lWidth
            .biHeight = lHeight                             'BMP位图默认的扫描方式是从下到上
            .biPlanes = 1
            .biBitCount = Bits
            mPixByte = Bits / 8
            .biCompression = BI_RGB                         '无压缩
             mWidthBytes = (((lWidth * bMapinfo.bmiHeader.biBitCount) + &H1F) And &HFFFFFFE0) \ &H8
            .biSizeImage = mWidthBytes * lHeight
        End With
        
        ReDim p(1 To lWidth * mPixByte, 1 To lHeight) As Byte
        mLine = GetDIBits(mHdc, StdPic.Handle, 0, lHeight, p(1, 1), bMapinfo, DIB_RGB_COLORS)
        DeleteDC mHdc
    End Functionclass1 中Invert使用以下代码替代
    Public Function Invert()
        Dim i As Integer, j As Integer
        For j = 1 To lHeight
            For i = 1 To lWidth * mPixByte Step mPixByte
                p(i, j) = &HFF - p(i, j)
                p(i + 1, j) = &HFF - p(i + 1, j)
                p(i + 2, j) = &HFF - p(i + 2, j)
            Next
        Next
    End Function
      

  10.   

    这样:
    p.LoadFromStdPicture PicX, 24
    p.LoadFromStdPicture PicX, 32都可以
      

  11.   

    ReDim p(1 To lWidth * mPixByte, 1 To lHeight) As Byte
    应该改为:
    ReDim p(1 To mWidthBytes , 1 To lHeight) As Byte