general¿Cómo pintar en un lienzo con transparencia y opacidad?
Desde la biblioteca GR32, estoy usando TImgView32 para hacer una rejilla que va a ser mi fondo transparente así:
coloca dentro de la TImgView32 Tengo un TImage regular, donde se le dibujo en el lienzo, algo como esto:
Tarea
Lo que me gustaría lograr es la capacidad de establecer la opacidad del pincel, permitiendo más posibilidades de edición de imágenes en mi programa. En lugar de tener un solo color plano se dibuja, establecer la opacidad del pincel permite a diferentes niveles de profundidad de color, etc.
Me encontraron esta pregunta anterior mientras que la búsqueda en torno a: Draw opacity ellipse in Delphi 2010 - Andreas Rejbrand ha proporcionado algunos ejemplos en su respuesta para eso pregunta.
He visto lo que hizo Andreas, y se me ocurrió mi propio intento simplificado, pero estoy atascado con un problema. Echar un vistazo a estas dos imágenes siguientes, la primera es con el fondo transparente y el segundo con un fondo negro para mostrar el problema más clara:
Como se puede ver, en el cepillo (círculo) es un cuadrado realmente molesto del que no me puedo deshacer. Todo lo que debería ser visible es el pincel. Este es mi código utilizado para producir esos resultados:
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;
que produce esto en un mapa de bits normal:
La idea que había (en base a Andreas manera de crear una elipse con la opacidad) consistía en hacer un pincel típico en el lienzo, asignarlo a un mapa de bits fuera de pantalla y luego volver a dibujarlo en el mapa de bits principal con la opacidad. Lo que funciona, excepto ese molesto cuadrado alrededor del borde.
¿Cómo puedo renderizar un pincel con opacidad como se ilustra en las capturas de pantalla, pero sin ese cuadrado alrededor del círculo de pincel?
Si configuro Bmp.Transparent := True
, todavía hay una caja blanca, pero ya no hay opacidad. Solo un cuadrado blanco sólido y un círculo rojo lleno de sólidos.
Gran respuesta gracias Remy.Estaba al tanto de que mis bitmaps habían sido pf24Bit, pero no sabía ni consideraba configurarlo para pf32bit. Probablemente también esté borrando el fondo, porque estoy configurando el color de transparencia como fijo y el valor para clBtnFace cuando borro. –
También puede encontrar útil esta clase: http://code.google.com/p/transparent-canvas/. Es un contenedor alrededor del dibujo de 32 bits por píxel alfa con una interfaz muy similar a TCanvas. Crea uno, dibuja hacia él, luego dibuja sobre un lienzo, listo. Licencia MPL para que pueda usarlo en cualquier lugar. –