2

我正在使用WriteableBitmapEx扩展方法来旋转WriteableBitmap。代码中的bi是一个WritableBitmap。 RotateFree方法在任何角度旋转位图并返回一个新的旋转的WritableBitmap。我的代码:防止旋转过程中的图像裁剪Windows Phone

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

我的问题是因为ImageControl的大小是固定的,它会导致旋转的位图被剪切。那么防止这种情况的最好方法是什么?我想我正在寻找一种方法来在旋转过程中调整ImageControl的大小以防止裁剪。有什么建议么?

Original image

Rotated image

UPDATE

在此基础上有用的信息Calculate rotated rectangle size from known bounding box coordinates我想我管理(通过)来计算边框宽度(BX)和高度,并在相应的调整其大小轮转

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; 
    } 
+0

@MarcinJuraszek我仍然在努力。我正在看这个http://stackoverflow.com/questions/2352804/how-do-i-prevent-clipping-when-rotating-an-image-in-c?rq=1看看它是否可以修改为我的需求。由于我是C#的新手,对我来说并不是那么容易:( – PutraKg 2013-03-09 16:13:18

回答

1

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

  • 刘若英
+0

啊,谢谢你的建议。是的,它可行!但是如果我希望图像在旋转过程中通过实时调整ImageControl大小来保持其大小? – PutraKg 2013-03-10 06:07:29

+0

好吧,我设法做到了这一点。只是ImageControl在调整大小之后似乎正在移动,使得旋转中心似乎在除了中心之外的某个位置起始 – PutraKg 2013-03-10 06:22:30

+0

为什么当度数<-85'85'时我仍然会发生裁剪? – PutraKg 2013-03-10 08:04:49