Как смешать цвета (раскрасить указанным альфа-значением) область холста, используя чистый GDI?
Я хотел бы смешать цвета (раскрасить по заданному альфа-значению) области холста, используя чистыйWindows GDI
(то есть без GDI +, DirectX или подобного, без OpenGL, без ассемблера или сторонних библиотек).
Я создал следующую функцию, и я хотел бы знать, есть ли более эффективный или более простой способ сделать это:
<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>
Чтобы понять, что должна делать эта функция, смотрите следующие (различающие :-) изображения:
И код, который может отрисовыватьthis image
в верхней левой части формы, как показано выше:
<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>
Есть ли более эффективный способ сделать это, используя чистый GDI или Delphi VCL?