【问题标题】:How do I correctly transform an image in WPF?如何正确转换 WPF 中的图像?
【发布时间】:2016-03-17 03:42:28
【问题描述】:

我想编写功能类似于 PhotoShop 的程序。

1.上传图片

2.然后我想做skew transform,但是我做transform的时候有问题,我的图片超出了工作空间的边缘 如何在没有这个问题的情况下进行转换(我认为每次进行转换时都应该创建一个新图像)。

然后我裁剪,但是裁剪使图片没有变换。我认为如果我每次进行变换时都创建一个新图像,那么问题将得到解决。

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

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

【问题讨论】:

    标签: c# wpf image xaml


    【解决方案1】:

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

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

    <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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 2011-06-05
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      相关资源
      最近更新 更多