我发现了这个: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();
}
}
}
}
仔细查看文档后,我发现内置的最大大小无法超出。所以我很困惑为什么图像创建的大于我传入的数字。这些是最小的吗?
答案 0 :(得分:2)
我最近自己遇到过这个问题,发现RenderTargetBitmap受到显示器当前DPI设置的影响。
根据您提供的值,我可以假设您的DPI为150%。我不知道最大4096x4096尺寸,但看起来这是另一个需要考虑的参数。
在我的情况下,我需要图像为特定大小(对于实时图块),所以我检查渲染的位图大小,如果它与我的预期大小不匹配,我将在代码中调整它的大小。如果您需要代码,请告诉我。
答案 1 :(得分:1)
根据以下页面,它是DirectX的限制。 MSDN