2017-10-05 33 views
0

私はUWPで初めてです。私の最初のタスクは想像力です。今は想像線を描く動的矩形を作成する方法を見つけようとしています。 p.s.悪い文法には申し訳ありません。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

あなたのコードを表示してください、あなたは何を試してみましたか? –

+1

イメージして、あなたが望むものを教えてもらえますか? – lindexi

+0

@lindexi私のプログラムは、ファイルを開くためにボタンを持っている必要がありますし、画面上でユーザーが変更または移動することができる動的矩形でなければならず、ユーザーが「保存」ボタンを押すと矩形サイズとしてクロップされます – Fr13nd

答えて

0

ポインタが動いているときに、動的矩形を作成する必要があります。したがって、ルートパネルコントロールにポインタ関連のイベントを登録することができます。

次に、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

+0

ありがとう、私を助けることができる部分は、実際には、私はすでにいくつかの詳細を追加しましたが、助けてくれてありがとう。 – Fr13nd

関連する問題