バイナリ画像データを直接PictureBoxにロードするには?

解決


mimo  2003-06-24 04:52:25  No: 78414

初めて投稿します、宜しくお願いします
改ざんした画像バイナリデータをバイト型で読み取り、
元の画像バイナリデータに修正して
ファイルに保存せずに直接PictureBoxにロードしたいのですが
なにかいい方法はあるでしょうか
画像データはどれだけ増えるかわかっていません

    Dim fd As Integer
    Dim Data() As Byte

    fd = FreeFile()
    Open App.Path & Text1.Text & ".JPEG" For Binary As fd
    ReDim Data(LOF(fd) - 1)

    '改ざん済み画像データ取得
    Get fd3, 1, Data

    '改ざんデータを元のデータに修正
    .....................

    'ここでData()画像をPictureBoxにロード

    Close fd

アドバイス宜しくお願いします


魔界の仮面弁士  2003-06-24 05:20:54  No: 78415

先々週、某メーリングリストに投稿したサンプルです。参考になれば。

Option Explicit

Private Const S_OK As Long = 0&

Private Type UUID
   Data1 As Long
   Data2 As Integer
   Data3 As Integer
   Data4(7) As Byte
End Type

Private Declare Function CreateStreamOnHGlobal Lib "ole32" _
   (ByVal hGlobal As Long, _
    ByVal fDeleteOnRelease As Long, _
    ByRef ppstm As Any) As Long

Private Declare Function OleLoadPicture Lib "olepro32" _
   (ByVal pStream As Long, _
    ByVal lSize As Long, _
    ByVal fRunmode As Long, _
    ByRef riid As UUID, _
    ByRef ppvObj As Any) As Long

Private Const GMEM_MOVEABLE As Long = &H2&
Private Declare Function GlobalAlloc Lib "kernel32" _
   (ByVal uFlags As Long, _
    ByVal dwBytes As Long) As Long

Private Declare Function GlobalLock Lib "kernel32" _
   (ByVal hMem As Long) As Long

Private Declare Function GlobalUnlock Lib "kernel32" _
   (ByVal hMem As Long) As Long

Private Declare Function GlobalFree Lib "kernel32" _
   (ByVal hMem As Long) As Long

Private Declare Sub RtlMoveMemory Lib "kernel32" _
   (ByVal pDest As Long, _
    ByRef pSource As Byte, _
    ByVal dwLength As Long)

Public Function BytesToPicture(ByRef PicBin() As Byte) As Picture
    Dim Low As Long, High As Long, Size As Long
    Dim IID_IPicture As UUID
    Dim oPicture As IPicture

    Low = LBound(PicBin)
    High = UBound(PicBin)
    Size = High - Low + 1

    '{7BF80980-BF32-101A-8BBB-00AA00300CAB}
    With IID_IPicture
        .Data1 = &H7BF80980
        .Data2 = &HBF32
        .Data3 = &H101A
        .Data4(0) = &H8B
        .Data4(1) = &HBB
        .Data4(3) = &HAA
        .Data4(5) = &H30
        .Data4(6) = &HC
        .Data4(7) = &HAB
    End With

    Dim hMem As Long
    Dim lpMem As Long
    Dim lRet As Long
    Dim Stm As IUnknown

    hMem = GlobalAlloc(GMEM_MOVEABLE, Size)
    If hMem = 0 Then
        Exit Function
    End If

    lpMem = GlobalLock(hMem)
    If lpMem <> 0 Then
        RtlMoveMemory ByVal lpMem, PicBin(Low), Size
        GlobalUnlock hMem
        lRet = CreateStreamOnHGlobal(hMem, 1, Stm)
        If lRet = S_OK Then
            OleLoadPicture ObjPtr(Stm), Size, 0, IID_IPicture, oPicture
        End If
        GlobalFree hMem
    End If
    Set BytesToPicture = oPicture
    Set oPicture = Nothing
End Function


mimo  2003-06-24 06:32:15  No: 78416

早速貴重なサンプル有難う御座いました
思っていた事が簡単にできてしまいました
APIはよくわからなかったのですが
サンプルを眺めて勉強したいと思います
本当に有難う御座いました


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加