C# WPF图像裁剪

C# WPF图像裁剪,c#,wpf,image,crop,C#,Wpf,Image,Crop,我对图像裁剪有问题。当我尝试用矩形裁剪图像时,裁剪区域被设置为一些奇怪的值。 以下是xaml代码: <Grid Name="GridImage"> <Image Name="LoadedImage" SnapsToDevicePixels="True" RenderOptions.BitmapScalingMode="HighQuality"> </Image> <Canvas x:Name="Im

我对图像裁剪有问题。当我尝试用矩形裁剪图像时,裁剪区域被设置为一些奇怪的值。 以下是xaml代码:

   <Grid Name="GridImage">
        <Image Name="LoadedImage" SnapsToDevicePixels="True" RenderOptions.BitmapScalingMode="HighQuality">
        </Image>
        <Canvas  x:Name="ImageCanvas" ClipToBounds="True">
            <Rectangle x:Name="SelectionRectangle" Stroke="LightBlue" Fill="#220000FF" Visibility="Collapsed" />
        </Canvas>
  </Grid>
有人知道怎么解决吗

以下是裁剪前的外观:

裁剪后的外观:


最有可能的问题是图像分辨率,例如300 dpi,而屏幕分辨率(最有可能是96 dpi)。你检查过图像的像素宽度和像素高度了吗?

如果没有可靠地再现你的问题的好方法,就不可能确定你需要什么答案。最可能的情况是,您根本不应该创建新位图,而是应该依赖
Image
元素的变换选项来简单地约束原始位图在屏幕上的显示方式。请提供一个好的MCVE,并准确解释该代码现在做什么以及您希望它做什么。我的PixelWidth=1920,PixelHeight=1080,dpiX=72,dpiY=72,PixelFormat为BGR32。但是为什么使用ratioX和ratioY不能进行正确的裁剪?我需要将图像转换为屏幕分辨率还是有其他解决方案?另外,我的应用程序应该处理数千张图像,并将每个图像转换为屏幕分辨率,这将是非常缓慢的解决方案,谢谢。这很有帮助。@Anton您不需要转换图像,只需考虑不同的屏幕和图像DPI重新计算裁剪矩形坐标即可。
            var imagePosition = LoadedImage.TransformToAncestor(GridImage).Transform(new Point(0, 0));
            Rect rect1 = new Rect(Math.Max(Canvas.GetLeft(SelectionRectangle) - imagePosition.X, 0), Math.Max(Canvas.GetTop(SelectionRectangle) - imagePosition.Y, 0), SelectionRectangle.Width, SelectionRectangle.Height);
            var ratioX = LoadedImage.Source.Width / LoadedImage.ActualWidth;
            var ratioY = LoadedImage.Source.Height / LoadedImage.ActualHeight;


            Int32Rect rcFrom = new Int32Rect
            {
                X = (int)(rect1.X * ratioX),
                Y = (int)(rect1.Y * ratioY),
                Width = (int)(rect1.Width * ratioX),
                Height = (int)(rect1.Height * ratioY)
            };
            try
            {
                BitmapSource bs = new CroppedBitmap((BitmapSource)LoadedImage.Source, rcFrom);
                LoadedImage.Source = bs;
                SetImageStretch(LoadedImage);
                SetElementVisibility(Visibility.Hidden, Visibility.Visible, SelectionRectangle);
            }


    private void SetImageStretch(Image image)
    {
        if (image.Source.Width > image.ActualWidth || image.Source.Height > image.ActualHeight)
            image.Stretch = Stretch.Uniform;
        else image.Stretch = Stretch.None;
    }