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;
    


    效果图:



  • 相关阅读:
    ffmpeg.c函数结构简单分析(画图)
    FFMPEG之协议(文件)操作----AVIOContext, URLContext, URLProtocol
    FFmpeg源代码结构图
    解密FFmpeg播放状态控制内幕
    转 A10/A20 Bootloader加载过程分析
    [置顶] 编译linux内核时出现"mkimage" command not found
    Thumb指令集与ARM指令集的区别
    gsoap创建webservice服务简单教程
    ubuntu11.10(TQ210)下移植boa服务器
    500 Internal Error Wamp 服务器错误处理
  • 原文地址:https://www.cnblogs.com/del/p/2006154.html
Copyright © 2011-2022 走看看