使用 ZXing 2.0 C# 端口在 Windows Phone 7.1 上生成 QR 码
本文关键字:QR Phone Windows ZXing 使用 | 更新日期: 2023-09-27 18:32:07
我在使用 ZXing 7.1 的芒果 2.0 上生成二维码时遇到问题。它应该非常简单,但它不起作用。
代码:
QRCodeWriter writer = new QRCodeWriter();
var bMatrix = writer.encode("Hey dude, QR FTW!", BarcodeFormat.QR_CODE, 25, 25);
var asBitmap = bMatrix.ToBitmap();
image1.Source = asBitmap;
图像 1 来自 XAML。
bMatrix 似乎包含我需要的数据,但 image1 从未显示任何内容。
所以我设法做了一个解决方法。我不确定我的原始代码是否由于 ZXing C# 端口中的错误而不起作用,或者我是否做错了什么。无论如何,这是我为显示二维码所做的。
映像 1 来自 XAML。
QRCodeWriter writer = new QRCodeWriter();
var bMatrix = writer.encode("Hey dude! QR FTW!", BarcodeFormat.QR_CODE, width, height);
WriteableBitmap wbmi = new System.Windows.Media.Imaging.WriteableBitmap(width, height);
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
int grayValue = bMatrix.Array[y][x] & 0xff;
if (grayValue == 0)
wbmi.SetPixel(x, y, Color.FromArgb(255, 0, 0,0));
else
wbmi.SetPixel(x, y, Color.FromArgb(255, 255, 255, 255));
}
}
image1.Source = wbmi;
尝试像这样设置图像源:
image1 = new ImageBrush { ImageSource = asBitmap ;}
我遇到了同样的问题。将 WriteableBitmap 直接分配给 Image.Source 不起作用。经过一番搜索,我发现了一个强大的解决方法,它使用SaveJpeg方法将WritableBitap写入MemoryStream:
using (MemoryStream ms = new MemoryStream())
{
asBitmap.SaveJpeg(ms, (int)asBitmap.PixelWidth, (int)asBitmap.PixelHeight, 0, 100);
BitmapImage bmp = new BitmapImage();
bmp.SetSource(ms);
Image.Source = bmp;
}
除非 QR 码以深/浅蓝色显示,而不是黑色/白色,否则这有效。他告诉一位朋友,他补救说,在Windows手机中,像素颜色不是字节,而是整数。有了这些知识和zxing的来源,我更改了ByteMatrix.ToBitmap方法,如下所示:
public WriteableBitmap ToBitmap()
{
const int BLACK = 0;
const int WHITE = -1;
sbyte[][] array = Array;
int width = Width;
int height = Height;
var pixels = new byte[width*height];
var bmp = new WriteableBitmap(width, height);
for (int y = 0; y < height; y++)
{
int offset = y*width;
for (int x = 0; x < width; x++)
{
int c = array[y][x] == 0 ? BLACK : WHITE;
bmp.SetPixel(x, y, c);
}
}
//Return the bitmap
return bmp;
}
这完全解决了这个问题,甚至将WritableBitmap直接分配给Image.Source。看起来,图像已正确分配,但 alpha 值是透明的,在创建 jpeg 时将其删除。
最简单的解决方案:
Uri uri = new Uri("http://www.esponce.com/api/v3/generate?content=" + "your content here" + "&format=png");
image1.Source = new BitmapImage(uri);