RenderTargetBitmap似乎没有渲染我的矩形

时间:2017-03-24 00:39:29

标签: c# wpf rendertargetbitmap

我有以下代码:

        LinearGradientBrush linGrBrush = new LinearGradientBrush();
        linGrBrush.StartPoint = new Point(0,0);
        linGrBrush.EndPoint = new Point(1, 0);
        linGrBrush.GradientStops.Add(new GradientStop(Colors.Red, 0.0));
        linGrBrush.GradientStops.Add(new GradientStop(Colors.Yellow, 0.5));
        linGrBrush.GradientStops.Add(new GradientStop(Colors.White, 1.0));

        Rectangle rect = new Rectangle();
        rect.Width = 1000;
        rect.Height = 1;
        rect.Fill = linGrBrush;
        rect.Arrange(new Rect(0, 0, 1, 1000));
        rect.Measure(new Size(1000, 1));

如果我这样做

 myGrid.Children.Add(rect);

然后在窗口上绘制渐变。

我想在其他地方使用此渐变作为强度贴图,所以我需要从中获取像素。为此,我了解我可以使用RenderTargetBitmap将其转换为位图。这是代码的下一部分:

        RenderTargetBitmap bmp = new RenderTargetBitmap(
            1000,1,72,72,
            PixelFormats.Pbgra32);
        bmp.Render(rect);

        Image myImage = new Image();
        myImage.Source = bmp;

为了测试这个,我做了:

myGrid.Children.Add(myImage);

但是窗户上什么都没有出现。我做错了什么?

1 个答案:

答案 0 :(得分:2)

必须在Arrange之后调用

Measure,并且应正确传递Rect值。

而不是

rect.Arrange(new Rect(0, 0, 1, 1000)); // wrong width and height
rect.Measure(new Size(1000, 1));

你应该做

var rect = new Rectangle { Fill = linGrBrush };
var size = new Size(1000, 1);
rect.Measure(size);
rect.Arrange(new Rect(size));

var bmp = new RenderTargetBitmap(1000, 1, 96, 96, PixelFormats.Pbgra32);
bmp.Render(rect);