¿Cómo combinar el color (colorear según el valor alfa especificado) del área del lienzo utilizando GDI puro?
Me gustaría combinar el color (colorear con un valor alfa especificado) el área de un lienzo usando pureWindows GDI
(por lo tanto, sin GDI +, DirectX o similar, sin OpenGL, sin ensamblador o bibliotecas de terceros).
He creado la siguiente función y me gustaría saber si hay una forma más eficiente o sencilla de hacerlo:
<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 saber qué debe hacer esta función, vea las siguientes imágenes (discriminatorias :-):
Y el código que puede hacer.this image
en la parte superior izquierda del formulario de la forma que se muestra arriba:
<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>
¿Hay una manera más eficiente de hacerlo usando GDI puro o Delphi VCL?