Jak pokolorować połączenie (ubarwienie według określonej wartości alfa) obszaru płótna przy użyciu czystego interfejsu GDI?
Chciałbym pokolorować połączenie (kolorowanie według określonej wartości alfa) obszaru płótna, używając czystegoWindows GDI
(więc bez GDI +, DirectX lub podobnych, bez OpenGL, bez asemblera lub bibliotek innych firm).
Stworzyłem następującą funkcję i chciałbym wiedzieć, czy jest to bardziej wydajny lub łatwiejszy sposób:
<code>procedure ColorBlend(const ACanvas: HDC; const ARect: TRect; const ABlendColor: TColor; const ABlendValue: Integer); var DC: HDC; Brush: HBRUSH; Bitmap: HBITMAP; BlendFunction: TBlendFunction; begin DC := CreateCompatibleDC(ACanvas); Bitmap := CreateCompatibleBitmap(ACanvas, ARect.Right - ARect.Left, ARect.Bottom - ARect.Top); Brush := CreateSolidBrush(ColorToRGB(ABlendColor)); try SelectObject(DC, Bitmap); Windows.FillRect(DC, Rect(0, 0, ARect.Right - ARect.Left, ARect.Bottom - ARect.Top), Brush); BlendFunction.BlendOp := AC_SRC_OVER; BlendFunction.BlendFlags := 0; BlendFunction.AlphaFormat := 0; BlendFunction.SourceConstantAlpha := ABlendValue; Windows.AlphaBlend(ACanvas, ARect.Left, ARect.Top, ARect.Right - ARect.Left, ARect.Bottom - ARect.Top, DC, 0, 0, ARect.Right - ARect.Left, ARect.Bottom - ARect.Top, BlendFunction); finally DeleteObject(Brush); DeleteObject(Bitmap); DeleteDC(DC); end; end; </code>
Aby zobaczyć, co ta funkcja powinna zrobić, zobacz następujące (rozróżniające :-) obrazy:
I kod, który może renderowaćthis image
w lewym górnym rogu formularza w sposób pokazany powyżej:
<code>uses PNGImage; procedure TForm1.Button1Click(Sender: TObject); var Image: TPNGImage; begin Image := TPNGImage.Create; try Image.LoadFromFile('d:\6G3Eg.png'); ColorBlend(Image.Canvas.Handle, Image.Canvas.ClipRect, $0000FF80, 175); Canvas.Draw(0, 0, Image); finally Image.Free; end; end; </code>
Czy jest bardziej wydajny sposób na wykonanie tego przy użyciu czystego GDI lub Delphi VCL?