【发布时间】: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,只是想弄清楚文件大小? (此外,您确实应该处理您创建的所有
Bitmap或Image对象) -
@ScottChamberlain 再次更新 :)
-
所以您想从原始字节解码 JPEG 图像?并非不可能,但 .NET Framework 中没有任何东西可以直接为您完成这些工作。问题是JPEG是一种压缩格式,所以你必须先解压缩才能读取像素。