RenderTargetBitmap doesn't seem to render my rectangle

十年热恋 提交于 2020-04-07 04:39:46

问题


I have the following code:

        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));

If I do

 myGrid.Children.Add(rect);

Then the gradient is drawn fine on the window.

I want to use this gradient for an intensity map somewhere else, so I need to get the pixels out of it. To do this, I understand I can convert it to a bitmap, using RenderTargetBitmap. Here's the next part of the code:

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

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

To test this, I do:

myGrid.Children.Add(myImage);

But nothing appears on the window. What am I doing wrong?


回答1:


Arrange has to be called after Measure, and the Rect values should be passed correctly.

Instead of

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

you should do

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);


来源:https://stackoverflow.com/questions/42989444/rendertargetbitmap-doesnt-seem-to-render-my-rectangle

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!