【问题标题】:Prevent image clipping during rotation Windows Phone防止旋转过程中的图像剪辑 Windows Phone
【发布时间】: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


【解决方案1】:

使用 RotateFree 并将裁剪参数设置为 false:RotateFree(degree, false)。还将 ImageControl Stretch 属性设置为 Uniform:Stretch="Uniform"。

  • 雷内

【讨论】:

  • 谢谢你的建议。是的,它有效!但是,如果我希望图像在旋转期间通过实时调整 ImageControl 的大小来保持其大小,该怎么办?
  • 好的,我设法做到了。只是 ImageControl 在调整大小后似乎正在移动,使得旋转中心似乎起源于中心之外的某个地方
  • 为什么当degree < -85 & degree > 85 时仍然出现剪辑?
猜你喜欢
  • 2012-01-27
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-13
相关资源
最近更新 更多