WriteableBitmapEx拡張メソッドを使用してWriteableBitmapを回転しています。bi
コードにはWritableBitmapがあります。このRotateFree
メソッドは、ビットマップを任意の角度で回転し、新しい回転されたWritableBitmapを返します。私のコード:
private void rotate()
{
degree += 1;
var rotate = bi.RotateFree(degree);
ImageControl.Source = rotate;
}
私の問題は、ImageControlのサイズが固定されているため、回転したビットマップがクリップされることです。では、これを防ぐための最良の方法は何ですか?クリッピングを防ぐために、回転中にImageControlのサイズを変更する方法を探していると思います。助言がありますか?
アップデート
この有用な情報に基づいて既知のバウンディングボックスの座標から回転した長方形のサイズを計算するバウンディングボックスの幅(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;
}