綺麗に縮小転送 <TOP>
SetStretchBltModeを使って画像を綺麗に縮小転送します。
StretchBlt
拡縮をともなうグラフィックデバイス間のイメージを転送
SetStretchBltMode
指定されたデバイスコンテキストのビットマップ伸縮モードを設定
GetDC
デバイスコンテキスト取得
ReleaseDC デバイスコンテキスト解放
例では、Picture1の画像をPicture2に StretchBlt転送、Picture3に SetStretchBltModeでCOLORONCOLOR を設定後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