Преобразование неуправляемого потока памяти в System.Рисование.Изображение

#c# #memorystream #canon-sdk

#c# #memorystream #canon-sdk

Вопрос:

Я использую EDSK для преобразования потока памяти в изображение, он выдает следующую ошибку при

Ошибка: попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена.

Строка:ReadStream.Read(исходящее сообщение, 0, (int)длина потока);

                 unsafe
                {
                    uint streamLength;
                    if (Error == EDSDK.EDS_ERR_OK)
                    {

                        Error = EDSDK.EdsGetLength(streamRef, out streamLength);
                    if (Error == EDSDK.EDS_ERR_OK)
                    {
                        UnmanagedMemoryStream readStream = new UnmanagedMemoryStream((byte*)(void*)streamRef.ToPointer(), streamLength, streamLength, FileAccess.Read);
                        // Create a byte array to hold data from unmanaged memory.

                        byte[] outMessage = new byte[streamLength];

                        // Read from unmanaged memory to the byte array.
                        readStream.Read(outMessage, 0, (int)streamLength);

                        readStream.Close();

                        Image img = byteArrayToImage(outMessage);
                        img.Save("C:\temp\test.jpeg");

                    }
}
 

Комментарии:

1. Почему-то вы, похоже, не хотите проверять Error после вызова EdsGetLength , есть ли у вас представление о том, возвращает ли оно действительное streamLength ?

2. да, он возвращает streamLength = 4754647

3. Какая-либо конкретная причина, по которой вы приводите streamRef к void * перед приведением его к byte * ?

4. нет, но он выдает ту же ошибку с и без void*

5. Просматриваю некоторый пример кода , используя streamRef . ToPointer() неверен. Вы должны вызвать EdsGetPointer(), чтобы получить указатель на данные изображения.