我用VC写了个DLL,主要从网络中读取视频数据,现在我能把数据转换成BMP格式,并且通过回调函数的方法,可以让外部调用者来处理这些数据.我用VC来调用这个DLL时,可以自己构造位图信息头,在窗口上显示出来.如下面的代码:
//回调函数,当收到一帧数据时
void __stdcall fnOnNewFrame(int width, int height, byte *bmpData)
{
BITMAPINFO bmpinfo;  //位图信息结构,包含位图信息头和位图颜色信息
//位图信息头结构
bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFO); //本结构所占用的字节数
bmpinfo.bmiHeader.biWidth = width; //位图宽度,以像素为单位
bmpinfo.bmiHeader.biHeight = height; //位图高度,以像素为单位
bmpinfo.bmiHeader.biPlanes = 1; //目标设备的级别,必须为1
bmpinfo.bmiHeader.biBitCount = 32; //每个像素所需的位数,必须为1,4,8,24,32
bmpinfo.bmiHeader.biCompression = 0; //位图压缩类型,必须为0,1,2
bmpinfo.bmiHeader.biSizeImage = width * height; //位图大小,以字节为单位
bmpinfo.bmiHeader.biXPelsPerMeter = 0; //位图水平分辨率,每米像素数
bmpinfo.bmiHeader.biYPelsPerMeter = 0; //位图垂直分辩率,每米象素数
bmpinfo.bmiHeader.biClrUsed = 0; //位图实际使用的颜色表中的颜色数
bmpinfo.bmiHeader.biClrImportant = 0; //位图显示过程中重要的颜色数
CRect rc;
g_pDlg->GetClientRect(&rc); HDC hdc = ::GetDC(g_pDlg->GetSafeHwnd()); //显示
::SetDIBitsToDevice(
hdc,
0,
0,
rc.Width(),
rc.Height(), 
0, 
0, 
0,
height,
bmpData,
&bmpinfo, 
DIB_PAL_COLORS
);}
请问,在C#里,已知了位图的数据,如何构造Bitmap对象,并显示他??

解决方案 »

  1.   

                byte[] bytes=new byte[1024];
                System.IO.MemoryStream ms=new System.IO.MemoryStream(bytes);
                Image img = Image.FromStream(ms);bytes就是你要处理的位图数据.
      

  2.   

    C#里如何调用这个回调函数呢,下面是我的做法,但提示位图数据一直是null      //width:位图宽,height:位图高,bmpData:位图的数据部分
          public delegate void ProcessDelegate(int width, int height,ref byte bmpData);        public void fnOnNewFrame(int width, int height,ref byte bmpData)
            {            MemoryStream ms = new MemoryStream(bmpData); //这里bmp的值为0,似乎在回调时,位图数据传输不成功            Image im = Image.FromStream(ms);            this.BackgroundImage = im;
           }下面是回调函数的原型://回调函数:当有新的视频帧时
    typedef void (__stdcall *PFN_ON_NEW_FRAME)(int width, int height, byte *frameData);我在VC里处理都没问题,位图数据都能正确传输,我甚至已经能把数据保存成一幅位图了
      

  3.   

    也不是很复杂,我就是想把网络数据传输过程做成DLL,当接收到数据后,把接收到的数据通知调用者,这样调用者就可以自己处理了。很自然的就想到通过回调来实现。//接收网络数据
    byte *pData = ....
    //网络数据接收成功后,要通知调用这个DLL的用户
    pfnCallBack(int width, int height, pData);上网查了下,C#里要使用回调,只能通过delegate,所以也就有了我在3楼的代码,但似乎数据在VC与C#间传递不成功。
      

  4.   

        //width:位图宽,height:位图高,bmpData:位图的数据部分
          public delegate void ProcessDelegate(int width, int height,byte[] bmpData);        public void fnOnNewFrame(int width, int height,ref byte bmpData)
            {            MemoryStream ms = new MemoryStream(bmpData); //这里bmp的值为0,似乎在回调时,位图数据传输不成功            Image im = Image.FromStream(ms);            this.BackgroundImage = im;
           }改用数组试试,你那样就只有1个byte,肯定会有问题
      

  5.   

    //width:位图宽,height:位图高,bmpData:位图的数据部分
    public delegate void ProcessDelegate(int width, int height,byte[] bmpData);public void fnOnNewFrame(int width, int height,byte[] bmpData)
    {MemoryStream ms = new MemoryStream(bmpData); //这里bmp的值为0,似乎在回调时,位图数据传输不成功Image im = Image.FromStream(ms);this.BackgroundImage = im;
    }上面的没改好
      

  6.   

    http://download.csdn.net/source/971752