コード例 #1
0
        public VPXFile(string filename)
        {
            _cf = new CompoundFile(filename, CFSUpdateMode.ReadOnly, CFSConfiguration.Default);
            CFStorage gameStg = _cf.RootStorage.GetStorage("GameStg");
            UInt32    version = new VPXReader(gameStg.GetStream("Version")).ReadUInt32();

            void visitor(CFItem item)
            {
                if (item.Name.StartsWith("Image") && item is CFStream stream)
                {
                    ReadImage(stream, true);
                }
            }

            gameStg.VisitEntries(visitor, true);
        }
コード例 #2
0
        private byte[] ReadImage(CFStream stream, bool nameOnly)
        {
            var reader = new VPXReader(stream);
            var inJpg  = false;
            int size   = 0;
            var done   = false;

            byte[] data  = null;
            var    entry = new Entry();

            entry._stream = stream;
            while (!done)
            {
                var bytesInRecordRemaining = reader.ReadUInt32();
                var tag = reader.ReadString(Encoding.ASCII, 4);
                switch (tag)
                {
                case "ENDB":
                    if (inJpg)
                    {
                        inJpg = false;
                    }
                    else
                    {
                        done = true;
                    }
                    break;

                case "NAME":
                    entry._name          = reader.ReadLenPrefixedString(Encoding.ASCII);
                    _images[entry._name] = entry;
                    break;

                case "PATH":
                    entry._file = reader.ReadLenPrefixedString(Encoding.ASCII);
                    break;

                case "INME":
                    reader.ReadLenPrefixedString(Encoding.ASCII);
                    break;

                case "WDTH":
                    reader.ReadUInt32();
                    break;

                case "HGHT":
                    reader.ReadUInt32();
                    break;

                case "SIZE":
                    size = reader.ReadInt32();
                    break;

                case "ALTV":
                    reader.Skip(4);     // skip the float
                    break;

                case "JPEG":
                    inJpg = true;
                    break;

                case "DATA":
                    if (nameOnly)
                    {
                        done = true;
                    }
                    else
                    {
                        data = reader.Read(size);
                        if (data[0] == 0x89 && data[1] == 0x50 && data[2] == 0x4E && data[3] == 0x47 && data[4] == 0x0D && data[5] == 0x0A && data[6] == 0x1A && data[7] == 0x0A)
                        {
                            // PNG
                        }
                        else if (data[0] == 0xFF && data[1] == 0xD8)
                        {
                            // JPG
                        }
                        else if (data[0] == 0x23 && data[1] == 0x3F && data[2] == 0x52 && data[3] == 0x41 && data[4] == 0x44 && data[5] == 0x49 && data[6] == 0x41 && data[7] == 0x4E && data[8] == 0x43 && data[9] == 0x45 && data[10] == 0x0A)
                        {
                            // HDR (unsupported)
                            data = null;
                        }
                        else
                        {
                            data = null;
                        }
                    }
                    break;
                }
            }
            return(data);
        }