【问题标题】:C# How image is stored in MemoryStreamC# 图像如何存储在 MemoryStream 中
【发布时间】:2016-11-13 22:36:34
【问题描述】:

我在一个项目中工作,我需要处理从套接字接收的图像并显示它。

我正在获取jpeg 格式的图像,我不能只使用Image.FromStream()); 方法来检索图像,因为它包含更多数据,我想在读取数据时处理它效率原因。(基本上我想要的是手动从流中读取图像)。 是否有任何来源可以解释这些图像如何存储在MemoryStream 中?

MemoryStream 建立在 byte[] 缓冲区上,我也重用相同的缓冲区,并且每次调用该方法时我都不会创建新的 MemoryStream。 代码示例:

    private byte[] BlockToJpeg()
    {       
        Bitmap block=new Bitmap("...");
        MemoryStream ms=new MemoryStream();
        block.Save(ms, ImageFormat.Jpeg);
        return ms.GetBuffer();
    }

所以调用看起来像这样

  byte[] buffer=BlockToJpeg();
  sck.Send(buffer);//sending the buffer...not the full code because this is not our problem.

现在在 Reciver 端,什么时候我会得到那个缓冲区:

Byte[] RecieveBuffer=sck.Recieve();//again,kind of pseudo code,because this is not the relevant part.

我必须处理它的像素,所以我更愿意手动从byte[] array 中读取它们... 是否有任何结构可以读取这个(在我们的例子中——读取存储为字节数组的 jpeg 图像)? 例如-前 4 个字节是宽度,第二个是高度...第三个是 PixelFormat,其余的是像素值...或其他什么...?

谢谢。

【问题讨论】:

  • 图像不会存储在 MemoryStreams 中,除非你把它们放在那里。您需要询问填充 MemoryStream 的人他们选择如何布局数据。数据本身只是文件的一种表示,它的布局与硬盘驱动器上的文件完全相同。
  • @ScottChamberlain 好吧..我在问题中添加了一个简短的代码示例,以便更容易理解..
  • 在您的更新中,BlockToJpeg 没有多大意义,您想在那里做什么?如果您将png转换为jpeg,只是想弄清楚文件大小? (此外,您确实应该处理您创建的所有 BitmapImage 对象)
  • @ScottChamberlain 再次更新 :)
  • 所以您想从原始字节解码 JPEG 图像?并非不可能,但 .NET Framework 中没有任何东西可以直接为您完成这些工作。问题是JPEG是一种压缩格式,所以你必须先解压缩才能读取像素。

标签: c# image stream


【解决方案1】:

jpeg 是一种通常用于图像的压缩方法。 你可以在这里阅读更多信息:http://www.ams.org/samplings/feature-column/fcarc-image-compression

【讨论】:

    猜你喜欢
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多