綺麗に縮小転送             <TOP>


SetStretchBltModeを使って画像を綺麗に縮小転送します。

StretchBlt 拡縮をともなうグラフィックデバイス間のイメージを転送
SetStretchBltMode 指定されたデバイスコンテキストのビットマップ伸縮モードを設定
GetDC デバイスコンテキスト取得

ReleaseDC デバイスコンテキスト解放

 

例では、Picture1の画像をPicture2に StretchBlt転送、Picture3に SetStretchBltModeCOLORONCOLOR を設定後StretchBlt 転送しています。

画像比較(違いが判別できるでしょうか。StretchBltのみでは黒が潰れているように見えます。)

それぞれの拡大比較


'================================================================
'= 画像を綺麗に縮小
'=    (StretchBltMode.bas)
'================================================================
#include "Windows.bi"

' 拡縮をともなうグラフィックデバイス間のイメージを転送
Declare Function Api_StretchBlt& Lib "gdi32" Alias "StretchBlt" (ByVal hDC&, ByVal X&, ByVal Y&, ByVal nWidth&, ByVal nHeight&, ByVal hSrcDC&, ByVal xSrc&, ByVal ySrc&, ByVal nSrcWidth&, ByVal nSrcHeight&, ByVal dwRop&)

' 指定されたデバイスコンテキストのビットマップ伸縮モードを設定
Declare Function Api_SetStretchBltMode& Lib "gdi32" Alias "SetStretchBltMode" (ByVal hDC&, ByVal nStretchMode&)

' 指定されたウィンドウのクライアント領域または画面全体を表すディスプレイデバイスコンテキストのハンドルを取得
Declare Function Api_GetDC& Lib "user32" Alias "GetDC" (ByVal hWnd&)

' デバイスコンテキストを解放
Declare Function Api_ReleaseDC& Lib "user32" Alias "ReleaseDC" (ByVal hWnd&, ByVal hDC&)

#define SRCCOPY &HCC0020
#define COLORONCOLOR 3

Var Shared Text1 As Object : Text1.Attach GetDlgItem("Text1") : Text1.SetFontSize 14
Var Shared Text2 As Object : Text2.Attach GetDlgItem("Text2") : Text2.SetFontSize 14
Var Shared Picture1 As Object : Picture1.Attach GetDlgItem("Picture1")
Var Shared Picture2 As Object : Picture2.Attach GetDlgItem("Picture2")
Var Shared Picture3 As Object : Picture3.Attach GetDlgItem("Picture3")
Var Shared Bitmap As Object
BitmapObject Bitmap

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    Var hDC1 As Long
    Var hDC2 As Long
    Var hDC3 As Long
    Var Ret As Long

    hDC1 = Api_GetDC(Picture1.GethWnd)
    hDC2 = Api_GetDC(Picture2.GethWnd)
    hDC3 = Api_GetDC(Picture3.GethWnd)

    Bitmap.LoadFile "flower.bmp"
    Picture1.DrawBitmap Bitmap, 0, 0
    Bitmap.DeleteObject

    Ret = Api_StretchBlt(hDC2, 0, 0, Picture2.GetWidth, Picture2.GetHeight, hDC1, 0, 0, Picture1.GetWidth, Picture1.GetHeight, SRCCOPY)

    Ret = Api_SetStretchBltMode(hDC3, COLORONCOLOR)
    Ret = Api_StretchBlt(hDC3, 0, 0, Picture3.GetWidth, Picture3.GetHeight, hDC1, 0, 0, Picture1.GetWidth, Picture1.GetHeight, SRCCOPY)

    Ret = Api_ReleaseDC(Picture1.GethWnd, hDC1)
    Ret = Api_ReleaseDC(Picture2.GethWnd, hDC2)
    Ret = Api_ReleaseDC(Picture3.GethWnd, hDC3)
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End