c# - 如何高效地将 IList<byte> 转换为 byte[]?

标签 c# opencv xamarin

我在有效转换 IList<byte> 时遇到问题至 byte[] .我正在使用带有 OpenCV 的 Xamarin Studio 来处理图像,并使用 Fotoapparat 来拍照。 我想将列表转换为数组,因为 OpenCV 需要一个数组而不是列表。我知道使用 ToArray() 进行转换的“简单”方法, 但它需要太多时间(转换超过 8-9 秒)。作为引用,我的IList<byte>长度为 5564448。

有谁知道如何有效地转换IList<byte>byte[]

最佳答案

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

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

关于c# - 如何高效地将 IList<byte> 转换为 byte[]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52767512/

相关文章:

c# - DataTable.Select 需要 SQL 注入(inject)保护吗?

JavaCV透视校正

opencv - 实时摄像头的opencv调整大小窗口

c# - 像 imagecell xaml 这样的自定义视单元?

c# - 为 AlarmManager 设置 Intent

Xamarin C# 错误 : SecureChannelFailure (The authentication or decryption has failed.)

c# - VB .frm 文件,它们可以导入到 C# 项目中吗?

c# - 查找类似图像

javascript - 使用 C# 从 DatePicker 获取周 ID

opencv - 在白色背景上检测文本区域时,`cv::findContours`方法无法正常工作。 (OpenCV)