【发布时间】:2013-02-25 02:03:00
【问题描述】:
我正在使用 WriteableBitmapEx 扩展方法来旋转 WriteableBitmap。代码中的bi 是一个WritableBitmap。 RotateFree 方法将位图旋转任意角度并返回一个新的旋转 WritableBitmap。我的代码:
private void rotate()
{
degree += 1;
var rotate = bi.RotateFree(degree);
ImageControl.Source = rotate;
}
我的问题是因为 ImageControl 的大小是固定的,它会导致旋转的位图被剪裁。那么防止这种情况的最佳方法是什么?我想我正在寻找一种在旋转期间调整 ImageControl 大小以防止剪辑的方法。有什么建议?
更新
基于这个有用的信息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 的 Width/Height 计算,通过将其拉伸属性设置为 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;
}
【问题讨论】:
-
@MarcinJuraszek 我仍在努力。我正在查看这个stackoverflow.com/questions/2352804/…,看看它是否可以根据我的需要进行修改。由于我是 C# 新手,所以对我来说并不容易 :(
标签: c# rotation windows-phone-8 writeablebitmap writeablebitmapex