【问题标题】:UWP The specified buffer index is not within the buffer capacityUWP 指定的缓冲区索引不在缓冲区容量之内
【发布时间】:2019-09-04 03:09:32
【问题描述】:

当我尝试这样做时遇到了这个异常:

        var pixels = await bitmap.GetPixelsAsync();
        byte[] bytes = pixels.ToArray();

它发生在pixels.ToArray()here 的信息对我帮助不大。我只知道我的像素的长度和容量为 0,但我不知道为什么以及如何解决这个问题。

这段代码的上下文:

    public static async Task<string> SaveThumbnail(UIElement image, bool isCurrent)
    {
        var bitmap = new RenderTargetBitmap();
        try
        {
            await bitmap.RenderAsync(image);
        }
        catch (ArgumentException)
        {
            return "";
        }
        var pixels = await bitmap.GetPixelsAsync();
        byte[] bytes = pixels.ToArray();
        // some other code
    }

这里调用了这个函数:

    public static async Task<Brush> GetThumbnailMainColor(UIElement image, bool isCurrent)
    {
        var filename = await SaveThumbnail(image, isCurrent);
        var file = await ThumbnailFolder.GetFileAsync(filename);
        return await ColorHelper.GetThumbnailMainColor(file);
    }

它在这里被调用:

        thumbnail.Source = thumbnails.Count == 0 ? Helper.DefaultAlbumCover : thumbnails[random.Next(thumbnails.Count)];
        grid.Background = await Helper.GetThumbnailMainColor(thumbnail, false);

我在通话之前设置了Image 源,我很确定我可以看到缩略图中显示的图像。那么为什么我会得到 0-Capacity 像素呢?

【问题讨论】:

  • 会不会是因为你在try块中调用了RenderAsync? (可能是范围限制?)。根据文档,RenderAsync 不应该抛出异常,因此您可以删除您的 try 块。
  • @Antoine 我也不知道为什么它有时会给我一个ArgumentException,所以我必须保留它。我猜该图像正在其他地方使用并且无法使用,这可能会导致该异常。

标签: c# uwp bitmap win-universal-app rendertargetbitmap


【解决方案1】:

可能是你在设置了缩略图的来源(是图像控件吗?)之后渲染RenderTargetBitmap太快了,而界面上还没有渲染图像,导致你在@987654322里面看不到图像@。

试试这个:

thumbnail.Source = thumbnails.Count == 0 ? Helper.DefaultAlbumCover : thumbnails[random.Next(thumbnails.Count)];
thumbnail.Loaded += async (_s,_e) =>
{
    grid.Background = await Helper.GetThumbnailMainColor(thumbnail, false);
}

最好的问候。

【讨论】:

  • 谢谢!这个解决方案有效!但是为什么我没有把它放在Image的xaml中呢?就像我做&lt;Image Loaded="Thumbnail_Loaded"/&gt; 一样,我仍然遇到同样的异常。如果您的代码在DataTemplate 中,我该如何使用它?
  • 具体来说,如果我在转换器中设置缩略图源,我如何随后设置grid.background?
  • 如果是你后面的问题,可以考虑设置一个Converter外部可以访问的静态变量,监听这个变量的值,条件为时重新绑定Image的Loaded事件遇见了。设置源后更改此静态变量的值。但是我不知道你是怎么写代码的,而且Image没有提供SourceChanged事件,所以我觉得在DataTemplate中动态实现RenderTargetBitmap不是一个好主意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
  • 2011-02-11
相关资源
最近更新 更多