簡體   English   中英

如何在Windows Phone 8.1 SDK中以編程方式捕獲屏幕?

[英]How to capture screen programatically in windows phone 8.1 SDK?

任何想法如何從代碼中捕獲SDK 8.1 windows手機中的屏幕? 對於Windows Phone 7.5我已經看過代碼並試圖使用,但它失敗了。 :(

您可以使用RenderTargetBitmap並將其傳遞給表示頁面的FrameworkElement,然后從中呈現位圖。

private async Task<RenderTargetBitmap> CreateBitmapFromElement(FrameworkElement uielement)
{
    try
    {
        var renderTargetBitmap = new RenderTargetBitmap();
        await renderTargetBitmap.RenderAsync(uielement);

        return renderTargetBitmap;
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex);
    }

    return null;
}

嘗試類似的東西:

private async void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
    this.imagePreview.Source = await CreateBitmapFromElement(this);
}

頁面上的XAML是:

<Grid x:Name="controlsGrid">
    <Button Click="ButtonBase_OnClick">take screenshot</Button>
    <Image x:Name="imagePreview"
           Height="200" VerticalAlignment="Bottom"
           Stretch="UniformToFill" />
</Grid>

要將渲染圖像保存為圖像文件,我們必須將其發送到流,將其編碼為我們想要的文件類型。

這是我們可以使用的方法(它包含一個UI元素,一個流和一個Guid):

//Creates RenderTargetBitmap from UI Element 
 async Task<RenderTargetBitmap> CaptureToStreamAsync(FrameworkElement uielement, IRandomAccessStream stream, Guid encoderId)
  {
      try
      {
          var renderTargetBitmap = new RenderTargetBitmap();
          await renderTargetBitmap.RenderAsync(uielement);
          var pixels = await renderTargetBitmap.GetPixelsAsync();
          var logicalDpi = DisplayInformation.GetForCurrentView().LogicalDpi;
          var encoder = await BitmapEncoder.CreateAsync(encoderId, stream);
          encoder.SetPixelData(
              BitmapPixelFormat.Bgra8,
              BitmapAlphaMode.Ignore,
              (uint)renderTargetBitmap.PixelWidth,
              (uint)renderTargetBitmap.PixelHeight,
              logicalDpi,
              logicalDpi,
              pixels.ToArray());

          await encoder.FlushAsync();
          return renderTargetBitmap;        
  }

然后,我們可以使用Windows Phone 8.1上的FileSavePicker類來確定文件類型,名稱和保存位置。

void CreateFileSavePicker()
    {
        //Create the picker object
        FileSavePicker savePicker = new FileSavePicker();

        // Dropdown of file types the user can save the file as   
        savePicker.FileTypeChoices.Add
            (
            "Image", new List<string>() { ".jpg" });
        // Default file name if the user does not type one in or select // a file to replace
        savePicker.SuggestedFileName = "Screenshot";
        savePicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary; 

        //// Open the picker for the user to pick a file
        savePicker.ContinuationData["Operation"] = "SomeDataOrOther";
        savePicker.PickSaveFileAndContinue();

    }

當用戶選擇文件位置時,它將返回到ContinueFileSavePicker。

public async void      ContinueFileSavePicker(Windows.ApplicationModel.Activation.FileSavePickerContinu ationEventArgs args)
 {
        StorageFile file = args.File;
        if (file != null)
{
            // Prevent updates to the remote version of the file until we finish making changes and call CompleteUpdatesAsync.
            CachedFileManager.DeferUpdates(file);

            Guid encoderId = BitmapEncoder.JpegEncoderId;

            try
            {
                using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
                {
                    await CaptureToStreamAsync(LayoutRoot, stream, encoderId);

                }
            }
            catch (Exception ex)
            {
                DisplayMessage(ex.Message);
            }
}
}

更多細節在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM