Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF:剪切并保存图像_C#_Wpf_Image Manipulation_Rotation - Fatal编程技术网

C# WPF:剪切并保存图像

C# WPF:剪切并保存图像,c#,wpf,image-manipulation,rotation,C#,Wpf,Image Manipulation,Rotation,我正在寻找一种旋转图像的方法,以便在该图像中剪切一个矩形,并将其保存为单独的图片 编辑:有关解决方案,请参阅已接受的答案。更新 我又读了一遍你的问题,这可能更接近你的问题。我不太了解如何使用坐标,但此方法将获取位图图像,将其旋转一个角度,并以指定的宽度和高度从开始的X,Y值保存裁剪版本。可能不是100%喜欢你正在尝试做的事情,但希望你能运用这个想法 public void RotateAndSaveImage(BitmapImage sourceImage,

我正在寻找一种旋转图像的方法,以便在该图像中剪切一个矩形,并将其保存为单独的图片


编辑:有关解决方案,请参阅已接受的答案。

更新
我又读了一遍你的问题,这可能更接近你的问题。我不太了解如何使用坐标,但此方法将获取位图图像,将其旋转一个角度,并以指定的宽度和高度从开始的X,Y值保存裁剪版本。可能不是100%喜欢你正在尝试做的事情,但希望你能运用这个想法

public void RotateAndSaveImage(BitmapImage sourceImage,
                               double angle,
                               int startX,
                               int startY,
                               int width,
                               int height,
                               string filePath)
{
    TransformGroup transformGroup = new TransformGroup();
    RotateTransform rotateTransform = new RotateTransform(angle);
    rotateTransform.CenterX = sourceImage.PixelWidth / 2.0;
    rotateTransform.CenterY = sourceImage.PixelHeight / 2.0;
    transformGroup.Children.Add(rotateTransform);
    TranslateTransform translateTransform = new TranslateTransform();
    translateTransform.X = -startX;
    translateTransform.Y = -startY;
    transformGroup.Children.Add(translateTransform);

    DrawingVisual vis = new DrawingVisual();
    DrawingContext cont = vis.RenderOpen();
    cont.PushTransform(transformGroup);
    cont.DrawImage(sourceImage, new Rect(new Size(sourceImage.PixelWidth, sourceImage.PixelHeight)));
    cont.Close();

    RenderTargetBitmap rtb = new RenderTargetBitmap(width, height, 96d, 96d, PixelFormats.Default);
    rtb.Render(vis);

    FileStream stream = new FileStream(filePath, FileMode.Create);
    PngBitmapEncoder encoder = new PngBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(rtb));
    encoder.Save(stream);
    stream.Close();
}
谢谢你的帖子,我不得不稍微修改一下功能:

    private static double RadianToDegree(double angle)
    {
        return angle * (180.0 / Math.PI);
    }

    public static double GetDistanceBetweenPoints(Point p, Point q)
    {
        var a = p.X - q.X;
        var b = p.Y - q.Y;
        return Math.Sqrt(a * a + b * b);
    }

    private static double CalculateTheta(Point p1, Point p2)
    {
        var deltaX = Math.Abs(p1.Y - p2.Y);
        var deltaY = Math.Abs(p1.X - p2.X);
        var theta = RadianToDegree(Math.Atan(deltaY / deltaX));
        return (90 - theta) * -1;
    }

    public void RotateAndSaveImage(string sourceFile, List<Point> subCoords)
    {
        var bitmap = new BitmapImage();
        bitmap.BeginInit();
        bitmap.UriSource = new Uri(sourceFile);
        bitmap.EndInit();

        var p1 = subCoords[0];
        var p2 = subCoords[1];
        var p4 = subCoords[3];

        var theta = CalculateTheta(p1, p2);
        var width = GetDistanceBetweenPoints(p1, p2);
        var height = GetDistanceBetweenPoints(p1, p4);

        var transformGroup = new TransformGroup();
        var rotateTransform = new RotateTransform(theta)
        {
            CenterX = p1.X,
            CenterY = p1.Y
        };
        transformGroup.Children.Add(rotateTransform);

        var translateTransform = new TranslateTransform
        {
            X = -p1.X,
            Y = -p1.Y
        };

        transformGroup.Children.Add(translateTransform);

        var vis = new DrawingVisual();

        using (var cont = vis.RenderOpen())
        {
            cont.PushTransform(transformGroup);
            cont.DrawImage(bitmap, new Rect(
                new Size(bitmap.PixelWidth, bitmap.PixelHeight)));
        }

        var rtb = new RenderTargetBitmap((int)width, (int)height,
            96d, 96d, PixelFormats.Default);
        rtb.Render(vis);

        using (var stream = new FileStream(TargetFile, FileMode.Create))
        {
            var encoder = new JpegBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(rtb));
            encoder.Save(stream);
        }
    }
专用静态双弧度ToDegree(双角度)
{
返回角*(180.0/数学PI);
}
公共静态双GetDistanceBetweenPoints(点p、点q)
{
var a=p.X-q.X;
var b=p.Y-q.Y;
返回Math.Sqrt(a*a+b*b);
}
专用静态双重计算TA(点p1、点p2)
{
var deltaX=数学绝对值(p1.Y-p2.Y);
var deltaY=Math.Abs(p1.X-p2.X);
varθ=弧度度数(数学Atan(deltaY/deltaX));
返回(90θ)*-1;
}
public void RotateAndSaveImage(字符串源文件,列表子目录)
{
var bitmap=新的位图();
bitmap.BeginInit();
bitmap.UriSource=新Uri(sourceFile);
EndInit();
var p1=子目录[0];
var p2=子目录[1];
var p4=亚音阶[3];
varθ=计算出的θ(p1,p2);
var width=GetDistanceBetweenPoints(p1,p2);
变量高度=获取点之间的距离(p1,p4);
var transformGroup=new transformGroup();
var rotateTransform=新的rotateTransform(θ)
{
CenterX=p1.X,
CenterY=p1.Y
};
transformGroup.Children.Add(rotateTransform);
var translateTransform=新translateTransform
{
X=-p1.X,
Y=-p1.Y
};
transformGroup.Children.Add(translateTransform);
var vis=新绘图可视化();
使用(var cont=vis.RenderOpen())
{
cont.PushTransform(transformGroup);
cont.DrawImage(位图,新矩形(
新大小(bitmap.PixelWidth、bitmap.PixelHeight));
}
var rtb=新的RenderTargetBitmap((int)宽度,(int)高度,
96d,96d,PixelFormats.Default);
rtb.渲染(vis);
使用(var stream=newfilestream(TargetFile,FileMode.Create))
{
var encoder=新的JpegBitmapEncoder();
Add(BitmapFrame.Create(rtb));
编码器。保存(流);
}
}
上面的代码工作得很好。没有你的帮助,我永远不会完成这件事