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;
效果图: