UWP创建动态矩形

时间:2017-10-05 06:53:16

标签: c# xaml uwp

我是UWP的新手,我的第一个任务是作物想象,现在我正试图找到如何创建一个动态矩形来裁剪想象 附:对不起语法我很抱歉。

我的程序必须有按钮才能打开文件,然后在屏幕上必须是动态矩形,用户可以更改或移动,当用户按“保存”按钮图像将裁剪为矩形大小 有我的C#代码 感谢)

namespace Crop1
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }

        SoftwareBitmap softwareBitmap;
        private async void OpenFile(object sender, RoutedEventArgs e)
        {
            FileOpenPicker fileOpenPicker = new FileOpenPicker();
            fileOpenPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
            fileOpenPicker.FileTypeFilter.Add(".jpg");
            fileOpenPicker.ViewMode = PickerViewMode.Thumbnail;

            var inputFile = await fileOpenPicker.PickSingleFileAsync();

            if (inputFile == null)
            {
                // The user cancelled the picking operation
                return;
            }

            using (IRandomAccessStream stream = await inputFile.OpenAsync(FileAccessMode.Read))
            {
                // Create the decoder from the stream
                BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);

                // Get the SoftwareBitmap representation of the file
                softwareBitmap = await decoder.GetSoftwareBitmapAsync();
            }
            if (softwareBitmap.BitmapPixelFormat != BitmapPixelFormat.Bgra8 ||
    softwareBitmap.BitmapAlphaMode == BitmapAlphaMode.Straight)
            {
                softwareBitmap = SoftwareBitmap.Convert(softwareBitmap, BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied);
            }

            var source = new SoftwareBitmapSource();
            await source.SetBitmapAsync(softwareBitmap);

            // Set the source of the Image control
            //imageControl.Source = source;

            p1rect1.Fill = new ImageBrush
            {
                ImageSource = source
            };
        }

        private async void Save(object sender, RoutedEventArgs e)
        {
            FileSavePicker fileSavePicker = new FileSavePicker();
            fileSavePicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
            fileSavePicker.FileTypeChoices.Add("JPEG files", new List<string>() { ".jpg"  , ".png"});
            fileSavePicker.SuggestedFileName = "image";

            var outputFile = await fileSavePicker.PickSaveFileAsync();

            if (outputFile == null)
            {
                // The user cancelled the picking operation
                return;
            }
            // SoftwareBitmap softwareBitmap;
            // BitmapDecoder decoder = await BitmapDecoder.CreateAsync(imageControl);



            SaveSoftwareBitmapToFile(softwareBitmap, outputFile);

        }
        private async void SaveSoftwareBitmapToFile(SoftwareBitmap softwareBitmap, StorageFile outputFile)
        {
            using (IRandomAccessStream stream = await outputFile.OpenAsync(FileAccessMode.ReadWrite))
            {
                // Create an encoder with the desired format
                BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, stream);

                // Set the software bitmap
                encoder.SetSoftwareBitmap(softwareBitmap);

                //// Set additional encoding parameters, if needed
                //encoder.BitmapTransform.ScaledWidth = 320;
                //encoder.BitmapTransform.ScaledHeight = 240;
               //  encoder.BitmapTransform.Rotation = Windows.Graphics.Imaging.BitmapRotation.Clockwise90Degrees;
                encoder.BitmapTransform.InterpolationMode = BitmapInterpolationMode.Fant;
                encoder.IsThumbnailGenerated = true;

                try
                {
                    await encoder.FlushAsync();
                }
                catch (Exception err)
                {
                    switch (err.HResult)
                    {
                        case unchecked((int)0x88982F81): //WINCODEC_ERR_UNSUPPORTEDOPERATION
                                                         // If the encoder does not support writing a thumbnail, then try again
                                                         // but disable thumbnail generation.
                            encoder.IsThumbnailGenerated = false;
                            break;
                        default:
                            throw err;
                    }
                }

                if (encoder.IsThumbnailGenerated == false)
                {
                    await encoder.FlushAsync();
                }


            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您需要在指针移动时创建动态矩形。因此,您可以为根面板控件注册指针相关事件。

然后,您可以使用RenderTargetBitmap类生成剪切图片并保存。

我已经提供了一个代码示例供您参考:

<Canvas PointerMoved="Grid_PointerMoved" PointerReleased="Grid_PointerReleased" PointerPressed="Grid_PointerPressed">
    <Image x:Name="image">
    </Image>
    <Rectangle x:Name="rect" StrokeThickness="4" Stroke="#FFEA18A7" Visibility="Collapsed"/>
</Canvas>
    PointerPoint Point1, Point2;
    SoftwareBitmap softwareBitmap;
    private async void OpenFile()
    {
        FileOpenPicker fileOpenPicker = new FileOpenPicker();
        fileOpenPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
        fileOpenPicker.FileTypeFilter.Add(".jpg");
        fileOpenPicker.ViewMode = PickerViewMode.Thumbnail;

        var inputFile = await fileOpenPicker.PickSingleFileAsync();

        if (inputFile == null)
        {
            // The user cancelled the picking operation
            return;
        }

        using (IRandomAccessStream stream = await inputFile.OpenAsync(FileAccessMode.Read))
        {
            // Create the decoder from the stream
            BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);

            // Get the SoftwareBitmap representation of the file
            softwareBitmap = await decoder.GetSoftwareBitmapAsync();
        }
        if (softwareBitmap.BitmapPixelFormat != BitmapPixelFormat.Bgra8 ||
softwareBitmap.BitmapAlphaMode == BitmapAlphaMode.Straight)
        {
            softwareBitmap = SoftwareBitmap.Convert(softwareBitmap, BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied);
        }

        var source = new SoftwareBitmapSource();
        await source.SetBitmapAsync(softwareBitmap);

        image.Source = source;
    }

    private void Grid_PointerPressed(object sender, PointerRoutedEventArgs e)
    {
        Point1 = e.GetCurrentPoint(image);
    }

    private void Grid_PointerMoved(object sender, PointerRoutedEventArgs e)
    {
        Point2 = e.GetCurrentPoint(image);
    }

    private async void Grid_PointerReleased(object sender, PointerRoutedEventArgs e)
    {
        Point2 = e.GetCurrentPoint(image);
        rect.Visibility = Visibility.Visible;
        rect.Width = (int)Math.Abs(Point2.Position.X - Point1.Position.X);
        rect.Height = (int)Math.Abs(Point2.Position.Y - Point1.Position.Y);
        rect.SetValue(Canvas.LeftProperty, (Point1.Position.X < Point2.Position.X) ? Point1.Position.X : Point2.Position.X);
        rect.SetValue(Canvas.TopProperty, (Point1.Position.Y < Point2.Position.Y) ? Point1.Position.Y : Point2.Position.Y);
        await Task.Delay(100);
        RectangleGeometry geometry = new RectangleGeometry();
        geometry.Rect = new Rect(Point1.Position,Point2.Position);
        image.Clip = geometry;
    }

    private async void Save()
    {
        RenderTargetBitmap bitmap = new RenderTargetBitmap();
        await bitmap.RenderAsync(image);
        var pixelbuffer = await bitmap.GetPixelsAsync();
        var savefolder = ApplicationData.Current.LocalFolder;
        var savefile = await savefolder.CreateFileAsync("snapshot.png",CreationCollisionOption.GenerateUniqueName);
        using (var filestream = await savefile.OpenAsync(FileAccessMode.ReadWrite))
        {
            var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId,filestream);
            encoder.SetPixelData(BitmapPixelFormat.Bgra8,BitmapAlphaMode.Ignore,(uint)bitmap.PixelWidth,(uint)bitmap.PixelHeight,DisplayInformation.GetForCurrentView().LogicalDpi,DisplayInformation.GetForCurrentView().LogicalDpi,pixelbuffer.ToArray());
            await encoder.FlushAsync();
        }
    }

enter image description here