首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > CAD教程 >

WPF处置摄像头扫描提示内存不足

2013-01-02 
WPF处理摄像头扫描提示内存不足试试看有没有哪位朋友处理过这样的问题,我使用了一个定时器,每100毫秒获取

WPF处理摄像头扫描提示内存不足
试试看有没有哪位朋友处理过这样的问题,我使用了一个定时器,每100毫秒获取一个图片的二进制数组,这个数据是由摄像头开发商的接口提供出来的,我只是每隔100毫秒去获取到,然后将这个数据转化为WPF的Image控件可以使用的图片源,具体代码如下:


public UCMeetSysMainTopClient()
 {
      InitializeComponent();
      this.Dispatcher.BeginInvoke(new Action(() =>
      {
         this._Timer = new DispatcherTimer();
         this._Timer.Interval = new TimeSpan(0, 0, 0, 0, 100);
         this._Timer.Tick += new EventHandler(_Timer_Tick);
      }));          
}
void _Timer_Tick(object sender, EventArgs e)
{
     //decodeaframe这个方法是由摄像头供应商提供的接口,其中返回的this._byteImageData[0]就是图片二进制数据
     if (decodeaframe(ref this._byteImageData[0], ref this._byteCode[0]))
     {
      //string textData = Encoding.Default.GetString(this._byteCode);
      //this.EventAggregator.GetEvent<ScanEvent>().Publish(textData);
     }
     //问题出现在以下代码
     BitmapSource source = ToBitmapSource(CreateBitmap(this._byteImageData, 640, 480));
     this.iView.Source = source;
}
private static BitmapSource ToBitmapSource(Bitmap bmp)
{
     try
     {
        return Imaging.CreateBitmapSourceFromHBitmap(bmp.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
     }
     catch
     {
        return null;
     }
}
private static Bitmap CreateBitmap(byte[] originalImageData, int originalWidth, int originalHeight)
{
    Bitmap bitmap = new Bitmap(originalWidth, originalHeight, PixelFormat.Format8bppIndexed);
    MemoryStream stream = new MemoryStream();
    bitmap.Save(stream, ImageFormat.Bmp);
    stream.Flush();
    int num = ((((originalWidth * 8) + 31) / 32) * 4) - originalWidth;
    int count = ((((originalWidth * 8) + 31) / 32) * 4) * originalHeight;
    int num3 = ReadData(stream, 10, 4);
    int num4 = 54;
    int num5 = num3;
    int num6 = 0;
    for (int i = num4; i < num5; i += 4)
    {
       byte[] buffer = new byte[] { (byte)num6, (byte)num6, (byte)num6, 0 };
       num6++;
       stream.Position = i;
       stream.Write(buffer, 0, 4);


    }
    byte[] buffer2 = new byte[count];
    int num8 = originalWidth + num;
    for (int j = originalHeight - 1; j >= 0; j--)
    {
        int num10 = (originalHeight - j) - 1;
        for (int k = 0; k < originalWidth; k++)
        {
          buffer2[(num10 * num8) + k] = originalImageData[(j * originalWidth) + k];
        }
     }
     stream.Position = num3;
     stream.Write(buffer2, 0, count);
     stream.Flush();
     return new Bitmap(stream);
}
private static int ReadData(MemoryStream curStream, int startPosition, int length)
{
      byte[] buffer = new byte[length];
      curStream.Position = startPosition;
      curStream.Read(buffer, 0, length);
      return BitConverter.ToInt32(buffer, 0);
}


以上代码在定时器执行3-4分钟之后就会抛出内存不足的异常或者提示GDI+一般性错误,但是将二进制图片处理成WPF控件可以使用的图片数据格式我目前只知道这样处理,有没有朋友有其他的处理方式,希望能帮助解决一下,这个很急,分不多了,拜托~~
[解决办法]
http://blog.catenalogic.com/post/2008/post/2009/post/2008/post/2009/01/08/WPF-Webcam-Control-part-2.aspx

http://blog.catenalogic.com/post/2008/post/2009/post/2008/12/22/Retrieving-snapshots-from-a-webcam.aspx

贴两个连接 lz看下 

热点排行