如何从 C# 中的文件流中获取多个图像
How to get multiple images from a filestream in C#
我有一个 Stream myStream
,我想从中获取 jpeg。如果流只是一个 jpeg 就没问题,我会做 Image img = Image.FromStream(MyStream);
但流实际上是一个 header(ASCII 文本)后跟一个 jpeg,然后是一个 header,接着是 jpeg...
我可以轻松提取 headers,它们包含有关 jpeg 的信息(特别是它的分辨率和字节大小),但我不知道如何在它们通过时获取图像并将它们保存到磁盘(实际上我只想在动画中一个接一个地显示它们,但这是一回事)。
有人有什么想法吗?
直播内容如下:
[320,240,10734]jpegDataIncomprihensibleTextGoingOnForAges[320,240,10032]jpegDataIncomprihensibleTextGoingOnForAges...
首先,您真的不想尝试使用文本文件执行此操作。您想以二进制形式读取文件,这就是 BinaryReader 的用途。
所以请阅读第一个 header。这为您提供了以字节为单位的 jpeg 大小。将文件定位到 jpeg 的开头并将那么多字节读入内存。然后创建一个 MemoryStream
并从该流构建图像。
所以,大体上:
var reader = new BinaryReader(File.Open(fileName, FileMode.Open));
while not end of file
{
// read header. Probably want to read characters one at a time here.
StringBuilder sb = new StringBuilder();
char c;
do
{
c = reader.ReadChar();
sb.Append(c);
} while c != ']';
var header = sb.ToString();
// parse header. One of the fields you get is SizeInBytes
var imageBytes = reader.ReadBytes(SizeInBytes);
var stream = new MemoryStream(imageBytes);
var jpeg = Image.FromStream(stream);
// do what you want with the jpeg here.
// the file should be positioned at the start of the next header
// so just do it all again until no more data.
}
我有一个 Stream myStream
,我想从中获取 jpeg。如果流只是一个 jpeg 就没问题,我会做 Image img = Image.FromStream(MyStream);
但流实际上是一个 header(ASCII 文本)后跟一个 jpeg,然后是一个 header,接着是 jpeg...
我可以轻松提取 headers,它们包含有关 jpeg 的信息(特别是它的分辨率和字节大小),但我不知道如何在它们通过时获取图像并将它们保存到磁盘(实际上我只想在动画中一个接一个地显示它们,但这是一回事)。
有人有什么想法吗?
直播内容如下:
[320,240,10734]jpegDataIncomprihensibleTextGoingOnForAges[320,240,10032]jpegDataIncomprihensibleTextGoingOnForAges...
首先,您真的不想尝试使用文本文件执行此操作。您想以二进制形式读取文件,这就是 BinaryReader 的用途。
所以请阅读第一个 header。这为您提供了以字节为单位的 jpeg 大小。将文件定位到 jpeg 的开头并将那么多字节读入内存。然后创建一个 MemoryStream
并从该流构建图像。
所以,大体上:
var reader = new BinaryReader(File.Open(fileName, FileMode.Open));
while not end of file
{
// read header. Probably want to read characters one at a time here.
StringBuilder sb = new StringBuilder();
char c;
do
{
c = reader.ReadChar();
sb.Append(c);
} while c != ']';
var header = sb.ToString();
// parse header. One of the fields you get is SizeInBytes
var imageBytes = reader.ReadBytes(SizeInBytes);
var stream = new MemoryStream(imageBytes);
var jpeg = Image.FromStream(stream);
// do what you want with the jpeg here.
// the file should be positioned at the start of the next header
// so just do it all again until no more data.
}