2013-12-14 3 views
0

Я пытаюсь получить цвет пикселя определенной позиции (событие Tap).WriteAbleBitmap.Pixels [] возвращает неправильный цвет (смещение?)

У меня есть следующий код:

private void iiiimage_Tap(object sender, System.Windows.Input.GestureEventArgs e) 
    { 
     Point point = e.GetPosition(iiiimage); 

     ApplicationTitle.Text = point.ToString(); 

     var wb = new WriteableBitmap(iiiimage, null); 


     int arrayPos = (int)point.X * (int)point.Y; 

     PageTitle.Text = arrayPos.ToString(); 

     int colorAsInt = wb.Pixels[arrayPos]; 


     Color c = Color.FromArgb((byte)((colorAsInt >> 0x18) & 0xff), 
          (byte)((colorAsInt >> 0x10) & 0xff), 
          (byte)((colorAsInt >> 8) & 0xff), 
         (byte)(colorAsInt & 0xff)); 

     r3ct.Fill = new SolidColorBrush(c); 

    } 

скриншоте показать то, что не так. Положение белой ошибки (подсказка) синее, но код возвращает пиксель, который находится где-то в верхней части изображения (красный).

enter image description here

Что я делаю неправильно?

С наилучшими пожеланиями, Niels

+0

Вы уверены, что ваш метод для извлечения цвета из целого числа является правильным? –

ответ

1

Попробуйте сделать следующие изменения. Я понятия не имею, работает ли это на WP7. Я думаю, ActualWidth и Следует учитывать ActualHeight, так как вам нужно перевести координаты, выраженные в единицах в пикселях.

private void iiiimage_Tap(object sender, System.Windows.Input.GestureEventArgs e) 
{ 
    Point point = e.GetPosition(iiiimage); 

    ApplicationTitle.Text = point.ToString(); 

    var wb = new WriteableBitmap(iiiimage, null); 

    int x, y; 
    x = (int)(wb.PixelWidth * point.X/iiiimage.ActualWidth); 
    y = (int)(wb.PixelHeight * point.Y/iiiimage.ActualHeight); 
    int arrayPos = y * wb.PixelWidth + x; 

    PageTitle.Text = String.Format("({0} ; {1}) --> {2}", x, y, arrayPos); 

    int colorAsInt = wb.Pixels[arrayPos]; 


    Color c = Color.FromArgb((byte)((colorAsInt >> 0x18) & 0xff), 
         (byte)((colorAsInt >> 0x10) & 0xff), 
         (byte)((colorAsInt >> 8) & 0xff), 
         (byte)(colorAsInt & 0xff)); 

    r3ct.Fill = new SolidColorBrush(c); 
} 
+0

Я хотел бы обратить внимание на исправленный расчет 'arrayPos' Jigsore ...' y' умножается на ширину, а не на 'x', как ошибочно сделал вопрос. –

Смежные вопросы