从字节数组创建PNG

时间:2015-08-25 11:55:22

标签: c# .net png

我有一个1维的字节数组,有A,R,G和B的单独值,我知道预期图像的高度和宽度。如何编码此数据并将其另存为PNG?

3 个答案:

答案 0 :(得分:2)

您可以使用位图和Bitmap.SetPixel()

然后save the Bitmap as png使用ImageFormat.Png。此外,您可能必须确保the Bitmap format maintains transparency

(这里的其他答案比SetPixel更快。)

修改

也许WPF可以直接使用数组。 (我没有多少经验。)

答案 1 :(得分:2)

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");
}

如果您的数组中的值以这种方式排序:B G R A B G R A B G R A ...您可以使用以下代码,它应该更快:

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");

此图片应如下所示:enter image description here

答案 2 :(得分:0)

使用Unsafe pointersLockBits

,她是一个更快的解决方案
public unsafe  Bitmap Retreive( byte [] values)
    {

        Bitmap bmp =new Bitmap(Width,Height);//enter your width and height here.
        BitmapData   bmData = bmp.LockBits(new System.Drawing.Rectangle(0, 0, bmp.Width,bmp.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat);
        IntPtr scan0 = bmData.Scan0;
        int stride = bmData.Stride;
        int nWidth = bmp.Width;
        int nHeight = bmp.Height;

           for(int y=0;y<nHeight;y++)
           {
                //define the pointers inside the first loop for parallelizing
                byte* p = (byte*)scan0.ToPointer();
                p += y * stride;



                for (int x = 0; x < nWidth; x++)
                {

                    //fill as  the values stored in you byte array;
                    p[0]=values[0];// R component.
                    p[1]=values[1];// G component.
                     p[2]=values[2];// B component.
                     p[3]=values[3];// Alpha component.
                    p += 4;


                }

            }

            bmp.UnlockBits(bmData);



            return bmp;



    }

只需填写存储在数组中的p[]值即可。

古德勒克。