1

这是我的功能:

private byte[] GetByteArray(IPhotoObject photo)
{
        _addCanvas.RenderTransformOrigin = new Point(0.5, 0.5);
        _addCanvas.RenderTransform = new RotateTransform(90.0);

        BinaryImageConverter converter = new BinaryImageConverter();
        Image i = new Image();
        BitmapSource source = (BitmapImage)converter.Convert(photo.ImageBytes, typeof (BitmapSource), null, null);
        i.Stretch = Stretch.None;
        i.Width = source.PixelWidth;
        i.Height = source.PixelHeight;
        i.SetValue(Image.SourceProperty,source);
        var width = source.PixelWidth;
        var height = source.PixelHeight;

        Canvas canvas = new Canvas();
        canvas.Width = width;
        canvas.Height = height;
        canvas.Children.Add(i);
        canvas.Children.Add(_addCanvas);
        var size = new Size(width, height);
        var rect = new Rect(size);
        canvas.Measure(size);
        canvas.Arrange(rect);

        RenderTargetBitmap bmp = new RenderTargetBitmap(
            Convert.ToInt32(width),
            Convert.ToInt32(height),
            96.0,
            96.0,
            PixelFormats.Default);
        bmp.Render(canvas);

        return XImage.GetJpegByteArrayFromWritableBitmap(new WriteableBitmap(bmp));
}

我的问题是_addCanvas。它没有被绘制到位图上。如果我取出旋转线,_addCanvas 将被绘制到位图,但我需要旋转 _addCanvas。

_addCanvas 具有包含简单形状(正方形、圆形、线条)和文本框的子项。

我已经尝试在 _addCanvas 上调用 Measure、Arrange 和 UpdateLayout 无济于事。如果旋转,它不会进入位图中。

4

1 回答 1

0

我的问题的解决方案是在调用canvas.Measure 和canvas.Arrange 后将_addCanvas 添加为canvas 的子项。

我不是 100% 知道为什么这是必要的,但这就是我认为这有效的原因:在调试时,我注意到 canvas.ActualWidth 和 canvas.ActualHeight 在调用测量和排列之前为零。我猜在这种情况下(有一个 Canvas 是 Canvas 的子级),_addCanvas 的 RenderTransformOrigin 是相对于画布设置的。由于当我将 _addCanvas 放入其子列表时,画布的 ActualWidth 和 ActualHeight 都为零,因此 _addCanvas 围绕原点而不是围绕其中心旋转。

如果在测量和排列画布之后将 _addCanvas 插入到子列表中,则画布的 ActualWidth 和 ActualHeight 将具有非零值,并且 _addCanvas 将根据需要围绕其中心旋转。

于 2013-03-15T15:12:29.497 回答