Question

J'ai essayé, littéralement pendant des heures, et je n'ai pas été en mesure de bouger ce problème.

J'ai un UserControl, qui est 800x369, et il contient, simplement, un chemin qui forme une mappemonde. Je mets cela sur une page paysage, je rends dans un WriteableBitmap. Je lance alors une conversion pour transformer le tableau 1d pixels dans un tableau 2D de nombres entiers. Ensuite, pour vérifier la conversion, câbler jusqu'à la commande click du contrôle personnalisé pour utiliser le Point.X et Point.Y par rapport au contrôle personnalisé dans le tableau nouvellement créé. Ma logique est donc:

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

Ma logique de conversion est en tant que telle:

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;
}

Maintenant, quand je fais le contrôle, je reçois complètement et des résultats tout à fait étrange: apparemment tous les pixels sont soit à des valeurs de -1 ou 0, et ces valeurs sont complètement indépendant des couleurs originales.

Juste pour la postérité: voici mon code de vérification:

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

Le résultat montre absolument aucune corrélation avec le chemin que le WriteableBitmap a rendu en elle. Le chemin a un remplissage de solide blanc.

Que diable se passe? J'ai essayé pendant des heures avec pas de chance. S'il vous plaît, c'est le problème majeur qui me empêche de soumettre ma première application WP7. Toute orientation?

Était-ce utile?

La solution

Code Vous fonctionne correctement, les utilisations Silverlight prémultipliés ARVB, donc pour transparent chacune des valeurs RVB va se multiplier par 0 et le résultat final sera 0. Pour vous obtenez quatre blanc 255 octets qui est -1 à cause de la façon dont entiers sont représentés. Vous pouvez obtenir les octets d'un entier en utilisant la classe BitConverter mais je vous recommande WriteableBitmapEx qui a des méthodes Get / setPixel et gère la pré-multiplication pour vous.

Si vous recherchez juste valeur hexadécimale:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top