【问题标题】:How to efficiently convert IList<byte> to byte[]?如何有效地将 IList<byte> 转换为 byte[]?
【发布时间】:2018-10-11 19:24:28
【问题描述】:

我无法有效地将IList&lt;byte&gt; 转换为byte[]。我正在使用 Xamarin Studio 和 OpenCV 来处理图像和 Fotoapparat 来拍照。 我想将列表转换为数组,因为 OpenCV 需要一个数组而不是列表。我知道使用ToArray() 转换的“简单”方法,但它需要太多时间(转换超过 8-9 秒)。作为参考,我的IList&lt;byte&gt; 的长度为 5564448。

有谁知道如何有效地将IList&lt;byte&gt; 转换为byte[]

【问题讨论】:

  • 一开始为什么要在 List 中存储 5 MB 的数据?
  • 不知道实现 IList 的具体类。据我们所知,它可能是一个 FileStream - 因此转换成本与底层接口实现有关。
  • 我怀疑有没有更好的方法。你查过源代码吗?
  • 您的IList&lt;T&gt; 似乎对CopyTo 的实现很慢,因为ToArray 使用的是这种方式。但是您没有告诉我们您正在使用IList&lt;T&gt; 的哪个实现,以及为什么(如果您需要可变长度缓冲区,MemoryStream 可以工作)。
  • 考虑更新 openCV 包装器以使用 SpanReadOnlySpan,这样就不需要复制了。

标签: c# opencv xamarin


【解决方案1】:

我找到了解决我自己问题的方法。也许将来有人会遇到同样的问题。 以下解决方案:

internal static IntPtr javaClassHandle;
internal static IntPtr classRef
{
    get
    {
        return JNIEnv.FindClass("io/fotoapparat/preview/Frame", ref javaClassHandle);
    }
}
static IntPtr imageJFieldId;

public void ProcessFrame(Frame frame)
{            
    int bufferSize = frame.Image.Count;
    var buffer = new byte[bufferSize];
    if (imageJFieldId == IntPtr.Zero)
        imageJFieldId = JNIEnv.GetFieldID(classRef, "image", "[B");
    var fieldObject = JNIEnv.GetObjectField(frame.Handle, imageJFieldId);
    var fastByteArray = new FastJavaByteArray(fieldObject);
    fastByteArray.CopyTo(buffer, 0);
}

链接到FastJavaByteArray

【讨论】:

    猜你喜欢
    • 2011-06-08
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    • 2014-04-18
    • 2014-09-01
    • 2019-04-04
    • 2012-02-05
    • 1970-01-01
    相关资源
    最近更新 更多