マトリックス整列にオフセットを追加する必要があります。この場合、私は各辺から長方形の1つの余分な長さ(合計9矩形)を取り、毎回行列をオフセットしています。
オフセット0
(元の切り抜き)を最後に配置する必要があることに注意してください。間違った結果が得られます。
また、回転した画像よりも大きな四角形を指定すると、空の領域が残ることにも注意してください。あなたの例を再作成する
public static Bitmap CropRotatedRect(Bitmap source, Rectangle rect, float angle, bool HighQuality)
{
int[] offsets = { -1, 1, 0 }; //place 0 last!
Bitmap result = new Bitmap(rect.Width, rect.Height);
using (Graphics g = Graphics.FromImage(result))
{
g.InterpolationMode = HighQuality ? InterpolationMode.HighQualityBicubic : InterpolationMode.Default;
foreach (int x in offsets)
{
foreach (int y in offsets)
{
using (Matrix mat = new Matrix())
{
//create the appropriate filler offset according to x,y
//resulting in offsets (-1,-1), (-1, 0), (-1,1) ... (0,0)
mat.Translate(-rect.Location.X - rect.Width * x, -rect.Location.Y - rect.Height * y);
mat.RotateAt(angle, rect.Location);
g.Transform = mat;
g.DrawImage(source, new Point(0, 0));
}
}
}
}
return result;
}
:
Bitmap source = new Bitmap("C:\\mjexample.jpg");
Bitmap dest = CropRotatedRect(source, new Rectangle(86, 182, 87, 228), -45, true);
は、なぜあなたは、画像を回転させて、それをトリミングしたくありませんか?これは明らかに目に見えてはいけません。元の画像のコピーを作成するだけです。 – TJHeuvel
さらに追加ステップをサイズ変更すると、説明はまだ複雑です。 – CodingBarfield
@TJHeuvelあなたが言ったことを正確に理解できませんでした。画像を回転すると、開始点の位置も変更されるようにサイズが変更されます。だから私は画像を回転させたくないのです。 – user1125953