在旋转Windows Phone期间防止图像剪裁

时间:2013-03-09 15:30:19

标签: c# rotation windows-phone-8 writeablebitmap writeablebitmapex

我使用WriteableBitmapEx扩展方法来旋转WriteableBitmap。代码中的bi是WritableBitmap。 RotateFree方法以任何角度旋转位图并返回新的旋转WritableBitmap。我的代码:

    private void rotate()
    {
        degree += 1;
        var rotate = bi.RotateFree(degree);
        ImageControl.Source = rotate;
    }

我的问题是,由于ImageControl大小是固定的,它会导致剪切旋转的位图。那么防止这种情况的最佳方法是什么?我想我正在寻找一种在旋转期间调整ImageControl大小以防止剪裁的方法。有什么建议?

Original image

Rotated image

更新

基于这个有用的信息Calculate rotated rectangle size from known bounding box coordinates我想我设法计算了边界框宽度(bx)和高度(by)并在旋转期间相应地调整了它的大小

double radian = (degree / 180.0) * Math.PI;
double bx = rotate.PixelWidth * Math.Cos(radian) + rotate.PixelHeight * Math.Sin(radian);
double by = rotate.PixelWidth * Math.Sin(radian) + rotate.PixelHeight * Math.Cos(radian);

虽然看起来旋转期间ImageControl的宽度和高度增加/减少,但图像仍然被剪裁。

更新2

根据@Rene的建议,我设法阻止裁剪。结合ImageControl宽度/高度计算,通过将其拉伸属性设置为NONE,在旋转期间保留图像大小。

现在的问题是确保ImageControl从其中心调整大小,使其不会移动。如果有兴趣的话,我可以加入一个示例项目

更新3

对于那些可能对最终解决方案感兴趣的人。我就是这样做的。结果是,图像在没有剪裁的情况下旋转,并且在旋转期间保持其尺寸。此外,旋转似乎来自中心。

要调整ImageControl位置,因为它正在调整大小以使旋转看起来来自中心,我使用此代码。

var translationDelta = new Point((ImageControl.ActualWidth - bx) / 2.0, (ImageControl.ActualHeight - by) / 2.0);           
UpdateImagePosition(translationDelta);
ApplyPosition();

   // This code update the ImageControl position on the canvas
    public void UpdateImagePosition(Point delta)
    {
        var newPosition = new Point(ImagePosition.X + delta.X, ImagePosition.Y + delta.Y);
        ImagePosition = newPosition;            
    }

    //This apply the new position to make the ImageControl rotate from center
    public void ApplyPosition()
    {
        ObjComposite.TranslateX = ImagePosition.X;
        ObjComposite.TranslateY = ImagePosition.Y;
    }

1 个答案:

答案 0 :(得分:1)

将crop参数设置为false时使用RotateFree:RotateFree(degree,false)。同时将ImageControl Stretch属性设置为Uniform:Stretch =“Uniform”。