Domanda

ho cercato, letteralmente per ore, ed io non sono stati in grado di muoversi a questo problema.

Ho un UserControl, che è 800x369, e contiene, semplicemente, un percorso che forma un worldmap. Ho messo questo in una pagina del paesaggio, poi mi rendo in un WriteableBitmap. Sono quindi eseguire una conversione per trasformare la matrice pixel 1d in una matrice 2D di interi. Poi, per verificare la conversione, ho cablare il comando clic del controllo personalizzato di utilizzare la Point.X e punto.Ý rispetto al controllo personalizzato nella matrice appena creato. La mia logica è quindi:

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

La mia logica di conversione è in quanto tale:

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

Ora, quando faccio la verifica, ho completamente e assolutamente risultati strani: a quanto pare tutti i pixel sono sia a valori di -1 o 0, e questi valori sono completamente indipendente dei colori originali.

Solo per i posteri: ecco il mio codice di controllo:

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

Il risultato mostra alcuna correlazione con il percorso che il WriteableBitmap ha reso in esso. Il percorso ha un riempimento di solido bianco.

Che diamine sta succedendo? Ho provato per ore senza fortuna. Si prega, questo è il principale problema che mi impediva di presentare la mia prima applicazione WP7. Qualsiasi orientamento?

È stato utile?

Soluzione

È il codice funziona correttamente, usi Silverlight pre-moltiplicati ARGB, quindi per trasparente ognuno dei valori RGB andranno moltiplicati per 0 e il risultato finale sarà 0. Ad bianco si ottiene quattro 255 byte, che è -1 a causa di come interi sono rappresentati. È possibile ottenere i byte da un int utilizzando la classe BitConverter ma io consiglierei di WriteableBitmapEx che ha metodi Get / setPixel e gestisce il pre-moltiplicazione per voi.

Se stavi solo in cerca di valori esadecimali:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top