Jak malować na płótnie z przezroczystością i kryciem?

Przegląd

Z biblioteki GR32 używam TImgView32 do renderowania siatki, która będzie moim przezroczystym tłem w ten sposób:

Umieszczony wewnątrz TImgView32 Mam regularny TImage, gdzie będę rysować na płótnie, coś takiego:

Zadanie

To, co chciałbym osiągnąć, to możliwość ustawienia krycia pędzla, pozwalając na dalsze możliwości edycji obrazu w moim programie. Zamiast rysować jeden płaski kolor, ustawienie krycia pędzla pozwala na różne poziomy głębi kolorów itp.

Znalazłem to pytanie wcześniej podczas wyszukiwania:Narysuj elipsę krycia w Delphi 2010 - Andreas Rejbrand podał kilka przykładów w swojej odpowiedzi na to pytanie.

Przyjrzałem się temu, co zrobił Andreas, i wpadłem na własną uproszczoną próbę, ale utknąłem z problemem. Spójrz na te dwa następne obrazy, pierwszy z przezroczystym tłem, a drugi z czarnym tłem, aby pokazać problem bardziej klarownie:

Jak widać, wokół pędzla (okręgu) jest naprawdę denerwujący kwadrat, którego nie mogę się pozbyć. Wszystko, co powinno być widoczne, to pędzel. To jest mój kod używany do tworzenia tych wyników:

procedure DrawOpacityBrush(ACanvasBitmap: TBitmap; X, Y: Integer;
  AColor: TColor; ASize: Integer; Opacity: Integer);
var
  Bmp: TBitmap;
begin
  Bmp := TBitmap.Create;
  try
    Bmp.SetSize(ASize, ASize);
    Bmp.Transparent := False;

    with Bmp.Canvas do
    begin
      Pen.Color := AColor;
      Pen.Style := psSolid;
      Pen.Width := ASize;
      MoveTo(ASize div 2, ASize div 2);
      LineTo(ASize div 2, ASize div 2);
    end;

    ACanvasBitmap.Canvas.Draw(X, Y, Bmp, Opacity);
  finally
    Bmp.Free;
  end;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  DrawOpacityBrush(Image1.Picture.Bitmap, X, Y, clRed, 50, 85);
end;

który produkuje to na zwykłej mapie bitowej:

Pomysł, jaki miałem (na podstawie sposobu tworzenia elipsy z kryciem przez Andreasa) polegał na wyrenderowaniu typowego pędzla na płótnie, przypisaniu go do mapy bitowej poza ekranem, a następnie przerysowaniu go na głównej mapie bitowej z kryciem. Który działa, z wyjątkiem tego denerwującego kwadratu wokół krawędzi.

Jak mogę renderować pędzel z kryciem, jak pokazano na zrzutach ekranu, ale bez tego kwadratu wokół okręgu pędzla?

Jeśli ustawięBmp.Transparent := True wciąż jest białe pudełko, ale nie ma już krycia. Tylko solidny biały kwadrat i pełne wypełnione czerwone kółko.

questionAnswers(1)

yourAnswerToTheQuestion