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.