3

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

我有一个用户控件,即 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 应用程序的主要问题。有什么指导吗?

4

1 回答 1

1

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

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

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

于 2011-01-17T01:46:53.720 回答