Сбой WriteableBitmap, массив пикселей очень неточный - PullRequest
3 голосов
/ 17 января 2011

Я пытался буквально часами, и я не смог сдвинуть с места эту проблему.

У меня есть UserControl, который имеет размер 800x369, и он содержит просто путь, который формирует карту мира.Я помещаю это на альбомную страницу, а затем отображаю в WriteableBitmap.Затем я запускаю преобразование, чтобы превратить массив 1d Pixels в 2d массив целых чисел.Затем, чтобы проверить преобразование, я подключаю команду click пользовательского элемента управления, чтобы использовать 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.Любое руководство?

1 Ответ

1 голос
/ 17 января 2011

Ваш код работает правильно, Silverlight использует предварительно умноженный ARGB, поэтому для прозрачности каждое из значений RGB будет умножено на 0, а конечный результат будет 0. Для белого вы получите четыре 255 байтов, что равно -1, поскольку целые числа представлены. Вы можете получить байты из int, используя класс BitConverter, но я бы порекомендовал WriteableBitmapEx , который имеет методы Get / SetPixel и обрабатывает предварительное умножение для вас.

Если вы просто искали шестнадцатеричные значения:

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

...