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.