【问题标题】:WriteableBitmap failing badly, pixel array very inaccurateWriteableBitmap 严重失败,像素数组非常不准确
【发布时间】:2011-01-16 22:42:10
【问题描述】:

我已经尝试了好几个小时,但我无法解决这个问题。

我有一个用户控件,即 800x369,它简单地包含形成世界地图的路径。 我将它放在横向页面上,然后将其渲染为 WriteableBitmap。 然后我运行转换以将 1d Pixels 数组转换为 2d 整数数组。 然后,为了检查转换,我连接了自定义控件的单击命令,以使用相对于新创建数组中的自定义控件的 Point.X 和 Point.Y。 我的逻辑是这样的:

wb = new WriteableBitmap(worldMap, new TranslateTransform());
wb.Invalidate();
intTest = wb.Pixels.To2DArray(wb.PixelWidth);

我的转换逻辑是这样的:

public static int[,] To2DArray(this int[] arr,int rowLength)
{
    int[,] output = new int[rowLength, arr.Length / rowLength];
    if (arr.Length % rowLength != 0) throw new IndexOutOfRangeException();
    for (int i = 0; i < arr.Length; i++)
    {
        output[i % rowLength, i / rowLength] = arr[i];
    }
return output;
}

现在,当我进行检查时,我得到了完全和完全奇怪的结果:显然所有像素的值都是 -1 或 0,而这些值完全独立 的原始颜色。

只是为了后代:这是我的检查代码:

private void Check(object sender, MouseButtonEventArgs e)
{
    Point click = e.GetPosition(worldMap);
    ChangeNotification(intTest[(int)click.X,(int)click.Y].ToString());
}

结果显示与 WriteableBitmap 渲染到其中的路径完全没有相关性。路径填充了纯白色。

这到底是怎么回事?我已经尝试了几个小时没有运气。拜托,这是阻止我提交我的第一个 WP7 应用程序的主要问题。有什么指导吗?

【问题讨论】:

  • 请压缩您的项目,以便我们更轻松地进行测试。
  • 我已经放弃了,我也没有可用的代码了。我们可以进行近距离投票吗?

标签: c# silverlight windows-phone-7 windows-phone writeablebitmap


【解决方案1】:

您的代码工作正常,Silverlight 使用预乘 ARGB,因此对于透明,每个 RGB 值都将乘以 0,最终结果将为 0。对于白色,您会得到四个 255 字节,即 -1,因为表示整数。您可以使用 BitConverter 类从 int 获取字节,但我建议 WriteableBitmapEx 具有 Get/SetPixel 方法并为您处理预乘法。

如果您只是在寻找十六进制值:

ChangeNotification(intTest[(int)click.X,(int)click.Y].ToString("X8"));

【讨论】:

  • 不不不!它不起作用,因为我返回的值与路径的实际像素绝对没有相关性!一个白色像素是-1,另一个是零!空白空间也一样!
  • 我没有发现你的代码有问题。尝试使用我链接到的扩展程序,您可以在点击时设置像素绿色,看看是否有任何转换问题。
  • 要检查的另一件事是,当您单击透明区域时,您的 Check 方法正在被调用。如果未在 UserControl 中的 LayoutRoot 上设置 Background="Transparent"。另外,您在代码中的哪个位置创建 WriteableBitmap? (我在 Loaded 事件中这样做)
猜你喜欢
  • 2015-12-16
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 2017-10-14
  • 1970-01-01
相关资源
最近更新 更多