Search code examples
c#.netpng

Create a PNG from an array of bytes


I have a 1 dimensional array of bytes, with separate values for A, R, G, and B, and I know the height and width of the expected image. How can I encode this data and save it as a PNG?


Solution

  • byte[] data = new byte[] {
        255, 255, 000, 000,  255, 255, 255, 255,  255, 255, 255, 255,  255, 255, 255, 255,  255, 255, 000, 000, 
        255, 255, 255, 255,  255, 255, 000, 000,  255, 255, 255, 255,  255, 255, 000, 000,  255, 255, 255, 255, 
        255, 255, 255, 255,  255, 255, 255, 255,  255, 255, 000, 000,  255, 255, 255, 255,  255, 255, 255, 255, 
        255, 255, 255, 255,  255, 255, 000, 000,  255, 255, 255, 255,  255, 255, 000, 000,  255, 255, 255, 255, 
        255, 255, 000, 000,  255, 255, 255, 255,  255, 255, 255, 255,  255, 255, 255, 255,  255, 255, 000, 000 
      };
    
      Bitmap bmp = new Bitmap(5, 5);
      for (int y = 0; y < 5; ++y)
        for (int x = 0; x < 5; ++x)
        {
          int offset = y * 5 * 4 + x * 4;
          bmp.SetPixel(x, y, Color.FromArgb(data[offset], data[offset + 1], data[offset + 2], data[offset + 3]));
        }
      bmp.Save(@"c:\tmp.png");
    }
    

    If the values in your array are ordered this way: B G R A B G R A B G R A ... you could use the following code, which should be faster:

    byte[] data = new byte[] {
      // B    G    R    A     B    G    R    A     B    G    R    A
          0,   0, 255, 255,    0,   0,   0, 255,    0, 255,   0, 255,
          0,   0,   0, 255,    0, 255,   0, 255,  255, 255, 255, 255,
          0, 255,   0, 255,    0,   0,   0, 255,  255,   0,   0, 255
      };
      int width = 3;
      int height = 3;
    
      Bitmap bmp = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
      var bitmapData = bmp.LockBits(new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.WriteOnly, bmp.PixelFormat);
      Marshal.Copy(data, 0, bitmapData.Scan0, data.Length);
      bmp.UnlockBits(bitmapData);
      bmp.Save(@"c:\tmp.png");
    

    This image should look like this: enter image description here