我一直在与佳能 EDSDK 斗争一段时间。我可以成功地让库将文件直接保存到磁盘,但是,我无法在内存中保存图像字节 []。每当我尝试将 EDSDK Stream Marshal.Copy() 复制到字节 [] 时,我总是收到以下错误:
AccessViolationException:试图读取或写入受保护的内存。这通常表明其他内存已损坏。
以下是我用来尝试获取流的代码变体之一:
private uint downloadImage(IntPtr directoryItem)
{
uint err = EDSDK.EDS_ERR_OK;
IntPtr stream = IntPtr.Zero;
// Get information of the directory item.
EDSDK.EdsDirectoryItemInfo dirItemInfo;
err = EDSDK.EdsGetDirectoryItemInfo(directoryItem, out dirItemInfo);
// Create a file stream for receiving image.
if (err == EDSDK.EDS_ERR_OK)
{
err = EDSDK.EdsCreateMemoryStream(dirItemInfo.Size, out stream);
}
// Fill the stream with the resulting image
if (err == EDSDK.EDS_ERR_OK)
{
err = EDSDK.EdsDownload(directoryItem, dirItemInfo.Size, stream);
}
// Copy the stream to a byte[] and
if (err == EDSDK.EDS_ERR_OK)
{
byte[] buffer = new byte[dirItemInfo.Size];
GCHandle gcHandle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
// The following line is where it blows up...
Marshal.Copy(stream, buffer, 0, (int)dirItemInfo.Size);
// ... Image manipulation, show user, whatever
}
return err;
}
断点显示(通过 EdsDirectoryItemInfo 对象)图像确实存在,我只是不知道为什么我会得到我的例外。我一直在玩弄接受失败的想法,只是从磁盘读取结果图像,它很容易通过 CreateFileStream 方法写入,但我真的应该能够在内存中操作图像。
有任何想法吗?
更新:我在 2.5 和 2.6 版本中都看到了这种行为。