Пример #1
0
        }                                                                  // 'Enti'

        public override ImageMetaData ReadMetaData(IBinaryStream stream)
        {
            var header = stream.ReadHeader(0x40);

            if (0x03000100 != header.ToUInt32(8))
            {
                return(null);
            }
            if (!header.AsciiEqual(0x10, "Entis Rasterized Image") &&
                !header.AsciiEqual(0x10, "Moving Entis Image"))
            {
                return(null);
            }
            using (var reader = new EriFile(stream.AsStream))
            {
                var section = reader.ReadSection();
                if (section.Id != "Header  " || section.Length <= 0)
                {
                    return(null);
                }
                int           header_size = (int)section.Length;
                int           stream_pos  = 0x50 + header_size;
                EriFileHeader file_header = null;
                EriMetaData   info        = null;
                string        desc        = null;
                while (header_size > 0x10)
                {
                    section      = reader.ReadSection();
                    header_size -= 0x10;
                    if (section.Length <= 0 || section.Length > header_size)
                    {
                        break;
                    }
                    if ("FileHdr " == section.Id)
                    {
                        file_header = new EriFileHeader {
                            Version = reader.ReadInt32()
                        };
                        if (file_header.Version > 0x00020100)
                        {
                            throw new InvalidFormatException("Invalid ERI file version");
                        }
                        file_header.ContainedFlag = reader.ReadInt32();
                        file_header.KeyFrameCount = reader.ReadInt32();
                        file_header.FrameCount    = reader.ReadInt32();
                        file_header.AllFrameTime  = reader.ReadInt32();
                    }
                    else if ("ImageInf" == section.Id)
                    {
                        int version = reader.ReadInt32();
                        if (version != 0x00020100 && version != 0x00020200)
                        {
                            return(null);
                        }
                        info = new EriMetaData {
                            StreamPos = stream_pos, Version = version
                        };
                        info.Transformation = (CvType)reader.ReadInt32();
                        info.Architecture   = (EriCode)reader.ReadInt32();
                        info.FormatType     = (EriType)reader.ReadInt32();
                        int w = reader.ReadInt32();
                        int h = reader.ReadInt32();
                        info.Width           = (uint)Math.Abs(w);
                        info.Height          = (uint)Math.Abs(h);
                        info.VerticalFlip    = h < 0;
                        info.BPP             = reader.ReadInt32();
                        info.ClippedPixel    = reader.ReadInt32();
                        info.SamplingFlags   = (EriSampling)reader.ReadInt32();
                        info.QuantumizedBits = reader.ReadUInt64();
                        info.AllottedBits    = reader.ReadUInt64();
                        info.BlockingDegree  = reader.ReadInt32();
                        info.LappedBlock     = reader.ReadInt32();
                        info.FrameTransform  = reader.ReadInt32();
                        info.FrameDegree     = reader.ReadInt32();
                    }
                    else if ("descript" == section.Id)
                    {
                        if (0xFEFF == reader.PeekChar())
                        {
                            reader.Read();
                            var desc_chars = reader.ReadChars((int)section.Length / 2 - 1);
                            desc = new string (desc_chars);
                        }
                        else
                        {
                            var desc_chars = reader.ReadBytes((int)section.Length);
                            desc = Encoding.UTF8.GetString(desc_chars);
                        }
                    }
                    else
                    {
                        reader.BaseStream.Seek(section.Length, SeekOrigin.Current);
                    }
                    header_size -= (int)section.Length;
                }
                if (info != null)
                {
                    if (file_header != null)
                    {
                        info.Header = file_header;
                    }
                    if (desc != null)
                    {
                        info.Description = desc;
                    }
                }
                return(info);
            }
        }
Пример #2
0
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     byte[] header = new byte[0x40];
     if (header.Length != stream.Read (header, 0, header.Length))
         return null;
     if (0x03000100 != LittleEndian.ToUInt32 (header, 8))
         return null;
     if (!Binary.AsciiEqual (header, 0x10, "Entis Rasterized Image")
         && !Binary.AsciiEqual (header, 0x10, "Moving Entis Image"))
         return null;
     using (var reader = new EriFile (stream))
     {
         var section = reader.ReadSection();
         if (section.Id != "Header  " || section.Length <= 0)
             return null;
         int header_size = (int)section.Length;
         int stream_pos = 0x50 + header_size;
         EriFileHeader file_header = null;
         EriMetaData info = null;
         string desc = null;
         while (header_size > 0x10)
         {
             section = reader.ReadSection();
             header_size -= 0x10;
             if (section.Length <= 0 || section.Length > header_size)
                 break;
             if ("FileHdr " == section.Id)
             {
                 file_header = new EriFileHeader { Version = reader.ReadInt32() };
                 if (file_header.Version > 0x00020100)
                     throw new InvalidFormatException ("Invalid ERI file version");
                 file_header.ContainedFlag    = reader.ReadInt32();
                 file_header.KeyFrameCount    = reader.ReadInt32();
                 file_header.FrameCount       = reader.ReadInt32();
                 file_header.AllFrameTime     = reader.ReadInt32();
             }
             else if ("ImageInf" == section.Id)
             {
                 int version = reader.ReadInt32();
                 if (version != 0x00020100 && version != 0x00020200)
                     return null;
                 info = new EriMetaData { StreamPos = stream_pos, Version = version };
                 info.Transformation = (CvType)reader.ReadInt32();
                 info.Architecture = (EriCode)reader.ReadInt32();
                 info.FormatType = (EriType)reader.ReadInt32();
                 int w = reader.ReadInt32();
                 int h = reader.ReadInt32();
                 info.Width  = (uint)Math.Abs (w);
                 info.Height = (uint)Math.Abs (h);
                 info.VerticalFlip = h < 0;
                 info.BPP = reader.ReadInt32();
                 info.ClippedPixel = reader.ReadInt32();
                 info.SamplingFlags = (EriSampling)reader.ReadInt32();
                 info.QuantumizedBits = reader.ReadUInt64();
                 info.AllottedBits = reader.ReadUInt64();
                 info.BlockingDegree = reader.ReadInt32();
                 info.LappedBlock = reader.ReadInt32();
                 info.FrameTransform = reader.ReadInt32();
                 info.FrameDegree = reader.ReadInt32();
             }
             else if ("descript" == section.Id)
             {
                 if (0xFEFF == reader.PeekChar())
                 {
                     reader.Read();
                     var desc_chars = reader.ReadChars ((int)section.Length/2 - 1);
                     desc = new string (desc_chars);
                 }
                 else
                 {
                     var desc_chars = reader.ReadBytes ((int)section.Length);
                     desc = Encoding.UTF8.GetString (desc_chars);
                 }
             }
             else
             {
                 reader.BaseStream.Seek (section.Length, SeekOrigin.Current);
             }
             header_size -= (int)section.Length;
         }
         if (info != null)
         {
             if (file_header != null)
                 info.Header = file_header;
             if (desc != null)
                 info.Description = desc;
         }
         return info;
     }
 }