2015-02-18 2 views
0

Я работаю над приложением окна телефона. Я хочу стереть фон изображения. Я использую для этого метод setpixel(). Но это стирание фона очень медленно. Вот мой код.SetPixel() слишком медленно, чтобы стереть фон изображения

private void Canvas_MouseMove_1(object sender, System.Windows.Input.MouseEventArgs e) 
     { 
      wrt = new WriteableBitmap(imag, null); 
      try 
      { 
       System.Windows.Media.Color c = new System.Windows.Media.Color(); 
       c.A = 0; 
       c.B = 0; c.R = 0; c.G = 0; 
       currentPoint = e.GetPosition(this.imag); 

      for (int degrees = 0; degrees <= 360; degrees++) 
      { 
       for (int distance = 0; distance <= erasersize; distance++) 
       { 
        //double angle = Math.PI * degrees/180.0; 
        double x = currentPoint.X + (distance * Math.Cos(degrees)); 
        double y = currentPoint.Y + (distance * Math.Sin(degrees)); 
        wrt.SetPixel(Convert.ToInt32(x), Convert.ToInt32(y) - offset, c); 
       } 
      } 

     } 

Я искал много статей в google, но никто не работал на меня. Мне предложили один из методов Bitmap.LockBits. Но проблема в том, что мы не можем добавить system.drawing в приложение windows phone, потому что dll не поддерживается. Может ли кто-нибудь помочь мне решить эту проблему. Спасибо заранее.

+0

вы просто пытаетесь исчезнуть или удалить изображение. Если это так, вы используете анимацию для установки уровня непрозрачности изображения. –

+0

@WaltRitscher Спасибо за ответ. Фактически я должен удалить фон изображения и сохранить часть изображения, в котором я могу использовать другой фон. Мой код стирает фон, но setpixel() работает медленно, поэтому я не могу добиться качества ластика, что мне действительно нужно .... – Pawan

ответ

1

WriteableBitmap имеет красивое свойство под названием Pixels. Это всего лишь массив целых чисел, но он дает вам гораздо более быстрый способ манипулирования пикселями.

Во-первых, вам нужно быстро цвет-к-междунар Conventer:

public static int ColorToInt(Color color) 
{ 
    return unchecked((int)((color.A << 24) | (color.R << 16) | (color.G << 8) | color.B)); 
} 

Затем вы можете изменить свой код:

wrt = new WriteableBitmap(imag, null); 
try 
{ 
    System.Windows.Media.Color c = new System.Windows.Media.Color(); 
    c.A = 0; 
    c.B = 0; c.R = 0; c.G = 0; 
    currentPoint = e.GetPosition(this.imag); 

    int width = wrt.PixelWidth; 

    for (int degrees = 0; degrees <= 360; degrees++) 
    { 
     for (int distance = 0; distance <= erasersize; distance++) 
     { 
      //double angle = Math.PI * degrees/180.0; 
      double x = currentPoint.X + (distance * Math.Cos(degrees)); 
      double y = currentPoint.Y + (distance * Math.Sin(degrees)); 
      wrt.Pixels[(int)(y - offset) * width + (int)x] = ColorToInt(c); 
     } 
    } 
} 
Смежные вопросы