首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UWP中使用RenderTargetBitmap时的错误

UWP中使用RenderTargetBitmap时的错误
EN

Stack Overflow用户
提问于 2015-12-10 08:26:44
回答 2查看 1.3K关注 0票数 5

我正在尝试创建一个位图图像,并有以下代码:

代码语言:javascript
复制
RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap();
await renderTargetBitmap.RenderAsync(uielement);

IBuffer pixels = await renderTargetBitmap.GetPixelsAsync();

. . .

var pixelArray = pixels.ToArray();

为了获得ToArray()扩展,我遇到了this问题。所以我补充道:

代码语言:javascript
复制
using System.Runtime.InteropServices.WindowsRuntime; // For ToArray

我的密码。但是,当我运行时,会得到以下错误:

引发的异常:“System.ArgumentException”在System.Runtime.WindowsRuntime.dll中 附加信息:指定的缓冲区索引不在缓冲区容量之内。

当我钻研细节时,它在Stack跟踪中写道:

在>System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions.ToArray(IBuffer源代码,UInt32 sourceIndex,Int32计数)

这种提取像素阵列的方法是否仍然适用于UWP?如果是的话,有没有办法从这个错误消息中获得更多的细节?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-16 10:50:36

这种提取像素阵列的方法绝对适用于UWP。至于错误,反编译的ToArray()如下所示:

代码语言:javascript
复制
public static byte[] ToArray(this IBuffer source)
{
  if (source == null)
    throw new ArgumentNullException("source");
  return WindowsRuntimeBufferExtensions.ToArray(source, 0U, checked ((int) source.Length));
}

换句话说,它调用接受开始索引和长度的ToArray重载:

代码语言:javascript
复制
public static byte[] ToArray(this IBuffer source, uint sourceIndex, int count)
{
  if (source == null)
    throw new ArgumentNullException("source");
  if (count < 0)
    throw new ArgumentOutOfRangeException("count");
  if (sourceIndex < 0U)
    throw new ArgumentOutOfRangeException("sourceIndex");
  if (source.Capacity <= sourceIndex)
    throw new ArgumentException(SR.GetString("Argument_BufferIndexExceedsCapacity"));
  if ((long) (source.Capacity - sourceIndex) < (long) count)
    throw new ArgumentException(SR.GetString("Argument_InsufficientSpaceInSourceBuffer"));
  byte[] destination = new byte[count];
  WindowsRuntimeBufferExtensions.CopyTo(source, sourceIndex, destination, 0, count);
  return destination;
}

这句话几乎肯定会引起你的问题:

代码语言:javascript
复制
  if (source.Capacity <= sourceIndex)
    throw new ArgumentException(SR.GetString("Argument_BufferIndexExceedsCapacity"));

...and,因为sourceIndex必然是0,这意味着source.Capacity也是0。

我建议您在代码中添加一些工具来检查IBuffer

代码语言:javascript
复制
RenderTargetBitmap rtb = new RenderTargetBitmap();
await rtb.RenderAsync(element);

IBuffer pixelBuffer = await rtb.GetPixelsAsync();
Debug.WriteLine($"Capacity = {pixelBuffer.Capacity}, Length={pixelBuffer.Length}");
byte[] pixels = pixelBuffer.ToArray();

我认为您的问题可能发生在ToArray调用之前。我在自己的UWP应用程序中使用了完全相同的序列,获得了如下所示的调试输出:

代码语言:javascript
复制
Capacity = 216720, Length=216720
票数 1
EN

Stack Overflow用户

发布于 2018-12-25 10:01:30

当我试图在UWP应用程序中制作截图时,也遇到了同样的问题。

代码语言:javascript
复制
RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap();
await renderTargetBitmap.RenderAsync(uielement);

uielementWindow.Current.Content时,给了我这个例外。

但当我试着

代码语言:javascript
复制
RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap();
await renderTargetBitmap.RenderAsync(null);

同样的代码也不例外,给出了UWP应用程序窗口的截图。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34196927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档