Неккоректное сохранение Grid в изображение из-за DPI

Wolfed

Добрый день. Сохраняю Grid в изображение с помощью RenderTargetBitmap. Вот кусок кода:

RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap();
await renderTargetBitmap.RenderAsync(Grid);

var picker = new FileSavePicker();
picker.FileTypeChoices.Add("JPEG Image", new string[] { ".jpg" });
StorageFile file = await picker.PickSaveFileAsync();
if (file != null)
{
    var pixels = await renderTargetBitmap.GetPixelsAsync();

    using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite))
    {
        var encoder = await
            BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, stream);
        byte[] bytes = pixels.ToArray();
        encoder.SetPixelData(BitmapPixelFormat.Bgra8,
                             BitmapAlphaMode.Ignore,
                             (****)Grid.Width, (****)Grid.Height,
                             ******************.GetForCurrentView().LogicalDpi,
                             ******************.GetForCurrentView().LogicalDpi,
                             bytes);
        await encoder.FlushAsync();
    }
}

На устройстве с DPI = 96 сохраняет корректно, на устройстве со 120 - непонятная вещь, подобная как здесь: https://stackoverflow.com/questions/29574481/image-being-saved-from-canvas-is-not-rendered-properly . Из-за чего это может быть?

1 ответ

Wolfed

Проблему решил следующим образом: Заменил это:

encoder.SetPixelData(BitmapPixelFormat.Bgra8,
                         BitmapAlphaMode.Ignore,
                         (****)Grid.Width, (****)Grid.Height,
                         ******************.GetForCurrentView().LogicalDpi,
                         ******************.GetForCurrentView().LogicalDpi,
                         bytes);

На это:

encoder.SetPixelData(BitmapPixelFormat.Bgra8,
                     BitmapAlphaMode.Ignore,
                    (****)renderTargetBitmap.PixelWidth,
                    (****)renderTargetBitmap.PixelHeight,
                    ******************.GetForCurrentView().LogicalDpi,
                    ******************.GetForCurrentView().LogicalDpi, bytes);

licensed under cc by-sa 3.0 with attribution.