none
[vb6] IPictureDisp 如何讀取原始資料 RRS feed

  • 問題

  • 如果把剪貼板的圖片資料放進IPictureDisp 界面裡

    我要如何拿出該圖片的原始資料,我需要算他的MD5碼

    目前只會存檔再載入

    2008年8月9日 下午 06:46

解答

所有回覆

  • HI,

     

    您可以透過以下的做法取得剪貼板中的圖片資料:

     

    Dim objPic As IPictureDisp
    Set objPic = Clipboard.GetData()

    Set Picture1.Picture = Clipboard.GetData()

     

    tihs

    2008年8月10日 下午 12:39
  • 謝謝回答:

    Set objPic = Clipboard.GetData()


    然後我要如何讀取該圖片(objPic)的位元資料

    去分析

    感謝回答

    2008年8月10日 下午 05:51
  • 查 API GetBitmapBits

    hBitmap = stdPicture.Handle

    2008年8月11日 上午 03:02
  • HI,

     

    您可以參考這一篇文章的範例:

    http://www.freevbcode.com/showcode.asp?ID=7801

     

    tihs

    2008年8月11日 下午 12:11
  • ...

    樓主問的是 vb6。

     

    vb.net 版上搜尋 LockBits 就有既有討論:

    http://forums.microsoft.com/MSDN-CHT/Search/Search.aspx?words=LockBits&localechoice=31748&SiteID=14&searchscope=allforums

     

    2008年8月11日 下午 12:14
  • 根據 http://dev.21tx.com/2003/07/05/10184.html

    改成

    Declare Function SetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
    Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
    Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
    Declare Sub CopyMemory Lib "Kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)

     

    Type BITMAP
        bmType As Long
        bmWidth As Long
        bmHeight As Long
        bmWidthBytes As Long
        bmPlanes As Integer
        bmBitsPixel As Integer
        bmBits As Long
    End Type

    Public Function IMGMD5(pIMG As stdole.IPictureDisp) As String
        Dim tBmpInfo As BITMAP
        Dim sBits() As Byte
       
        Call GetObject(pIMG.Handle, Len(tBmpInfo), tBmpInfo)
        ReDim sBits(1 To tBmpInfo.bmWidthBytes, 1 To tBmpInfo.bmHeight)
        Call GetBitmapBits(pIMG.Handle, tBmpInfo.bmWidthBytes * tBmpInfo.bmHeight, sBits(1, 1))
    '得到一個2維陣列

    '然後我要如何將此二維陣列轉換成一維或字串

    '我的MD5編碼程式好像不認得該二維陣列

    '還是要用 for next 去接起來
        IMGMD5 = MD5(ss)

    End Function

     

    2008年8月11日 下午 07:23
  • 你找的這個範例是幫你快速轉換一維成二維,記憶體中本來就是一維線性,所以改宣告成一維即可:

    Code Snippet

    ReDim sBits(1 To tBmpInfo.bmWidthBytes * tBmpInfo.bmHeight)
        Call GetBitmapBits(pIMG.Handle, tBmpInfo.bmWidthBytes * tBmpInfo.bmHeight, sBits(1))

     

     

    2008年8月12日 上午 01:02
  • SOGA

    修改後

    Public Function gIMGData(pIMGHandle As Long, pData() As Byte) As BITMAP
        Dim tBMPInfo As BITMAP
        Dim sBits() As Byte
       
        Call GetObject(pIMGHandle, Len(tBMPInfo), tBMPInfo)
        '行,列
    '    ReDim sBits(1 To tBMPInfo.bmWidthBytes, 1 To tBMPInfo.bmHeight)
    '    Call GetBitmapBits(pIMG.Handle, tBMPInfo.bmWidthBytes * tBMPInfo.bmHeight, sBits(1, 1))
        ReDim sBits(1 To tBMPInfo.bmWidthBytes * tBMPInfo.bmHeight)
        Call GetBitmapBits(pIMG.Handle, tBMPInfo.bmWidthBytes * tBMPInfo.bmHeight, sBits(1))
        pData = sBits
        gIMGData = tBMPInfo
    End Function

    哈哈可以跑了,感謝大德回答
    2008年8月12日 下午 06:57