PanoramicaCome dipingere su una tela con trasparenza e opacità?
Dalla libreria GR32, sto usando TImgView32 per rendere una griglia, che sarà il mio sfondo trasparente in questo modo:
Situato all'interno del TImgView32 ho un TImage regolare, dove sarò disegnando sulla tela, qualcosa di simile:
Task
Quello che mi piacerebbe ottenere è la possibilità di impostare l'opacità del pennello, consentendo ulteriori possibilità di modifica delle immagini nel mio programma. Piuttosto che avere un colore piatto, impostare l'opacità del pennello consente diversi livelli di profondità del colore ecc.
Ho trovato questa domanda prima mentre cercavo in giro: Draw opacity ellipse in Delphi 2010 - Andreas Rejbrand ha fornito alcuni esempi nella sua risposta per questo domanda.
Ho visto cosa ha fatto Andreas e ho trovato il mio tentativo semplificato, ma sono bloccato da un problema. Date un'occhiata a questi prossimi due immagini, la prima è con lo sfondo trasparente e la seconda con uno sfondo nero per mostrare il problema più chiara:
Come si può vedere, in giro per il pennello (cerchio) è una piazza davvero fastidiosa di cui non posso sbarazzarmi. Tutto ciò che dovrebbe essere visibile è il pennello. Questo è il mio codice utilizzato per produrre tali risultati:
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;
che produce questo su una bitmap regolare:
L'idea che avevo (sulla base di Andreas modo di creare un ellisse con opacità) era quello di rendere un pennello tipico sulla tela, assegnarlo a una bitmap fuori schermo, quindi ridisegnarlo sulla bitmap principale con l'opacità. Che funziona, tranne quella fastidiosa piazza attorno al bordo.
Come posso rendere un pennello con opacità come illustrato negli screenshot, ma senza quel quadrato attorno al cerchio del pennello?
Se si imposta Bmp.Transparent := True
c'è ancora una casella bianca, ma non più opacità. Solo un quadrato bianco solido e un cerchio rosso pieno pieno.
Grande risposta, grazie Remy.Sapevo che i miei bitmap erano pf24Bit, ma non sapevo o pensavo di impostarlo su pf32bit. Probabilmente faccio il mio background cancellando male allora, perché sto impostando il colore della trasparenza su fisso e il valore su clBtnFace quando cancoro. –
Potresti trovare utile questa classe: http://code.google.com/p/transparent-canvas/. È un wrapper attorno al disegno a 32 bit, per pixel-alfa con un'interfaccia molto simile a TCanvas. Creane uno, disegnalo, poi disegnalo su una tela, fatto. Autorizzato MPL in modo da poterlo utilizzare ovunque. –