Direct2D (17) : 蒙版之 FillGeometry() 方法

來源:互聯網
上載者:User
FillGeometry() 可通過兩個畫刷的重疊運算擷取蒙版效果,作為蒙版畫刷的漸層色中應該至少有一個透明色。
使用放射漸層畫刷做蒙版:
uses Direct2D, D2D1, Wincodec, ActiveX;{從指定檔案建立 ID2D1Bitmap 的函數}function GetD2D1Bitmap(RenderTarget: ID2D1RenderTarget; imgPath: string): ID2D1Bitmap;var  iWicFactory: IWICImagingFactory;  iWICDecoder: IWICBitmapDecoder;  iWICFrameDecode: IWICBitmapFrameDecode;  iFormatConverter: IWICFormatConverter;begin  CoCreateInstance(CLSID_WICImagingFactory, nil, CLSCTX_INPROC_SERVER, IID_IWICImagingFactory, iWicFactory);  iWicFactory.CreateDecoderFromFilename(PWideChar(imgPath), GUID_NULL, GENERIC_READ, WICDecodeMetadataCacheOnLoad, iWICDecoder);  iWicDecoder.GetFrame(0, iWICFrameDecode);  iWicFactory.CreateFormatConverter(iFormatConverter);  iFormatConverter.Initialize(iWICFrameDecode, GUID_WICPixelFormat32bppPBGRA, WICBitmapDitherTypeNone, nil, 0, WICBitmapPaletteTypeMedianCut);  RenderTarget.CreateBitmapFromWicBitmap(iFormatConverter, nil, Result);end;procedure TForm1.FormPaint(Sender: TObject);var  cvs: TDirect2DCanvas;  iBitmapBrush: ID2D1BitmapBrush;  iBitmapPic: ID2D1Bitmap;  rRectF: TD2DRectF;  rSizeF: TD2DSizeF;  iRectangleGeometry: ID2D1RectangleGeometry;  iRadialGradientBrush: ID2D1RadialGradientBrush;  rRGBP: TD2D1RadialGradientBrushProperties;  arrGradientStop: array[0..1] of TD2D1GradientStop;  iGradientStops: ID2D1GradientStopCollection;begin  cvs := TDirect2DCanvas.Create(Canvas, ClientRect);  iBitmapPic := GetD2D1Bitmap(cvs.RenderTarget, 'C:\Temp\Test.png');  cvs.RenderTarget.CreateBitmapBrush(iBitmapPic, nil, nil, iBitmapBrush);  iBitmapPic.GetSize(rSizeF);  rRectF := D2D1RectF(0, 0, rSizeF.width, rSizeF.height);  rRGBP.center := D2D1PointF(rRectF.right / 2, rRectF.bottom / 2);  rRGBP.gradientOriginOffset := D2D1PointF(0, 0);  rRGBP.radiusX := (rRectF.Right - rRectF.Left) / 2;  rRGBP.radiusY := (rRectF.Bottom - rRectF.Top) / 2;  arrGradientStop[0].position := 0.0;  arrGradientStop[0].color := D2D1ColorF(clYellow, 0.0); //關鍵代碼:顏色值不重要,重要的是透明度,該色被指定為全透明  arrGradientStop[1].position := 1.0;  arrGradientStop[1].color := D2D1ColorF(clRed, 1.0);    //不透明;測試圖片有置換這個兩個透明度的示範  cvs.RenderTarget.CreateGradientStopCollection(@arrGradientStop[0], Length(arrGradientStop), D2D1_GAMMA_2_2, D2D1_EXTEND_MODE_CLAMP, iGradientStops);  cvs.RenderTarget.CreateRadialGradientBrush(rRGBP, nil, iGradientStops, iRadialGradientBrush);  cvs.BeginDraw;  cvs.RenderTarget.Clear(D2D1ColorF(clWhite)); //填充背景  cvs.RenderTarget.SetTransform(TD2DMatrix3x2F.Translation((ClientWidth-rSizeF.width)/2, (ClientHeight-rSizeF.height)/2));//  cvs.RenderTarget.SetAntialiasMode(D2D1_ANTIALIAS_MODE_ALIASED);  D2DFactory.CreateRectangleGeometry(rRectF, iRectangleGeometry);  cvs.RenderTarget.FillGeometry(iRectangleGeometry, iBitmapBrush, iRadialGradientBrush);//  cvs.RenderTarget.SetAntialiasMode(D2D1_ANTIALIAS_MODE_PER_PRIMITIVE);  cvs.EndDraw;  cvs.Free;end;procedure TForm1.FormResize(Sender: TObject);begin  Repaint;end;
運行:


