Beispiel #1
0
        private static void Create(string sarc2path)
        {
            Stream stream = new FileStream(sarc2path, FileMode.Open, FileAccess.Read);

            long offset = 0L;

            for (int i = 0; i < 16; i++)
            {
                int b = stream.ReadByte();
                if (b != 0)
                {
                    offset = offset * 10 + (b - '0');
                }
            }

            byte[] catalog_bytes = new byte[offset - 16];

            stream.Read(catalog_bytes, 0, (int)(offset - 16));
            int width  = 0;
            int height = 0;

            var levels = XElement.Load(new XmlTextReader(new MemoryStream(catalog_bytes))).Elements("file")
                         .Select(xfile =>
            {
                string r_path = xfile.Element("path").Value;
                var regex     = new Regex(@"(?<level>[0-9]+)/(?<x>[0-9]+)_(?<y>[0-9]+)\.jpg$");

                var match = regex.Match(r_path);
                if (!match.Success)
                {
                    if (Path.GetExtension(r_path) == ".xml")
                    {
                        stream.Seek(long.Parse(xfile.Element("start").Value) + offset, SeekOrigin.Begin);
                        var dataxml = new byte[long.Parse(xfile.Element("length").Value)];
                        stream.Read(dataxml, 0, dataxml.Length);
                        XElement xDzi = XElement.Load(XmlReader.Create(new MemoryStream(dataxml)));
                        var xElement  =
                            xDzi.Element(XNamespace.Get("http://schemas.microsoft.com/deepzoom/2009") + "Size");

                        width  = int.Parse(xElement.Attribute("Width").Value);
                        height = int.Parse(xElement.Attribute("Height").Value);

                        return(null);
                    }
                    else
                    {
                        throw new Exception();
                    }
                }
                int level = Convert.ToInt32(match.Groups["level"].Value);
                int x     = Convert.ToInt32(match.Groups["x"].Value);
                int y     = Convert.ToInt32(match.Groups["y"].Value);
                stream.Seek(long.Parse(xfile.Element("start").Value) + offset, SeekOrigin.Begin);
                var data = new byte[long.Parse(xfile.Element("length").Value)];
                stream.Read(data, 0, data.Length);
                return(new { level, x, y, data = data.Cast <object>().ToArray() });
            })
                         .Where(arg => arg != null)
                         .GroupBy(arg => arg.level)
                         .OrderBy(level => level.Key)
                         .Select(gl =>
                                 gl.GroupBy(arg => arg.x)
                                 .OrderBy(xs => xs.Key)
                                 .Select(gx =>
                                         gx.OrderBy(arg => arg.y)
                                         .Select(arg => arg.data)
                                         .ToArray())
                                 .ToArray())
                         .ToArray();

            stream.Close();

            if (width == 0 || height == 0)
            {
                throw new Exception();
            }

            cell =
                new PxCell(
                    new PTypeRecord(new NamedType("width", new PType(PTypeEnumeration.integer)),
                                    new NamedType("height", new PType(PTypeEnumeration.integer)),
                                    new NamedType("images",
                                                  new PTypeSequence(         //by level
                                                      new PTypeSequence(     //by x
                                                          new PTypeSequence( //by y
                                                              new PTypeSequence(new PType(PTypeEnumeration.@byte))))))),
                    Path.ChangeExtension(sarc2path, ".dz_px"), false);


            cell.Fill(new object[] { width, height, levels });
        }
