Wie male ich mit Transparenz und Deckkraft auf einer Leinwand?

Überblick

Aus der GR32-Bibliothek rendere ich mit TImgView32 ein Raster, das mein transparenter Hintergrund ist:

Innerhalb von TImgView32 habe ich ein reguläres TImage, in dem ich auf die Zeichenfläche zeichnen werde, etwa so:

Aufgabe

Was ich erreichen möchte, ist die Möglichkeit, die Deckkraft des Pinsels einzustellen und so weitere Möglichkeiten zur Bildbearbeitung in meinem Programm zu ermöglichen. Anstatt eine flache Farbe zu zeichnen, können Sie die Deckkraft des Pinsels so einstellen, dass unterschiedliche Farbtiefen usw. erzielt werden.

Ich habe diese Frage früher gefunden, als ich mich umgesehen habe:Zeichnen Sie eine Opazitätsellipse in Delphi 2010 - Andreas Rejbrand hat in seiner Antwort auf diese Frage einige Beispiele genannt.

Ich habe mir angesehen, was Andreas getan hat, und habe meinen eigenen vereinfachten Versuch entwickelt, aber ich habe ein Problem. Schauen Sie sich diese beiden nächsten Bilder an. Das erste ist mit dem transparenten Hintergrund und das zweite mit einem schwarzen Hintergrund, um das Problem klarer darzustellen:

Wie Sie sehen können, ist um den Pinsel (Kreis) ein wirklich nerviges Quadrat, das ich nicht loswerden kann. Alles was sichtbar sein sollte, ist der Pinsel. Dies ist mein Code, der verwendet wird, um die folgenden Ergebnisse zu erzielen:

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;

was dies auf einer regulären Bitmap erzeugt:

Die Idee, die ich hatte (basierend auf der Methode von Andreas zum Erstellen einer Ellipse mit Deckkraft), war, einen typischen Pinsel auf der Leinwand zu rendern, ihn einer Offscreen-Bitmap zuzuweisen und ihn dann mit der Deckkraft auf die Hauptbitmap neu zu zeichnen. Was funktioniert, bis auf das nervige Quadrat um den Rand.

Wie kann ich einen Pinsel mit Deckkraft rendern, wie in den Screenshots dargestellt, aber ohne dieses Quadrat um den Pinselkreis?

Wenn ich setzeBmp.Transparent := True Es gibt immer noch eine weiße Box, aber keine Deckkraft mehr. Nur ein ausgefülltes weißes Quadrat und ein ausgefüllter roter Kreis.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage