从单个文件中提取多个JPEG

时间:2015-01-26 22:03:47

标签: c# vb.net jpeg

我有100个文件,顶部有一些数据,底部有一系列图像。我需要使用C#或VB读取这些数据,然后将各个图像写入文件。以下是Notepad ++中文件的示例: http://i.imgur.com/QJCbDQ3.png

我需要读取顶部的所有数据以及图像。任何帮助或示例将不胜感激。

1 个答案:

答案 0 :(得分:1)

首先,这种方法可能因文件结构而异,但假设您知道文件中每个部分的边界,或者在文件中存储某种二进制数据以指示部分的实际长度等如果你没有像普通文本文件那样逐行存储文本,而是作为二进制数据,那么IMO会更好。 BinaryReader / BinaryWriter类(来自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)

写入实际文件也是如此。每次将数据写入文件时,都要在写入数据之前指定数据的大小。 这种方法最终也更安全。

注意:您可以通过检查数据是否具有图像标头或创建您自己的数据标头来验证数据。类型为1或2个字节。 我建议2个字节有适当的填充。 这可能是如下的枚举:

enum DataType : short
{
    Text = 0,
    Image = 1
}

然后在阅读部分数据之前,您会读到类似的类型:

var type = (DataType)br.ReadInt16();

这也可以使用新的不同数据结构轻松扩展文件结构。防爆。您可以实现除文本和图像之外的其他内容,例如音频文件,视频,其他二进制文件等。

如果你不知道任何数据,除了图像有图像标题,那么你可能只想比较字节并检查匹配的图像标题。这可能会失败,也可能不会,因为图像标题可能不同+您对存储的图像数据没有确切的了解(除非您实际读取了某些标题并收集图像边界,否则您可以计算出逻辑读取的字节数。根据图像类型不同,例如JPG,PNG,GIF等。您可以看一下:Getting image dimensions without reading the entire file