抓取相机数据并将其转换为可写入位图以进行条形码扫描

本文关键字:位图 扫描 条形码 数据 相机 转换 抓取 | 更新日期: 2023-09-27 18:22:29


我正在使用windows phone 7

我想在Timer对象的每个刻度上做以下事情:

  1. 从PhotoCamera对象获取相机数据
  2. 将其"数据转换为WritableBitmap

我被系统异常错误卡住了。

这是我的代码

        if (camReady == true)
        {
            try
            {
                var image = new Image();
                byte[] ba = new byte[camBufferSize];
                cam.GetPreviewBufferY(ba);
                var mem = new MemoryStream(ba);
                bitmap.SetSource(mem);
                var result = reader.Decode(bitmap);
                if (result == null)
                {
                    txtDebug.Text = "Tick't" + savedCounter + "'n" + (result == null ? "Result jest nullem" : result.Text) + "'tsize " + buffer.Length
                        + "'nPierwszy elem" + buffer[0];
                    //+ "'nByteArray Len "+byteArray.Length
                    //+ "'nFirst Elem of ByteArray "+byteArray[0];
                }
                else
                {
                    txtDebug.Text = "HURRAAAAAAAA!!!!"+
                    "'nresult.Text't" + result.Text;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("{0} Exception caught.", ex);
                 txtDebug.Text = "{0} Exception caught.'t"+ ex;
            }
            Console.WriteLine("Buffer", buffer);
            if (savedCounter % 6 == 0) cam.Focus();
            //var result = reader.Decode(bitmap);        
        }

"位图"对象和camBufferSize对象是在代码的其他部分中创建的

 bitmap = new WriteableBitmap((int)cam.Resolution.Width, (int)cam.Resolution.Height);
 camBufferSize = (int)cam.Resolution.Width * (int)cam.Resolution.Height;

创建可写位图时出错

bitmap.SetSource(mem);

我已经在调试器中检查了以前的行,没有一行是空的。

我以这种方式创建可写位图的目的是什么?

我正在构建条形码扫描仪,我需要WritableBitmap数据作为ZXing库的输入,以便在使用相机时解码图像上的条形码。

我是C#的新手,但提前感谢您花时间帮助我解决这个问题:)

抓取相机数据并将其转换为可写入位图以进行条形码扫描

如果您不需要WriteableBitmap用于其他用途,则不应将相机的亮度数据转换为位图对象。这是不必要的转换。将亮度值直接与ZXing一起使用。它要快得多。ZXing.Net项目提供了一些windows手机示例,展示了它的工作原理。

如果您确实需要WriteableBitmap对象,则必须将相机的Y数据转换为ARGB32表示。或者使用GetPreviewBufferArgb方法,然后使用生成的int数组作为图像源。