修改為使用線性漸層畫刷做蒙版:

uses Direct2D, D2D1, Wincodec, ActiveX;{從指定檔案建立 ID2D1Bitmap 的函數}function GetD2D1Bitmap(RenderTarget: ID2D1RenderTarget; imgPath: string): ID2D1Bitmap;var  iWicFactory: IWICImagingFactory;  iWICDecoder: IWICBitmapDecoder;  iWICFrameDecode: IWICBitmapFrameDecode;  iFormatConverter: IWICFormatConverter;begin  CoCreateInstance(CLSID_WICImagingFactory, nil, CLSCTX_INPROC_SERVER, IID_IWICImagingFactory, iWicFactory);  iWicFactory.CreateDecoderFromFilename(PWideChar(imgPath), GUID_NULL, GENERIC_READ, WICDecodeMetadataCacheOnLoad, iWICDecoder);  iWicDecoder.GetFrame(0, iWICFrameDecode);  iWicFactory.CreateFormatConverter(iFormatConverter);  iFormatConverter.Initialize(iWICFrameDecode, GUID_WICPixelFormat32bppPBGRA, WICBitmapDitherTypeNone, nil, 0, WICBitmapPaletteTypeMedianCut);  RenderTarget.CreateBitmapFromWicBitmap(iFormatConverter, nil, Result);end;procedure TForm1.FormPaint(Sender: TObject);var  cvs: TDirect2DCanvas;  iBitmapBrush: ID2D1BitmapBrush;  iBitmapPic: ID2D1Bitmap;  rRectF: TD2DRectF;  rSizeF: TD2DSizeF;  iRectangleGeometry: ID2D1RectangleGeometry;  iLinearGradientBrush: ID2D1LinearGradientBrush;  rLinear: TD2D1LinearGradientBrushProperties;  arrGradientStop: array[0..1] of TD2D1GradientStop;  iGradientStops: ID2D1GradientStopCollection;begin  cvs := TDirect2DCanvas.Create(Canvas, ClientRect);  iBitmapPic := GetD2D1Bitmap(cvs.RenderTarget, 'C:\Temp\Test.png');  cvs.RenderTarget.CreateBitmapBrush(iBitmapPic, nil, nil, iBitmapBrush);  iBitmapPic.GetSize(rSizeF);  rRectF := D2D1RectF(0, 0, rSizeF.width, rSizeF.height);  rLinear.startPoint := D2D1PointF(0, 0);  rLinear.endPoint := D2D1PointF(rSizeF.width, rSizeF.height);  arrGradientStop[0].position := 0.0;  arrGradientStop[0].color := D2D1ColorF(clYellow, 0.0);  arrGradientStop[1].position := 1.0;  arrGradientStop[1].color := D2D1ColorF(clRed, 1.0);  cvs.RenderTarget.CreateGradientStopCollection(@arrGradientStop[0], Length(arrGradientStop), D2D1_GAMMA_2_2, D2D1_EXTEND_MODE_CLAMP, iGradientStops);  cvs.RenderTarget.CreateLinearGradientBrush(rLinear, nil, iGradientStops, iLinearGradientBrush);  cvs.BeginDraw;  cvs.RenderTarget.Clear(D2D1ColorF(clWhite));  cvs.RenderTarget.SetTransform(TD2DMatrix3x2F.Translation((ClientWidth-rSizeF.width)/2, (ClientHeight-rSizeF.height)/2));  D2DFactory.CreateRectangleGeometry(rRectF, iRectangleGeometry);  cvs.RenderTarget.FillGeometry(iRectangleGeometry, iBitmapBrush, iLinearGradientBrush);  cvs.EndDraw;  cvs.Free;end;procedure TForm1.FormResize(Sender: TObject);begin  Repaint;end;
運行:


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.