Como cor mistura (colorize pelo valor alfa especificado) a área de tela usando GDI puro?
Eu gostaria de colorir a mistura (colorir pelo valor alfa especificado) da área de uma tela usando puroWindows GDI
(sem GDI +, DirectX ou similar, sem OpenGL, sem assembler ou bibliotecas de terceiros).
Eu criei a seguinte função e gostaria de saber se existe uma maneira mais eficiente ou mais fácil de fazer isso:
<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>
Para a noção do que esta função deve fazer, veja o seguinte (discriminando :-) imagens:
E o código que pode renderizarthis image
para o lado superior esquerdo do formulário da maneira mostrada acima:
<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>
Existe uma maneira mais eficiente de fazer isso usando GDI puro ou Delphi VCL?