Tổng quanLàm cách nào để vẽ trên Canvas có Độ trong suốt và Độ mờ?
Từ thư viện GR32, Tôi đang sử dụng TImgView32 để render một mạng lưới mà sẽ là nền trong suốt của tôi như vậy:
Được đặt bên trong TImgView32 Tôi có một TImage thường xuyên, nơi tôi sẽ vẽ lên canvas, một cái gì đó như thế này:
Tác vụ
Điều tôi muốn đạt được là khả năng đặt độ mờ của cọ vẽ, cho phép thêm khả năng chỉnh sửa hình ảnh trong chương trình của tôi. Thay vì có một màu phẳng được vẽ, việc đặt độ mờ của bàn chải cho phép các mức độ màu khác nhau, vv ..
Tôi tìm thấy câu hỏi này trước khi tìm kiếm xung quanh: Draw opacity ellipse in Delphi 2010 - Andreas Rejbrand đã cung cấp một vài ví dụ trong câu trả lời của mình câu hỏi.
Tôi đã xem những gì Andreas đã làm, và đã đưa ra nỗ lực đơn giản của riêng tôi nhưng tôi đang mắc kẹt với một vấn đề. Hãy nhìn vào hai hình ảnh tiếp theo này, đầu tiên là với nền trong suốt và lần thứ hai với một nền đen để hiển thị các vấn đề hơn rõ ràng hơn:
Như bạn thấy, xung quanh bàn chải (vòng tròn) là một hình vuông thực sự gây phiền nhiễu tôi không thể thoát khỏi. Tất cả những gì nên được nhìn thấy là bàn chải. Đây là mã của tôi sử dụng để tạo ra những kết quả:
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;
trong đó sản xuất này trên một bitmap thường xuyên:
Ý tưởng tôi đã (dựa trên Andreas cách tạo ra một hình elip với opacity) là để render một brush điển hình trên canvas, gán nó vào một bitmap offscreen sau đó vẽ lại nó vào bitmap chính với opacity. Mà làm việc, ngoại trừ quảng trường gây phiền nhiễu xung quanh các cạnh.
Làm cách nào để hiển thị bàn chải có độ mờ như minh họa trong ảnh chụp màn hình, nhưng không có hình vuông xung quanh vòng tròn cọ vẽ?
Nếu tôi đặt Bmp.Transparent := True
thì vẫn còn một hộp màu trắng, nhưng không còn độ mờ. Chỉ cần một hình vuông màu trắng và hình tròn màu đỏ đầy rắn.
Câu trả lời tuyệt vời nhờ Remy.Tôi đã nhận thức được bitmap của tôi là pf24Bit, nhưng không biết hoặc xem xét việc đặt nó thành pf32bit. Tôi có thể làm nền của tôi xóa sai là tốt sau đó, bởi vì tôi đang thiết lập màu minh bạch để cố định và giá trị để clBtnFace khi tôi xóa. –
Bạn cũng có thể thấy lớp này hữu ích: http://code.google.com/p/transparent-canvas/. Đó là một trình bao bọc xung quanh bản vẽ 32-bit, mỗi pixel-alpha với một giao diện rất giống với TCanvas. Tạo một, vẽ nó, sau đó vẽ nó vào một khung vẽ, xong. Được cấp phép MPL để bạn có thể sử dụng nó ở mọi nơi. –