【发布时间】:2019-12-24 10:02:37
【问题描述】:
我正在研究校正页面(图像)的宽度、高度和角度的逻辑。 点 r1,r2,r3 在正确图像上,点 d1,d2,d3 是当前图像上的对应点。
我尝试了多种方法并最终实现了这一目标。
public System.Drawing.Bitmap CorrectFileDimentionsV2(System.Drawing.Bitmap bitmap, PagePoints pagePoints)
{
BitmapHelper bitmapHelper = new BitmapHelper();
var bitmapImage = bitmapHelper.Bitmap2BitmapImage(bitmap);
DrawingVisual MyPath = new DrawingVisual();
using (DrawingContext dc = MyPath.RenderOpen())
{
TransformGroup transform = new TransformGroup();
Point r1 = pagePoints.ADash;
Point r2 = pagePoints.BDash;
Point r3 = pagePoints.CDash;
Point d1 = pagePoints.A;
Point d2 = pagePoints.B;
Point d3 = pagePoints.C;
Vector vr21 = r2 - r1;
Vector vd21 = d2 - d1;
Vector vr31 = r3 - r1;
Vector vd31 = d3 - d1;
double y1 = Vector.CrossProduct(vr31, vr21) / vr21.Length;
double y2 = Vector.CrossProduct(vd31, vd21) / vd21.Length;
transform.Children.Add(new TranslateTransform(-r1.X, -r1.Y));
transform.Children.Add(new ScaleTransform(vd21.Length / vr21.Length, y2 / y1));
transform.Children.Add(new RotateTransform(Vector.AngleBetween(vr21, vd21)));
transform.Children.Add(new TranslateTransform(d1.X, d1.Y));
dc.PushTransform(transform);
dc.DrawImage(bitmapImage, new Rect(0, 0, bitmapImage.Width, bitmapImage.Height));
dc.Pop();
}
Image theImage = new Image();
DrawingImage dImageSource = new DrawingImage(dGroup);
theImage.Source = dImageSource;
using (MemoryStream ms = new MemoryStream())
{
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(ToBitmapSource(dImageSource)));
encoder.Save(ms);
using (System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(ms))
{
bmpOut = new System.Drawing.Bitmap(bmp);
}
}
return bmpOut;
}
【问题讨论】:
-
谁能帮我计算 ScaleTransform 和 RotateTransform 的值?