我遇到了同样的问题。将 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 时已将其删除。