从单个文件中提取多个 JPEG
Extract multiple JPEG's from a single file
我有 100 个文件,顶部有一些数据,底部有一系列图像。我需要使用 C# 或 VB 读取此数据,然后将各个图像写入文件。以下是该文件在 Notepad++ 中的外观示例:
http://i.imgur.com/QJCbDQ3.png
我需要阅读顶部的所有数据以及图像。任何帮助或示例将不胜感激。
首先,这种方法可能因文件结构而异,但假设您知道文件中每个部分的边界或文件中存储了某种二进制数据以指示实际长度部分等。 IMO 如果您没有像普通文本文件那样按行存储文本,而是将文本存储为二进制数据,那会更好。
BinaryReader
/ BinaryWriter
类 (From System.IO
) 将最好地解决这个问题,除非文件中的所有部分都是静态大小,那么你可以只使用 File.ReadAllBytes()
并简单地从与文件关联的字节数组中复制字节。但是,假设这些部分具有动态大小,那么您可能想要使用这样的东西:
using (var fs = new FileStream("yourfile.bin", FileMode.Open))
{
using (var br = new BinaryReader(fs))
{
int sections = br.ReadInt32();
for (int i = 0; i < sections; i++)
{
int sectionLength = br.ReadInt32();
byte[] sectionData = br.ReadBytes(sectionLength);
// Use the data however you want ...
// A good idea would be to check whether it's text or an image
}
}
}
相当于以下文件结构:
4 bytes (int) for the amount of section
每个部分代表以下结构:
4 bytes (int) OR 8 bytes (long) if the images are big
byte[] DataBytes (This will either be the bytes of text or the bytes of images)
写入实际文件也是如此。每次将数据写入文件时,您都在写入数据之前指定数据的大小。
这种做法到底也比较安全
注意:您可以通过检查数据是否有图像 header 或创建您自己的数据类型 header 来验证数据。 1 或 2 个字节用于类型。
我建议 2 个字节有适当的填充。
这可能是如下所示的枚举:
enum DataType : short
{
Text = 0,
Image = 1
}
然后在阅读部分数据之前,您阅读的类型如下:
var type = (DataType)br.ReadInt16();
这也使得使用新的不同数据结构轻松扩展文件结构成为可能。前任。除了文本和图像,您还可以实现其他内容,例如音频文件、视频、其他二进制文件等。
如果您不知道任何数据,除了图像可能有图像 headers,那么您可能只想比较字节并检查匹配的图像 headers。这可能会失败,也可能不会,因为图像 headers 可能不同 + 你对存储的图像数据没有确切的了解(除非你实际阅读了一些 header 并收集图像边界,然后你可以弄清楚逻辑读取多少字节。这取决于图像类型,例如 JPG、PNG、GIF 等。您可以看一下:Getting image dimensions without reading the entire file
我有 100 个文件,顶部有一些数据,底部有一系列图像。我需要使用 C# 或 VB 读取此数据,然后将各个图像写入文件。以下是该文件在 Notepad++ 中的外观示例: http://i.imgur.com/QJCbDQ3.png
我需要阅读顶部的所有数据以及图像。任何帮助或示例将不胜感激。
首先,这种方法可能因文件结构而异,但假设您知道文件中每个部分的边界或文件中存储了某种二进制数据以指示实际长度部分等。 IMO 如果您没有像普通文本文件那样按行存储文本,而是将文本存储为二进制数据,那会更好。
BinaryReader
/ BinaryWriter
类 (From System.IO
) 将最好地解决这个问题,除非文件中的所有部分都是静态大小,那么你可以只使用 File.ReadAllBytes()
并简单地从与文件关联的字节数组中复制字节。但是,假设这些部分具有动态大小,那么您可能想要使用这样的东西:
using (var fs = new FileStream("yourfile.bin", FileMode.Open))
{
using (var br = new BinaryReader(fs))
{
int sections = br.ReadInt32();
for (int i = 0; i < sections; i++)
{
int sectionLength = br.ReadInt32();
byte[] sectionData = br.ReadBytes(sectionLength);
// Use the data however you want ...
// A good idea would be to check whether it's text or an image
}
}
}
相当于以下文件结构:
4 bytes (int) for the amount of section
每个部分代表以下结构:
4 bytes (int) OR 8 bytes (long) if the images are big
byte[] DataBytes (This will either be the bytes of text or the bytes of images)
写入实际文件也是如此。每次将数据写入文件时,您都在写入数据之前指定数据的大小。 这种做法到底也比较安全
注意:您可以通过检查数据是否有图像 header 或创建您自己的数据类型 header 来验证数据。 1 或 2 个字节用于类型。 我建议 2 个字节有适当的填充。 这可能是如下所示的枚举:
enum DataType : short
{
Text = 0,
Image = 1
}
然后在阅读部分数据之前,您阅读的类型如下:
var type = (DataType)br.ReadInt16();
这也使得使用新的不同数据结构轻松扩展文件结构成为可能。前任。除了文本和图像,您还可以实现其他内容,例如音频文件、视频、其他二进制文件等。
如果您不知道任何数据,除了图像可能有图像 headers,那么您可能只想比较字节并检查匹配的图像 headers。这可能会失败,也可能不会,因为图像 headers 可能不同 + 你对存储的图像数据没有确切的了解(除非你实际阅读了一些 header 并收集图像边界,然后你可以弄清楚逻辑读取多少字节。这取决于图像类型,例如 JPG、PNG、GIF 等。您可以看一下:Getting image dimensions without reading the entire file