防止旋转过程中的图像裁剪Windows Phone
我正在使用WriteableBitmapEx扩展方法来旋转WriteableBitmap。代码中的bi
是一个WritableBitmap。 RotateFree
方法在任何角度旋转位图并返回一个新的旋转的WritableBitmap。我的代码:防止旋转过程中的图像裁剪Windows Phone
private void rotate()
{
degree += 1;
var rotate = bi.RotateFree(degree);
ImageControl.Source = rotate;
}
我的问题是因为ImageControl的大小是固定的,它会导致旋转的位图被剪切。那么防止这种情况的最好方法是什么?我想我正在寻找一种方法来在旋转过程中调整ImageControl的大小以防止裁剪。有什么建议么?
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;
}
使用RotateFree并将crop参数设置为false:RotateFree(degree,false)。同时将ImageControl Stretch属性设置为Uniform:Stretch =“Uniform”。
- 刘若英
@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