作成者 |
メッセージ |
|
|
ご回答ありがとうございます。
参考にして、しばらく戦っていましたが、どうしても、合成ができません。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: Function Export MakeMaskWith( ByVal hBmp as HBITMAP ) as HBITMAP
Dim hDC as HDC, hTemp As HDC, hDest as HDC
Dim hMaskDC As HDC,hMaskBmp As HBITMAP
Dim hBmpTemp as HBITMAP, dummy(2) as HBITMAP
Dim bmp as BITMAP
hDC=GetDC(NULL)
hTemp=CreateCompatibleDC(hDC)
hDest=CreateCompatibleDC(hDC)
hMaskDC=CreateCompatibleDC(hDC)
ReleaseDC(NULL,hDC)
' 元画像の情報の取得
GetObject(hBmp,Len(bmp),bmp)
' モノクロBITMAPの生成
hBmpTemp=CreateCompatibleBitmap(hDest,bmp.bmWidth,bmp.bmHeight)
hMaskBmp=CreateCompatibleBitmap(hMaskDC,bmp.bmWidth,bmp.bmHeight)
dummy(0)=SelectObject(hTemp,hBmp)
dummy(1)=SelectObject(hDest,hBmpTemp)
dummy(2)=SelectObject(hMaskDC,hMaskBmp)
SetBkColor(hTemp,GetPixel(hTemp,0,0))
' 背景マスクの生成
BitBlt(hDest,0,0,bmp.bmWidth,bmp.bmHeight,hTemp,0,0,SRCCOPY)
BitBlt(hMaskDC,0,0,bmp.bmWidth,bmp.bmHeight,hDest,0,0,NOTSRCCOPY)
BitBlt(hTemp,0,0,bmp.bmWidth,bmp.bmHeight,hMaskDC,0,0,SRCAND)
' HBITMAPの切り離し
SelectObject(hTemp,dummy(0))
SelectObject(hDest,dummy(1))
SelectObject(hMaskDC,dummy(2))
' HDCの後始末
DeleteDC(hTemp)
DeleteDC(hDest)
DeleteDC(hMaskDC)
' 呼び出し元への返り値
MakeMaskWith=hMaskBmp
End Function
ここまでできました。
コード: ' 背景マスクの生成
BitBlt(hDest,0,0,bmp.bmWidth,bmp.bmHeight,hTemp,0,0,SRCCOPY)
BitBlt(hMaskDC,0,0,bmp.bmWidth,bmp.bmHeight,hDest,0,0,NOTSRCCOPY)
BitBlt(hTemp,0,0,bmp.bmWidth,bmp.bmHeight,hMaskDC,0,0,MERGEPAINT)
ここで、3つ目の処理をコメントにして、2つ目の処理のBmpを戻り地として返したところ、
背景が黒、画像部分が白のマスク画像ができました。
3つ目の処理で、元画像と合成しようとしたのですが、背景がしろ、画像部が黄色になってしまい、わけがわからなくなってしまいました。
これはどのようにしていけばいいのでしょうか?
ご回答ありがとうございます。 参考にして、しばらく戦っていましたが、どうしても、合成ができません。
[hide][code]Function Export MakeMaskWith( ByVal hBmp as HBITMAP ) as HBITMAP Dim hDC as HDC, hTemp As HDC, hDest as HDC Dim hMaskDC As HDC,hMaskBmp As HBITMAP Dim hBmpTemp as HBITMAP, dummy(2) as HBITMAP Dim bmp as BITMAP hDC=GetDC(NULL) hTemp=CreateCompatibleDC(hDC) hDest=CreateCompatibleDC(hDC) hMaskDC=CreateCompatibleDC(hDC) ReleaseDC(NULL,hDC)
' 元画像の情報の取得 GetObject(hBmp,Len(bmp),bmp) ' モノクロBITMAPの生成 hBmpTemp=CreateCompatibleBitmap(hDest,bmp.bmWidth,bmp.bmHeight) hMaskBmp=CreateCompatibleBitmap(hMaskDC,bmp.bmWidth,bmp.bmHeight) dummy(0)=SelectObject(hTemp,hBmp) dummy(1)=SelectObject(hDest,hBmpTemp) dummy(2)=SelectObject(hMaskDC,hMaskBmp) SetBkColor(hTemp,GetPixel(hTemp,0,0)) ' 背景マスクの生成 BitBlt(hDest,0,0,bmp.bmWidth,bmp.bmHeight,hTemp,0,0,SRCCOPY) BitBlt(hMaskDC,0,0,bmp.bmWidth,bmp.bmHeight,hDest,0,0,NOTSRCCOPY) BitBlt(hTemp,0,0,bmp.bmWidth,bmp.bmHeight,hMaskDC,0,0,SRCAND)
' HBITMAPの切り離し SelectObject(hTemp,dummy(0)) SelectObject(hDest,dummy(1)) SelectObject(hMaskDC,dummy(2)) ' HDCの後始末 DeleteDC(hTemp) DeleteDC(hDest) DeleteDC(hMaskDC) ' 呼び出し元への返り値 MakeMaskWith=hMaskBmp End Function[/code][/hide]
ここまでできました。
[code]' 背景マスクの生成 BitBlt(hDest,0,0,bmp.bmWidth,bmp.bmHeight,hTemp,0,0,SRCCOPY) BitBlt(hMaskDC,0,0,bmp.bmWidth,bmp.bmHeight,hDest,0,0,NOTSRCCOPY) BitBlt(hTemp,0,0,bmp.bmWidth,bmp.bmHeight,hMaskDC,0,0,MERGEPAINT)[/code]
ここで、3つ目の処理をコメントにして、2つ目の処理のBmpを戻り地として返したところ、 背景が黒、画像部分が白のマスク画像ができました。
3つ目の処理で、元画像と合成しようとしたのですが、背景がしろ、画像部が黄色になってしまい、わけがわからなくなってしまいました。
これはどのようにしていけばいいのでしょうか?
|
|
|
投稿記事 |
Posted: 2009年11月14日(土) 23:36 |
|
|
|
|
|
引用: > これで、マスク画像が作成されます。
> しかし、これでは普通にマスクしか返りません。
> これを透過処理をすましたBMPを返したいのですが、どうすればいいのでしょうか。
> ご教授ください
このあたりのサイトが詳しそうですね。
http://homepage2.nifty.com/rleez/progra ... mask2.html
マスクを使った透過処理では前景となるマスク画像と、背景となるマスク画像の2つが
必要となります。
上記の関数は元となる画像を白黒にしただけだと推察されます。
その後に何らかの処理が必要ではないでしょうか?
あと開発環境および動作環境がWindowsNT、WindowsXP系列であれば、
TransparentBlt関数というそのものズバリ透過処理を行ってくれるものがあります。
下のURLを参考にしてください。
http://msdn.microsoft.com/ja-jp/library/cc428776.aspx
定義
コード: Declare Function TransparentBlt Lib "msimg32" (hdcDest As HDC, nXDest As Long, nYDest As Long, nDestWidth As Long, nDestHeight As Long, hdcSrc As HDC, XSrc As Long, YSrc As Long, nSrcWidth As Long, nSrcHeight As Long, dwRop As DWord) As Long
[quote]> これで、マスク画像が作成されます。 > しかし、これでは普通にマスクしか返りません。 > これを透過処理をすましたBMPを返したいのですが、どうすればいいのでしょうか。 > ご教授ください[/quote]
このあたりのサイトが詳しそうですね。 http://homepage2.nifty.com/rleez/program_old/winapi/bmpmask2.html
マスクを使った透過処理では前景となるマスク画像と、背景となるマスク画像の2つが 必要となります。 上記の関数は元となる画像を白黒にしただけだと推察されます。 その後に何らかの処理が必要ではないでしょうか?
あと開発環境および動作環境がWindowsNT、WindowsXP系列であれば、 TransparentBlt関数というそのものズバリ透過処理を行ってくれるものがあります。 下のURLを参考にしてください。 http://msdn.microsoft.com/ja-jp/library/cc428776.aspx
[b]定義[/b] [code]Declare Function TransparentBlt Lib "msimg32" (hdcDest As HDC, nXDest As Long, nYDest As Long, nDestWidth As Long, nDestHeight As Long, hdcSrc As HDC, XSrc As Long, YSrc As Long, nSrcWidth As Long, nSrcHeight As Long, dwRop As DWord) As Long [/code]
|
|
|
投稿記事 |
Posted: 2009年11月01日(日) 01:31 |
|
|
|
|
|
透過済み画像を制作する方法が一向に分かりません。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: Function MakeMask( ByVal hBmp as HBITMAP ) as HBITMAP
Dim hDC as HDC, hTemp As HDC, hDest as HDC
Dim hBmpTemp as HBITMAP, dummy(1) as HBITMAP
Dim bmp as BITMAP
hDC=GetDC(NULL)
hTemp=CreateCompatibleDC(hDC)
hDest=CreateCompatibleDC(hDC)
ReleaseDC(NULL,hDC)
' 元画像の情報の取得
GetObject(hBmp,len(bmp),bmp)
' モノクロBITMAPの生成
hBmpTemp=CreateCompatibleBitmap(hDest,bmp.bmWidth,bmp.bmHeight)
dummy(0)=SelectObject(hTemp,hBmp)
dummy(1)=SelectObject(hDest,hBmpTemp)
SetBkColor(hTemp,GetPixel(hTemp,0,0))
' 背景マスクの生成
BitBlt(hDest,0,0,bmp.bmWidth,bmp.bmHeight,hTemp,0,0,SRCCOPY)
' HBITMAPの切り離し
SelectObject(hTemp,dummy(0))
SelectObject(hDest,dummy(1))
' HDCの後始末
DeleteDC(hTemp)
DeleteDC(hDest)
' 呼び出し元への返り値
MakeMask=hBmpTemp
End Function
これで、マスク画像が作成されます。
しかし、これでは普通にマスクしか返りません。
これを透過処理をすましたBMPを返したいのですが、どうすればいいのでしょうか。
ご教授ください
透過済み画像を制作する方法が一向に分かりません。
[hide][code]Function MakeMask( ByVal hBmp as HBITMAP ) as HBITMAP Dim hDC as HDC, hTemp As HDC, hDest as HDC Dim hBmpTemp as HBITMAP, dummy(1) as HBITMAP Dim bmp as BITMAP hDC=GetDC(NULL) hTemp=CreateCompatibleDC(hDC) hDest=CreateCompatibleDC(hDC) ReleaseDC(NULL,hDC)
' 元画像の情報の取得 GetObject(hBmp,len(bmp),bmp) ' モノクロBITMAPの生成 hBmpTemp=CreateCompatibleBitmap(hDest,bmp.bmWidth,bmp.bmHeight) dummy(0)=SelectObject(hTemp,hBmp) dummy(1)=SelectObject(hDest,hBmpTemp) SetBkColor(hTemp,GetPixel(hTemp,0,0)) ' 背景マスクの生成 BitBlt(hDest,0,0,bmp.bmWidth,bmp.bmHeight,hTemp,0,0,SRCCOPY)
' HBITMAPの切り離し SelectObject(hTemp,dummy(0)) SelectObject(hDest,dummy(1)) ' HDCの後始末 DeleteDC(hTemp) DeleteDC(hDest) ' 呼び出し元への返り値 MakeMask=hBmpTemp End Function[/code][/hide]
これで、マスク画像が作成されます。 しかし、これでは普通にマスクしか返りません。 これを透過処理をすましたBMPを返したいのですが、どうすればいいのでしょうか。 ご教授ください
|
|
|
投稿記事 |
Posted: 2009年10月31日(土) 20:22 |
|
|
|
|