我怎样才能更快地完成它(IntPtr,EDSDK的位图)

时间:2012-12-20 22:15:57

标签: bitmap decode edsdk

现在我自己为佳能 EDSDK 工作。我将实时图像变得很慢(每秒5幅图像)。我怎么能更快地做到这一点?

这是获取图像指针的代码:


    uint _err = EDSDK.EDS_ERR_OK;
    IntPtr imageRef = IntPtr.Zero;
    IntPtr streamRef = IntPtr.Zero;
    IntPtr streamPtr = IntPtr.Zero;
    uint Length = 0;

    _err = EDSDK.EdsCreateMemoryStream(0, out streamRef);
    if (EDSDK.EDS_ERR_OK == _err)
      _err = EDSDK.EdsCreateEvfImageRef(streamRef, out imageRef);

    if (EDSDK.EDS_ERR_OK == _err)
      _err = EDSDK.EdsDownloadEvfImage(_camera, imageRef);          

    if (EDSDK.EDS_ERR_OK == _err)
    {
      // display image
      _err = EDSDK.EdsGetPointer(streamRef, out streamPtr);
      if (EDSDK.EDS_ERR_OK == _err)
        _err = EDSDK.EdsGetLength(streamRef, out Length);
    }   

然后我将图像加载到Bitmap,它非常慢。我的代码:


    byte[] b = new byte[Length];
    Marshal.Copy(streamPtr, b, 0, (int)Length);
    using ( MemoryStream ac = new MemoryStream(b))
    {
      img = (Bitmap)Image.FromStream(ac);
      ac.Close();
    }

2 个答案:

答案 0 :(得分:1)

libjpeg-turbo,此处http://libjpeg-turbo.virtualgl.org/可实时解码

答案 1 :(得分:0)

您是否尝试过使用EdsGetImage方法从内存流中提取图像数据?

要使用此方法,您需要在使用EdsDownloadEvf方法(使用EdsCreateImageRef方法)后从内存流中创建其他图像引用。然后,您可以在EdsGetImage方法中使用此图像参考来提取未压缩的图像数据。