0


我正在使用 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;

创建 WritableBitmap 时出现错误

bitmap.SetSource(mem);

我已经检查了调试器中的前几行,它们都不是 null 等。

我以这种方式创建 WritableBitmap 的目的是什么?

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

我是 C# 方面的新手,但在此先感谢您抽出时间帮助我解决这个问题 :)

4

1 回答 1

1

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

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

于 2013-07-16T19:42:26.460 回答