将.jpg图像的像素值读入字节数组

时间:2013-07-17 11:15:28

标签: c#

我正在尝试用c#写一个程序来通过以太网发送一个帧。

目前我拥有1920x1080分辨率的.jpg测试图像和非常不同的字节大小。

我正在尝试将.jpg图像转换为字节数组,我寻找类似的答案但是当我尝试它们时,我得到了每个图像包含437,1030,1013字节的字节数组。考虑到图像是高清分辨率,这没有意义。如何将图像文件转换为1920 * 1080 * 3(RGB)字节数组?请记住,我正在尝试开发一个应该能够以高速率发送帧的实时应用程序,因此这段代码不会很慢。

提前致谢。 Tunc

2 个答案:

答案 0 :(得分:1)

Image字节读取到字节数组:

                Image image = ...;
                MemoryStream ms = new MemoryStream();
                image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

                if (ms.Length == 0)
                {
                    ms.Close();
                    throw new Exception("Bad Image File");
                }

                ms.Position = 0;
                byte[] baImageBytes = new byte[ms.Length];
                ms.Read(baImageBytes , 0, (int)ms.Length);
                ms.Close();

从字节数组创建图像:

byte[] baImageBytes =...
Image myImage = Image.FromStream(new MemoryStream(baImageBytes ));

答案 1 :(得分:0)

JPG是一种压缩格式,这就是它的大小(和相应的Byte数组的大小)的原因 通常远小于1920 * 1080 * 3。为了从JPG获取Byte数组,您可以使用 流:

  Image myImage; 
  ...
  byte[] result;

  using (MemoryStream ms = new MemoryStream()) {
    myImage.Save(ms, ImageFormat.Jpeg); 

    result = ms.ToArray();
  }

如果你想要的只是Byte数组形式的像素,你必须将JPG转换为BMP(或其他原始的,未压缩的格式)

  Bitmap myImage;
  ... 
  byte[] rgbValues = null;

  BitmapData data = myImage.LockBits(new Rectangle(0, 0, myImage.Width, myImage.Height), ImageLockMode.ReadOnly, value.PixelFormat);

  try {
    IntPtr ptr = data.Scan0;
    int bytes = Math.Abs(data.Stride) * myImage.Height;
    rgbValues = new byte[bytes];
    Marshal.Copy(ptr, rgbValues, 0, bytes);
  }
  finally {
    myImage.UnlockBits(data);
  }
}