3

私は文字通り何時間も試しましたが、この問題を解決することはできませんでした.

私は 800x369 の UserControl を持っています。これには単純に、ワールドマップを形成するパスが含まれています。これを横向きのページに配置してから、WriteableBitmap にレンダリングします。次に、変換を実行して、1 次元の Pixels 配列を 2 次元の整数配列に変換します。次に、変換を確認するために、カスタム コントロールのクリック コマンドを結び付けて、新しく作成された配列内のカスタム コントロールに相対的な 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になります。白の場合、整数の表現方法のために-1である4つの255バイトが得られます。 。BitConverterクラスを使用してintからバイトを取得できますが、Get / SetPixelメソッドを持ち、事前乗算を処理するWriteableBitmapExをお勧めします。

16進値を探しているだけの場合:

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

于 2011-01-17T01:46:53.720 に答える