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

RefIID

fPictureOwnsHandle

(0)이면 생성된 이미지 개체가 파괴되도 주어진 이미지 핸들은 파괴되지 않습니다.
IPic

● 반환
성공 ━ 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에 복사하는 코드만 다를뿐이다.
'API' 카테고리의 다른 글
ODBC 레지스트리로 직접 설정 (0) | 2011.10.02 |
---|---|
GetDIBits를 사용한 이미지 비교 (0) | 2011.10.01 |
CreateCompatibleBitmap을 사용한 메모리를 이용한 이미지 복사 (0) | 2011.09.30 |
CreateCompatibleDC를 사용한 이미지의 DC를 생성하자. (0) | 2011.09.30 |
ChangeDisplaySettings을 사용한 해상도 변경 (0) | 2011.09.29 |