如何在WPF中正确转换图像?

时间:2015-12-11 09:21:21

标签: c# wpf image xaml

我想编写像PhotoShop这样功能的程序。

1.upload image

enter image description here  2.然后我想做偏斜变换,但是当我做变换时我遇到了问题,我的图片超出了工作区的边缘。enter image description here 如何在没有这个问题的情况下进行转换(我想每次进行转换时都应该创建一个新的图像)。

然后我裁剪,但裁剪使得图片没有变换。我想如果每次进行转换时都会创建一个新图像,问题就会解决。

我该如何正确地做到这一点?

如何在WPF中正确创建此图像?如何变换和保存图像?我正在使用(System.Drawing.Bitmap,System.Windows.Media.Imaging)也许,有人可以向我展示经验,代码或有用的材料吗?

1 个答案:

答案 0 :(得分:2)

对于倾斜变换,您可以使用MatrixTranform。基本思想描述为here

下面是转换位于“D:\ input.png”的图像的代码,将转换结果附加到.xaml文件中定义的Image源:

<Image Name="imgProcess" /> 

并将结果写入文件“D:\ skew.png”

        double skewX = .0;
        double skewY = Math.Tan(Math.PI / 18);
        MatrixTransform transformation = new MatrixTransform(1, skewY, skewX, 1, 0, 0)

        BitmapImage image = new BitmapImage(new Uri(@"D:\input.png"));
        var boundingRect = new Rect(0, 0, image.Width + image.Height * skewX, image.Height + image.Width * skewY);
        DrawingGroup dGroup = new DrawingGroup();
        using (DrawingContext dc = dGroup.Open())
        {
            dc.PushTransform(transformation);

            dc.DrawImage(image, boundingRect);
        }


        DrawingImage imageSource = new DrawingImage(dGroup);


        imgProcess.Source = imageSource;

        SaveDrawingToFile(ToBitmapSource(imageSource), @"D:\skew.png", (int)boundingRect.Width, (int)boundingRect.Height);

    private BitmapSource ToBitmapSource(DrawingImage source)
    {
        DrawingVisual drawingVisual = new DrawingVisual();
        DrawingContext drawingContext = drawingVisual.RenderOpen();
        drawingContext.DrawImage(source, new Rect(new Point(0, 0), new Size(source.Width, source.Height)));
        drawingContext.Close();

        RenderTargetBitmap bmp = new RenderTargetBitmap((int)source.Width, (int)source.Height, 96, 96, PixelFormats.Pbgra32);
        bmp.Render(drawingVisual);
        return bmp;
    }


    private void SaveDrawingToFile(BitmapSource image, string fileName, int width, int height)
    {
        var encoder = new PngBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(image));

        using (var stream = new FileStream(fileName, FileMode.Create))
        {
            encoder.Save(stream);
        }
    }

Results