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には、単純な形状(正方形、円、線)とTextBoxを含む子があります。

_addCanvasでMeasure、Arrange、およびUpdateLayoutを呼び出してみましたが、役に立ちませんでした。回転させた場合、ビットマップには入りません。

4

1 に答える 1

0

私の問題の解決策は、canvas.Measure と canvas.Arrange を呼び出した後、_addCanvas を canvas の子として追加することでした。

これが必要な理由については 100% ではありませんが、これがうまくいった理由は次のとおりです。このシナリオ (キャンバスの子であるキャンバスがある) では、_addCanvas の RenderTransformOrigin がキャンバスに対して相対的に設定されていたと思います。キャンバスの ActualWidth と ActualHeight の両方がゼロだったので、_addCanvas を子のリストに追加したとき、_addCanvas はその中心ではなく、原点を中心に回転していました。

キャンバスを測定して配置した後で _addCanvas を子のリストに挿入すると、キャンバスの ActualWidth と ActualHeight の値がゼロ以外になり、_addCanvas が必要に応じてその中心を中心に回転します。

于 2013-03-15T15:12:29.497 に答える