Сохранение растрового изображения перемещает холст - PullRequest
0 голосов
/ 04 февраля 2012

Я пытаюсь сохранить рисунок холста как растровое изображение.Код работает нормально, однако после сохранения рисунка холст перемещается в верхний левый угол родительского приложения.Мой код выглядит следующим образом:

public void SaveBitmap()
    {
        Size size = new Size(canvas.ActualWidth, canvas.ActualHeight);
        canvas.Measure(size);
        canvas.Arrange(new Rect(size));

        RenderTargetBitmap renderBitmap =
            new RenderTargetBitmap(
                (int)size.Width,
                (int)size.Height,
                96d,
                96d,
                PixelFormats.Pbgra32);
        renderBitmap.Render(canvas);

        using (FileStream outStream = new FileStream("C:\\Users\\Darren\\Desktop\\test.bmp", FileMode.Create))
        {
            BmpBitmapEncoder encoder = new BmpBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(renderBitmap));
            encoder.Save(outStream);
        }


    }

Строка, которая вызвала проблему, является canvas.Arrange.Кто-нибудь пролил свет?

Спасибо.

1 Ответ

3 голосов
/ 04 февраля 2012

Причина в том, что вы не указываете какую-либо позицию в конструкторе Rect, поэтому по умолчанию используется позиция (0,0).

Я предлагаю использовать RenderTargetBitmap, чтобы поместить Canvas в Grid, а затем выполнить любое явное позиционирование, требуемое вашим пользовательским интерфейсом для этого внешнего Grid, позволяя вашему внутреннему Canvas естественнымпринять позицию (0,0) внутри этого родителя Grid.

Например, если у вас есть:

<Window>
    <Canvas Left="10" Top="30" />
</Window>

Измените его на:

<Window>
    <Grid Left="10" Top="30">
        <Canvas />
    </Grid>
</Window>

Затем вы можете отменить свои звонки на Measure и Arrangeв целом.Однако убедитесь, что вы все еще передаете дочерний Canvas в ваш метод RenderTargetBitmap.Render, а не родительский Grid.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...