2016-03-01 7 views
0

У меня есть видео поток от камеры к изображению в WPF. Я пытаюсь получить доступ к пикселю изображения WritableBitMap за пикселем перед его отображением. В качестве теста я пытаюсь установить все изображение на белый или черный. Однако в обоих случаях я получаю ошибку AccessViolationException.Почему AccessViolationException возникает при доступе к пикселям в WriteableBitmap Image?

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

Так что же лучший способ играть с пикселями в моем случае? или почему это не работает? Любая помощь приветствуется

 private async void UpdateMasterCameraPreview(IdsFrame frame) 
    { 
     if (masterImage != null) 
      frame.Image.CopyTo(masterImage); 
     else 
      masterImage = frame.Image.ToWriteableBitmap(); 

     //BitmapImage temp = ConvertWriteableBitmapToBitmapImage(masterImage); 
     WriteableBitmap temp = masterImage; 

     // Here I get the exception, on every pixel access 
     for (int y = 0; y < temp.PixelHeight; y++) 
      for (int x = 0; x < temp.PixelWidth; x++) 
       temp.SetPixel(x, y, 255); 

     masterImage = temp; 

     masterImage.Lock(); 
     masterImage.AddDirtyRect(new Int32Rect(0, 0, masterImage.PixelWidth, masterImage.PixelHeight)); 
     masterImage.Unlock(); 

     if (OnMasterFrameCaptured != null) 
      OnMasterFrameCaptured(this, new CameraFrameCapturedArgs(CameraType.Master, masterImage)); 
    } 
+0

Пожалуйста, включите также температура объявления переменных , –

+0

Я просто сделал. Спасибо –

ответ

0

В итоге я получил ответ от this. Теперь я могу редактировать необработанные пиксельные данные любого изображения WriteableBitmap перед отправкой его в управление изображением в WPF. Ниже то, что я точно использовать, но здесь я просто преобразовать каждый кадр в некоторой прозрачности при условии:

 public void ConvertImage(ref WriteableBitmap Wbmp) 
    { 
     int width = Wbmp.PixelWidth; 
     int height = Wbmp.PixelHeight; 
     int stride = Wbmp.BackBufferStride; 
     int bytesPerPixel = (Wbmp.Format.BitsPerPixel + 7)/8; 

     unsafe 
     { 
      byte* pImgData = (byte*)Wbmp.BackBuffer; 

      // set alpha to transparent for any pixel with red < 0x88 and invert others 
      int cRowStart = 0; 
      int cColStart = 0; 
      for (int row = 0; row < height; row++) 
      { 
       cColStart = cRowStart; 
       for (int col = 0; col < width; col++) 
       { 
        byte* bPixel = pImgData + cColStart; 
        UInt32* iPixel = (UInt32*)bPixel; 

        if (bPixel[2 /* bgRa */] < 0x44) 
        { 
         // set to 50% transparent 
         bPixel[3 /* bgrA */] = 0x7f; 
        } 
        else 
        { 
         // invert but maintain alpha 
         *iPixel = *iPixel^0x00ffffff; 
        } 

        cColStart += bytesPerPixel; 
       } 
       cRowStart += stride; 
      } 
     } 
    } 

и процедура его использования, как это:

 masterImage.Lock(); 
     ConvertImage(ref masterImage); 
     masterImage.AddDirtyRect(new Int32Rect(0, 0, masterImage.PixelWidth, masterImage.PixelHeight)); 
     masterImage.Unlock(); 
1

Вы обменяли X и Y, я представляю собой высоту, J представляет собой ширину, то вы shouldcall SetPixel нравятся:

temp.SetPixel(j, i, 255); 

В подобных случаях лучше использовать осмысленные имена переменные, такие как X и Y.

+0

Вы правы, я просто видел прототип функции. Я поменял их, но, тем не менее, я все еще получаю ту же ошибку, AcessViolationException –

+0

SetPixel не является частью WriteableBitmap, поэтому у вас есть расширение или компонент, выставляете код функции. – Gusman

+0

Но мы оба использовали его. Почему это не часть WritableBitmap? –

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

  • Нет связанных вопросов^_^