zoukankan      html  css  js  c++  java
  • Direct2D (20) : 图层之 TD2D1LayerParameters.opacityBrush (为图层指定蒙版画刷)


    uses Direct2D, D2D1;
    
    procedure TForm1.FormPaint(Sender: TObject);
    var
      cvs: TDirect2DCanvas;
      iLayer: ID2D1Layer;
      rLayerParameters: TD2D1LayerParameters;
      wic: TWICImage;
      R: TRect;
      iLinearGradientBrush: ID2D1LinearGradientBrush;
      rLinear: TD2D1LinearGradientBrushProperties;
      arrGradientStop: array[0..2] of TD2D1GradientStop;
      iGradientStops: ID2D1GradientStopCollection;
    begin
      wic := TWICImage.Create;
      wic.LoadFromFile('C:\Temp\Test.png');
      R := Rect(0, 0, wic.Width, wic.Height);
      cvs := TDirect2DCanvas.Create(Canvas, ClientRect);
    
      {建立线性渐变画刷}
      rLinear.startPoint := D2D1PointF(0, 0);
      rLinear.endPoint := D2D1PointF(0, wic.Height);
      arrGradientStop[0].position := 0.0;
      arrGradientStop[0].color := D2D1ColorF(clBlack, 1.0);
      arrGradientStop[1].position := 0.6;
      arrGradientStop[1].color := D2D1ColorF(clWhite, 0.0);
      arrGradientStop[2].position := 1.0;
      arrGradientStop[2].color := D2D1ColorF(clBlack, 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.RenderTarget.SetTransform(TD2DMatrix3x2F.Translation((ClientWidth-wic.width)/2, (ClientHeight-wic.height)/2));
      cvs.BeginDraw;
      cvs.Brush.Color := clBlack;
      cvs.Rectangle(R);
    
      {在图层中绘制图像}
      cvs.RenderTarget.CreateLayer(nil, iLayer);
      rLayerParameters.contentBounds := R;
      rLayerParameters.geometricMask := nil;
      rLayerParameters.maskAntialiasMode := D2D1_ANTIALIAS_MODE_PER_PRIMITIVE;
      rLayerParameters.maskTransform := TD2DMatrix3x2F.Identity;
      rLayerParameters.opacity := 1.0;
      rLayerParameters.opacityBrush := iLinearGradientBrush; //!
      rLayerParameters.layerOptions := D2D1_LAYER_OPTIONS_NONE;
      cvs.RenderTarget.PushLayer(rLayerParameters, iLayer);
      cvs.StretchDraw(R, wic);
      cvs.RenderTarget.PopLayer;
    
      cvs.EndDraw;
      cvs.Free;
      wic.Free;
    end;
    
    procedure TForm1.FormResize(Sender: TObject);
    begin
      Repaint;
    end;
    


    效果图:



  • 相关阅读:
    各种小知识
    基础技能
    st表
    有理数取余
    FFT加速高精度乘法
    unique
    离散化
    线段树复杂度分析
    楼房重建
    电脑装系统常用方法
  • 原文地址:https://www.cnblogs.com/del/p/2006154.html
Copyright © 2011-2022 走看看