OleCreatePictureIndirect은 메모리의 이미지 개체를 활용하여 지정된 ID의 OLE 개체를 생성한다.

이미지 개체를 생성한다.
● 선언
Function OleCreatePictureIndirect Lib "olepro32.dll" (PicDesc As PICTDESC, RefIID As GUID, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long

인수
PicDesc ━ 이미지 개체 생성시 필요한 정보가 담긴 구조체, PICTDESC 구조체 사용
RefIID ━ 어떤 개체를 만들건지를 나타내는 식별자(16바이트), GUID 구조체 사용
fPictureOwnsHandle ━ True(1)이면 생성된 이미지 개체가 파괴(소멸)될때 주어진 이미지 핸들도 같이 파괴됩니다. False
(0)이면 생성된 이미지 개체가 파괴되도 주어진 이미지 핸들은 파괴되지 않습니다.
IPic ━ 생성한 이미지 개체를 참조(저장)시킬 개체변수(VB에서 사용)

반환
성공 ━ S_OK
실패 ━ E_NOINTERFACE, E_UNEXPECTED

다은은 초기 이미지이다.

두개의 이미지 박스에 이미지가 있다 이 두 개체의 이미지를 합성 하기 위해서, 이미지 합성 버튼을 누르면, 두 이미지 개체의 메모리 DC를 우선 생성하여 이미지와 연결시켜 놓과, 메모리 DC아 메모리 비트맵을 생성하여 메모리 DC에 메모리 비트맵을 할당한다.
합성하기 전의 준비 작업은 끝낱다.
우선 첫번째 이미의 DC을 메모리 DC에 복사하고, 다음 두번째 이미지 DC를 메모리 DC의 적당한 위치에 복사한다. 그러면
두 이미지는 합성된 상태이다. 이 이미지를 OleCreatePictureIndirect을 사용하여 메모리 비트맵을 VB에서 사용할수 있는 이미지 개체를 생성하여 픽처박스에 설정하면 끝니다.

다음은 결과 이미지이다.



다음은 소스이다.
' 두 이미지 박스의 이미지 합성
' 두 이미지 DC를 메모리 DC에 복사 후, 메모리 DC에서 이미지 개체를 얻고, 그 개체를 픽처박스의 이미지로 설정
Option Explicit

Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function BitBlt Lib "gdi32" (ByVal hDCDest As Long, ByVal XDest As Long, ByVal YDest As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hdcSrc As Long, ByVal XSrc As Long, ByVal YSrc As Long, ByVal dwRop As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (PicDesc As Any, RefIID As GUID, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long ' 생성된 비트맵을 VB에서 사용가능하도록, 이미지 개체로 만든다.
Private Declare Function CLSIDFromString Lib "ole32" (ByVal str As Long, id As GUID) As Long
Private Type GUID ' 이미지 개체 클래스 ID를 저장할 구조체
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(7) As Byte
End Type

Private Type PicBmp ' VB에서 이미지 개체를 생성하기 위한 정보 구조체
    Size As Long
    Type As Long
    BitmapHwnd As Long
    hPal As Long
    Reserved As Long
End Type

Private Const SRCCOPY = &HCC0020

Public Function CreateImageDC(sPic As StdPicture) As Long ' 이미지에 대한 DC 생성
    Dim hdcPicture As Long ' 메모리 DC

   hdcPicture = CreateCompatibleDC(ByVal 0&)
   SelectObject hdcPicture, sPic.Handle
   CreateImageDC = hdcPicture
End Function

Private Sub cmdImageCopy_Click() ' 이미지 복사
    Dim Sorhdc As Long ' 소스 DC
    Dim Sorhdc2 As Long ' 소스 DC
    Dim Deshdc As Long ' 대상 DC(메모리)
    Dim DesBitmap As Long ' 대상 비트맵(메모리)
    Dim SizeX As Long ' 첫번째 이미지 박스 비트맵 크기 : X축 픽셀수
    Dim SizeY As Long ' 첫번째 이미지 박스 비트맵 크기 : Y축 픽셀수
    Dim SizeX2 As Long ' 두번째 이미지 박스의 비트맵 크기 : X축 픽셀수
    Dim SizeY2 As Long ' 두번째 이미지 박스의 비트맵 크기 : Y축 픽셀수
    Dim Pic As PicBmp ' 비트맵을 OLE 개체로 생성하기 위한 비트맵 정보
    Dim IID_IDispatch As GUID ' VB에서 사용할 이미지 개체의 GUID
    Dim IPic As IPictureDisp ' VB에서 사용할 이미지 개체
   
    SizeX = CLng(Me.ScaleX(Image1.Picture.Width, vbHimetric, vbPixels)) ' 첫번째 이미지박스 이지미 픽셀 크기
    SizeY = CLng(Me.ScaleY(Image1.Picture.Height, vbHimetric, vbPixels))
    SizeX2 = CLng(Me.ScaleX(Image2.Picture.Width, vbHimetric, vbPixels)) ' 두번째 이미지박스 이지미 픽셀 크기
    SizeY2 = CLng(Me.ScaleY(Image2.Picture.Height, vbHimetric, vbPixels))
   
    Sorhdc = CreateImageDC(Image1.Picture) ' 이미지에 대한 DC를 생성한다
    Sorhdc2 = CreateImageDC(Image2.Picture) ' 이미지에 대한 DC를 생성한다
    Deshdc = CreateCompatibleDC(ByVal 0&) ' 메모리 DC와 메모리 비트맵을 생성한다.
    DesBitmap = CreateCompatibleBitmap(Sorhdc, SizeX, SizeY)
    SelectObject Deshdc, DesBitmap
   
    BitBlt Deshdc, 0, 0, SizeX, SizeY, Sorhdc, 0, 0, SRCCOPY ' 첫번째 이미지 박스 이미지를 메모리 비트맵에 복사
   
    BitBlt Deshdc, (SizeX - SizeX2) / 2, (SizeY - SizeY2) / 2, SizeX2, SizeY2, Sorhdc2, 0, 0, SRCCOPY ' 두번째 이미지 박스 이미지를 메모리 비트맵에 복사하므로 이미지 합성
   
    DeleteDC Sorhdc
    DeleteDC Sorhdc2
    DeleteDC Deshdc
   
    ' 메모리의 비트맵을 VB에서 사용하는 이미지 개체로 변환
    Call CLSIDFromString(StrPtr("{00020400-0000-0000-C000-000000000046}"), IID_IDispatch) ' vb에서 사용되는 GUID를 구조체에 저장한다.
    With Pic
        .Size = Len(Pic)
        .Type = vbPicTypeBitmap
        .BitmapHwnd = DesBitmap
        .hPal = 0&
    End With
    Call OleCreatePictureIndirect(Pic, IID_IDispatch, 1, IPic)
    Set Picture1.Picture = IPic ' 생성된 이미지 개체 반환
End Sub


이전 예하고 크게 달라진 부분은 없다. 단지 두번째 이미지박스의 이미지에 대한 DC를 생성하여 그 이미지를 첫번째 이미지를 복사한 메모리 DC에 복사하는 코드만 다를뿐이다.

+ Recent posts