0

ZXing.Netを使用してWindowsStoreアプリでQRコードを解析しようとしていますが、Webページの最新バージョンを使用してQRコードを実行しようとすると、50行目に入力ArgumentNullExceptionされます。BitmapLuminanceSource.Silverlight.cs

線はこんな感じ

var data = System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions.ToArray(writeableBitmap.PixelBuffer, 0, (int)writeableBitmap.PixelBuffer.Length);

WriteableBitmapnullではないので、何がnullであるかはわかりません。

誰か助けてもらえますか?

この方法からです

public BitmapLuminanceSource(WriteableBitmap writeableBitmap)
   : base(writeableBitmap.PixelWidth, writeableBitmap.PixelHeight)
{
   var height = writeableBitmap.PixelHeight;
   var width = writeableBitmap.PixelWidth;
   var stride = width * 4;
   luminances = new byte[width * height];
   Color c;

#if NETFX_CORE
   var data = System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions.ToArray(writeableBitmap.PixelBuffer, 0, (int)writeableBitmap.PixelBuffer.Length);
   for (int y = 0; y < height; y++)
   {
      int offset = y * stride;
      for (int x = 0, xl = 0; x < stride; x += 4, xl++)
      {
         c = Color.FromArgb(
            data[x + offset], 
            data[x + offset + 1], 
            data[x + offset + 2], 
            data[x + offset + 3]);
         luminances[y * width + xl] = (byte)(0.3 * c.R + 0.59 * c.G + 0.11 * c.B + 0.01);
      }
   }
#else
   var pixels = writeableBitmap.Pixels;
   for (int y = 0; y < height; y++)
   {
      int offset = y * width;
      for (int x = 0; x < width; x++)
      {
         int srcPixel = pixels[x + offset];
         c = Color.FromArgb((byte)((srcPixel >> 0x18) & 0xff),
            (byte)((srcPixel >> 0x10) & 0xff),
            (byte)((srcPixel >> 8) & 0xff),
            (byte)(srcPixel & 0xff));
         luminances[offset + x] = (byte)(0.3 * c.R + 0.59 * c.G + 0.11 * c.B + 0.01);
      }
   }
#endif
}

アップデート

WriteableBitmatは、このコードを使用して作成されます

// Get the File
var File = await FilePick.PickSingleFileAsync();

// Convert the File to a Bitmap
var Stream = await File.OpenAsync(FileAccessMode.Read);
var Bmp = new BitmapImage();
Bmp.SetSource(Stream);
var WBmp = new WriteableBitmap(Bmp.PixelWidth, Bmp.PixelHeight);
WBmp.SetSource(Stream);

Damir Arhの答えを使用することにより、エラーは次のコードに少し移動されます

c = Color.FromArgb(
    data[x + offset], 
    data[x + offset + 1], 
    data[x + offset + 2], 
    data[x + offset + 3]);

私が得るところIndexOutOfRangeException、いつ

x = 580
xl = 145
offset = 31104
y = 36
height = 216
width = 216
stride = 864
data = {byte[31684]}

もちろん、なぜ範囲外なのかはわかりますが、修正方法がわかりません。

DamirArhの更新された回答を使用して修正されましたStream.Seek(0)

4

1 に答える 1

1

プロジェクトのホームページから入手できる Silverlight の例を簡単に移植したところ、うまくいきました。

var dlg = new FileOpenPicker();
dlg.FileTypeFilter.Add(".png");
var file = await dlg.PickSingleFileAsync();
if (file != null)
{
    currentBarcode = new WriteableBitmap(89, 89);
    using (var stream = await file.OpenReadAsync())
    {
        currentBarcode.SetSource(stream);
    }
    imgDecoderBarcode.Source = currentBarcode;
    var result = reader.Decode(currentBarcode);
    if (result != null)
    {
        txtDecoderType.Text = result.BarcodeFormat.ToString();
        txtDecoderContent.Text = result.Text;
    }
    else
    {
        txtDecoderType.Text = String.Empty;
        txtDecoderContent.Text = "No barcode found.";
    }
}

また、投稿したコードから問題のある行を呼び出してみましたが、例外はスローされませんでした:

var dlg = new FileOpenPicker();
dlg.FileTypeFilter.Add(".png");
var file = await dlg.PickSingleFileAsync();
if (file != null)
{
    currentBarcode = new WriteableBitmap(89, 89);
    using (var stream = await file.OpenReadAsync())
    {
        currentBarcode.SetSource(stream);
        var data = System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions.ToArray(currentBarcode.PixelBuffer, 0, (int)currentBarcode.PixelBuffer.Length);
    }
}

あなたの場合の問題は、WriteableBitmapこのメソッドに渡される を作成する方法です。同じストリームから最初に をロードするためBitmap、 のソースとして設定したときに、すでに最後に配置されていますWritableBitmap。データをもう一度ロードできるように、ストリームの先頭に移動する必要があります。

// Convert the File to a Bitmap
var Stream = await File.OpenAsync(FileAccessMode.Read);
var Bmp = new BitmapImage();
Bmp.SetSource(Stream);
Stream.Seek(0);
var WBmp = new WriteableBitmap(Bmp.PixelWidth, Bmp.PixelHeight);
WBmp.SetSource(Stream);
于 2013-01-08T06:15:27.623 に答える