本帖最后由 lhg0302 于 2011-11-25 17:30:59 编辑

解决方案 »

  1.   

    BitmapData是PVS_APIIF_DATA的指针,你用 PVS_APIIF_DATA,然后传递时,用ref 修饰,试试
      

  2.   

    [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public struct PVS_APIIF_DATA
        {
            /// INT->int
            public int Length;
            /// CHAR* 图片
            intptr b;
        }  
      

  3.   

    改成这样:    [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public struct PVS_APIIF_DATA
        {
            /// INT->int
            public int Length;
            /// CHAR* 图片
             public IntPtr Data;
        }     [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public struct PVS_APIIF_GUI_BITMAP
        {
            /// INT->int
            public int Width;
            /// INT->int
            public int Height;
            /// PVS_APIIF_DATA*
            public IntPtr BitmapData;
        }
    还有,你把那个调用的C++函数也贴出来,同时贴出你在C#的映射定义,看看这里有没有出错
      

  4.   

    非常感谢,我也测试过指针,是可以的,但是不知道为什么,指针取出来图片也拿出来了,但是好像图片数据有问题,我是这样取的
                        PVS_APIIF_DATA p = (PVS_APIIF_DATA)Marshal.PtrToStructure(pBitmapArea.BitmapData, typeof(PVS_APIIF_DATA));
                        string dd = Marshal.PtrToStringAuto(p.Data, p.Length);
                        byte[] Result = System.Text.Encoding.Default.GetBytes(dd);
                                            Bitmap bitmap = new Bitmap(pBitmapArea.Width, pBitmapArea.Height);
                        for (int x = 0; x < pBitmapArea.Width; x++)
                        {
                            for (int y = 0; y < pBitmapArea.Height; y++)
                            {
                                bitmap.SetPixel(x, y, Color.Black);
                            }
                        }
                        
                        bitmap.Save(memoryStream, ImageFormat.Bmp);
      

  5.   

    PVS_APIIF_DATA p = (PVS_APIIF_DATA)Marshal.PtrToStructure(pBitmapArea.BitmapData, typeof(PVS_APIIF_DATA));
                        string dd = Marshal.PtrToStringAuto(p.Data, p.Length);
    取出来的数据前面是BM6?后面感觉不对,图片也没有显示出来
      

  6.   

    sdl2005lyx,这是一个回调函数,它只返回结果
    PVS_APIIF_RESULT Pvs_APIIFGuiStatusCallback(PVS_APIIF_GUI_STATE GuiState,
    PVS_APIIF_GUI_MESSAGE message,
    PVS_APIIF_GUI_BITMAP *pBitmapArea)
    函数功能: 回调函数,返回放手提示信息和实时捕捉到的掌静脉图片。
    输入参数: PVS_APIIF_GUI_STATE GuiState //返回信息类型,说明返回数据是静脉图片还是
    文字提示信息。
    输入参数: PVS_APIIF_GUI_MESSAGE message //返回的文字信息ID,根据ID显示相应提示
    信息
    输入参数: PVS_APIIF_GUI_BITMAP *pBitmapArea //返回捕捉到的掌静脉图片信息
    返回值: PVS_APIIF_OK,表示正常退出回调函数
      

  7.   

    Marshal.ReadByte(intptr...
    读出图像
      

  8.   

    我试过,,Marshal.ReadByte返回的是单字节,我的是byte数组
      

  9.   

    另外:C++中取图片是这样写的
    PVS_APIIF_GUI_BITMAP *pBitmap = new PVS_APIIF_GUI_BITMAP(*pBitmapArea);
    pBitmap->BitmapData = new PVS_APIIF_DATA(*pBitmapArea->BitmapData);
    pBitmap->BitmapData->Data = new CHAR[pBitmapArea->BitmapData->Length];
    memcpy(pBitmap->BitmapData->Data, pBitmapArea->BitmapData->Data,
    pBitmapArea->BitmapData->Length);
      

  10.   

    PVS_APIIF_DATA p = (PVS_APIIF_DATA)Marshal.PtrToStructure(pBitmapArea.BitmapData, typeof(PVS_APIIF_DATA));
    这样取数据对吗
      

  11.   

    如果这个对的PVS_APIIF_DATA p = (PVS_APIIF_DATA)Marshal.PtrToStructure(pBitmapArea.BitmapData, typeof(PVS_APIIF_DATA));
    现在我知道图片是BMP格式,该如何做出来,以上的方法都试了,最终结果是显示都是黑屏,谁帮帮忙
      

  12.   

    已经解决,后来找了一个摄像头对BMP的处理,使用了一下,发现可以,谢谢大家帮忙