Beispiel #2
0
        static void Main(string[] args)
        {
            string path = @"..\..\..\Databases\";

            InitTypes();
            DateTime tt0 = DateTime.Now;

            // Проверка объекта
            object[] testdb = new object[] {
                new object[] { 1, new object[] { "a", "b", "c" } },
                new object[] { 1, new object[] { "a1", "b1", "c1" } },
                new object[] { 2, new object[] { "da", "db", "dc", "lang" } }
            };
            Console.WriteLine(seqtriplets.Interpret(testdb));

            // Создание ячейки плавающего формата
            string testpacfilename = path + "test.pac";

            if (System.IO.File.Exists(testpacfilename))
            {
                System.IO.File.Delete(testpacfilename);
            }
            PaCell cell = new PaCell(seqtriplets, testpacfilename, false); // false - чтобы заполнять

            // Заполнение ячейки данными из объекта
            cell.Fill(testdb);
            // Проверка того, что имеется в ячейке
            var cell_pvalue = cell.Root.GetValue();

            Console.WriteLine(cell_pvalue.Type.Interpret(cell_pvalue.Value));

            PTypeUnion tp_u = new PTypeUnion();

            tp_u.Variants = new[] {
                new NamedType("empty", new PType(PTypeEnumeration.none)),
                new NamedType("node", new PTypeRecord(
                                  new NamedType("f0", new PType(PTypeEnumeration.boolean)),
                                  new NamedType("f1", new PTypeSequence(tp_u))))
            };
            object[] vv = new object[] { 1,
                                         new object[] {
                                             true,
                                             new object[] {
                                                 new object[] { 1,
                                                                new object[] {
                                                                    false,
                                                                    new object[0]
                                                                } }
                                             }
                                         } };
            PxCell xcell = new PxCell(tp_u, path + "xcell.pxc", false);

            xcell.Fill(vv);
            PxEntry e1 = xcell.Root.UElement().Field(1);
            PxEntry e2 = e1.Element(0);
            var     v  = e2.GetValue();

            Console.WriteLine(v.Type.Interpret(v.Value));

            return;

            //cell.Clear();
            //cell.Fill(testtriplets); // проверка на то, что при неочищенной ячейке, записать в нее нельзя
            //cell.Close();
            //cell.Clear();
            //cell.Fill(testtriplets); // проверка на то, что при очищении, записать можно

            //// Проверка серийного буфера, в него загружаются данные из XML-файла, в ячейку ничего не помещается
            //// Этот тест, для начала, можно пропустить.
            //tt0 = DateTime.Now;
            //SerialBuffer buff = new SerialBuffer(new SerialFlowReceiverStub(seqtriplets));
            //TestSerialInput(buff, path);
            //Console.WriteLine("Число элементов в объекте:" + ((object[])buff.Result).LongLength);
            //Console.WriteLine("Forming buffer ok. duration=" + (DateTime.Now - tt0).Ticks / 10000L); tt0 = DateTime.Now;

            // Проверка ввода из серийного скобочного потока для ячейки свободного формата
            // В данном случае, поток порождается при сканировании XML-документа
            tt0 = DateTime.Now;
            cell.Clear();
            TestSerialInput(cell, path);
            Console.WriteLine("Число элементов в объекте:" + cell.Root.Count());
            Console.WriteLine("Serial input ok. duration=" + (DateTime.Now - tt0).Ticks / 10000L); tt0 = DateTime.Now;
            cell.Close(); // Ячейка закрыта, теперь ее нельзя использовать

            // Проверка создания ячейки в режиме чтения
            PaCell cell2pac = new PaCell(seqtriplets, testpacfilename);
            long   cnt2     = cell2pac.Root.Count();
            var    pval2    = cell2pac.Root.Element(100000).GetValue();

            Console.WriteLine("cnt2=" + cnt2 + " Element(100000).Get()=" + pval2.Type.Interpret(pval2.Value));
            Console.WriteLine("ReadObly cell ok. duration=" + (DateTime.Now - tt0).Ticks / 10000L); tt0 = DateTime.Now;

            // Создание ячейки фиксированного формата
            xcell.Clear();
            xcell = new PxCell(seqtriplets, path + "test.pxc", false);
            var pv = cell2pac.Root.Get();

            tt0 = DateTime.Now;
            xcell.Fill2(pv); // Плохой метод, заменю на хороший
            Console.WriteLine("xcell Fill ok. duration=" + (DateTime.Now - tt0).Ticks / 10000L); tt0 = DateTime.Now;

            // Проверка наполнения
            PxEntry rxt = xcell.Root;
            var     ele = rxt.Element(400000).GetValue();

            Console.WriteLine(ele.Type.Interpret(ele.Value));
            Console.WriteLine("ok. duration=" + (DateTime.Now - tt0).Ticks / 10000L); tt0 = DateTime.Now;
        }