2015-01-26 86 views
1

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

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

+0

你知道特定文件的边界吗?例如,是否总是有12行文字? – Sebb 2015-01-26 22:07:07

+0

我确实不,但我确实知道每个图像都以 @,ЀVjpeg应用程序H,HHŌ照片 - JPEGؿJFIF HHタAppleMark – 2015-01-26 22:12:32

回答

1

首先这种做法可能会有所不同,具体取决于文件结构,但假设您知道文件中每个部分的边界或者在文件中存储某种二进制数据以指示段的实际长度等等。如果你没有按正常的文本文件按行存储文本,而是按二进制数据存储,那么海事组织会更好。 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) 

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

注意:您可以通过检查数据是否具有图像标头或创建自己的数据标头ex来验证数据。 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

+0

很好的答案:)这很好解释它,所以我只会注意到[关于检测jpg的这个线程](http:// stackoverflow。com/questions/772388/c-sharp-how-can-i-test-a-file-is-a-jpeg),其中指出jpg的幻数是'0xd8ffe0ff;'。所以你需要逐字节读取并搜索这个数字。如果每个文件有多个图像,则可以在检测到第一个图像后加载第一个图像,然后将其大小用作偏移量。 – Sebb 2015-01-26 22:29:33

+1

感谢您的回应!我会试试这个。我肯定会设计的数据不同,如果它是我的,但这是一个竞争对手的软件,我正在转换数据,所以我需要与它一起工作。 :) – 2015-01-26 23:08:24

+0

我得到以下异常在int sectionLength = br.ReadInt32(); System.IO.EndOfStreamException未处理 HResult = -2147024858 消息=无法读取超出流结束。 – 2015-01-27 15:11:04

相关问题