UWP

时间:2016-09-20 00:44:00

标签: uwp

我发现了这个:Width and Height of the Image in RenderTargetBitmap in WPF但是WPF而不是UWP。

RenderTargetBitmap类具有不接受宽度和高度的RenderAsync方法以及具有宽度和高度的同名方法。宽度和高度不会做任何我期望的事情。例如,

  • 不使用宽度和高度,我的网格渲染为2342 x 1262,输出文件的比例与我在屏幕上看到的相同。

  • 使用宽度和高度20000 x 10777,我的网格渲染为4096 x 2208。

  • 使用3000 x 1616的宽度和高度,我的网格仍然以4096 x 2207渲染。

  • 使用宽度和高度3000 x 4000,我的网格渲染为3072 x 4096.

  • 使用1000 x 538的宽度和高度,我的网格渲染为1500 x 807。

所以数字做了一些事情,但我无法弄清楚用什么规则来选择RenderTargetBitmap的最终PixelWidth和PixelHeight。它们看起来像是最小的。

这是我的渲染方法,以防万一我做错了。请注意,我尝试采用建议的输入大小,并使它们与渲染时的大小成比例,而不是给出大小。另外值得注意的是,input元素是一个Grid,它包含在屏幕上的ViewBox元素中......

    private async Task CreateSaveBitmapAsync( UIElement Element, int SuggestedWidth, int SuggestedHeight )
    {
        if (Element != null)
        {
            RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap();
            await renderTargetBitmap.RenderAsync( Element );

            double WidthRatio = renderTargetBitmap.PixelWidth / (double)renderTargetBitmap.PixelHeight;

            if( WidthRatio >= 1 )
                SuggestedHeight = (int)( SuggestedWidth / WidthRatio );
            else
                SuggestedWidth = (int)( SuggestedHeight * WidthRatio );

            await renderTargetBitmap.RenderAsync( Element, SuggestedWidth, SuggestedHeight );

            var picker = new FileSavePicker();
            picker.FileTypeChoices.Add("PNG Image", new string[] { ".png" });
            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.PngEncoderId, stream);
                    byte[] bytes = pixels.ToArray();
                    encoder.SetPixelData(BitmapPixelFormat.Bgra8,
                                         BitmapAlphaMode.Ignore,
                                         (uint)renderTargetBitmap.PixelWidth, (uint)renderTargetBitmap.PixelHeight,
                                         96, 96, bytes);

                    await encoder.FlushAsync();
                }
            } 
        }
    }

仔细查看文档后,我发现内置的最大大小无法超出。所以我很困惑为什么图像创建的大于我传入的数字。这些是最小的吗?

2 个答案:

答案 0 :(得分:2)

我最近自己遇到过这个问题,发现RenderTargetBitmap受到显示器当前DPI设置的影响。

根据您提供的值,我可以假设您的DPI为150%。我不知道最大4096x4096尺寸,但看起来这是另一个需要考虑的参数。

在我的情况下,我需要图像为特定大小(对于实时图块),所以我检查渲染的位图大小,如果它与我的预期大小不匹配,我将在代码中调整它的大小。如果您需要代码,请告诉我。

答案 1 :(得分:1)

根据以下页面,它是DirectX的限制。 MSDN