2016-11-26 1 views
1

Я пытаюсь преобразовать RenderTargetBitmap в массив байтов, который затем будет отправлен на внешний монохромный OLED-экран. Я знаю, что для растрового изображения, чтобы правильно отобразить выравнивание бит/байт должно быть LSB до MSB & Сверху вниз:Преобразование RenderTargetBitmap в байт [] для отображения на встроенном экране?

enter image description here

Но я не могу понять, как получить pixeldata в RenderTargetBitmap в этом формате.

На данный момент я получил:

 RenderTargetBitmap renderTargetBitmap; //This is already set higher up 
     DataReader reader = DataReader.FromBuffer(await renderTargetBitmap.GetPixelsAsync()); 

     // Placeholder for reading pixels 
     byte[] pixel = new byte[4]; // RGBA8 

     // Write out pixels 
     int index = 0; 
     byte[] array = new byte[renderTargetBitmap.PixelWidth*renderTargetBitmap.PixelHeight]; 
     using (reader) 
     { 
      //THIS IS WHERE I THINK I'M SCREWING UP 
      for (int x = 0; x < rHeight; x++) 
      { 
       for (int y = 0; x < rWidth; y++) 
       { 
        reader.ReadBytes(pixel); 
        if (pixel[2] == 255) 
         array[index] = 0xff; 
        else 
         array[index] = 0x00; 
        index++; 
       } 
      } 
     } 
     sh1106.ShowBitmap(buffer); //Send off the byte array 
+0

Кажется, вы не используете й и переменные у петли на всех, и «индекс» переменный не обновляется везде и всегда равен 0. – Evk

+0

я просто удалил 'индекс ++' по ошибке при копировании его в стеке переполнение. Я исправил это. А насчет петель x и y, где я заблокирован. Вся эта часть должна быть переписана, но я не могу понять, как это сделать. – user2950509

ответ

1

Я сталкивался с таким же вопросом, это то, что я сделал, чтобы получить его работу (это будет преобразовывать результат BGRA8 к выходу 1bpp, который затем может быть использован на монохромном дисплее, SSD1306 в моем случае)

На выходе 1BPP означает, что 8 пикселей хранятся в 1 байте. Поэтому вам нужно преобразовать каждые 4 байта в 1 бит.

public async Task Draw() 
    { 
    ActiveCanvas.UpdateLayout(); 
    ActiveCanvas.Measure(ActiveCanvas.DesiredSize); 
    ActiveCanvas.Arrange(new Rect(new Point(0, 0), ActiveCanvas.DesiredSize)); 

    // Create a render bitmap and push the surface to it 
    RenderTargetBitmap renderBitmap = new RenderTargetBitmap(); 
    await renderBitmap.RenderAsync(ActiveCanvas, (int)ActiveCanvas.DesiredSize.Width, (int)ActiveCanvas.DesiredSize.Height); 

    DataReader bitmapStream = DataReader.FromBuffer(await renderBitmap.GetPixelsAsync()); 

    if (_device != null) 
    { 
     byte[] pixelBuffer_1BPP = new byte[(int)(renderBitmap.PixelWidth * renderBitmap.PixelHeight)/32]; 

     pixelBuffer_1BPP.Initialize(); 

     using (bitmapStream) 
     { 
      while (bitmapStream.UnconsumedBufferLength > 0) 
      { 
       uint index = (uint)(renderBitmap.PixelWidth * renderBitmap.PixelHeight * 4) - bitmapStream.UnconsumedBufferLength; 

       for (int bit = 0; bit < 8; bit++) 
       { 
       bitmapStream.ReadBytes(BGRA8); 

       byte value = (byte)(((BGRA8[0] & 0x80) | (BGRA8[1] & 0x80) | (BGRA8[2] & 0x80)) == 0x80 ? 1 : 0); 

       pixelBuffer_1BPP[index] |= (byte)(value << (7 - bit)); 
       } 
      } 

      _device.DrawBitmap(0, 0, pixelBuffer_1BPP, (short)renderBitmap.PixelWidth, (short)renderBitmap.PixelHeight, Colors.White); 
     } 
    } 
    } 
Смежные вопросы