Beispiel #1
0
        private void CopyTileResLevel(JP2Codestream dst, JP2Codestream src, ushort tIdx, int r)
        {
            int decomps     = src.DecompositionLevels;
            var dstTilePart = dst.CreateTilePart(tIdx, r == decomps);

            // get all packets for this resolution level and source tile
            // currently support only a single tile in source image for every
            // destination tile.
            QueryContext queryContext = new QueryContext(src, 0);
            PreciseQuery preciseQuery = PreciseQuery.Create(queryContext);
            var          intervals    = preciseQuery
                                        .Resolution(r)
                                        .Execute();
            JP2Tile srcTile = src.Tiles[0];
            // add packet lengths
            Func <JP2TilePart, int, int, int, int> addPacketLengths =
                (tpSrc, pckStart, pckCount, voidParam) =>
            {
                var lengths = tpSrc.GetPacketLengths(pckStart, pckCount);
                dstTilePart.AddPacketLengths(lengths);
                return(voidParam);
            };

            EnumerateIntervals <int>(intervals, srcTile, addPacketLengths);

            // bulk transfer packet data
            dstTilePart.Flush();
            byte[] buffer = new byte[1 << 16];
            Func <JP2TilePart, int, int, uint, uint> bulkTransfer =
                (tpSrc, pckStart, pckCount, dstOffset) =>
            {
                uint dataCount = JP2TilePart.BulkTransferData(
                    dstTilePart,
                    dstOffset,
                    tpSrc,
                    pckStart,
                    pckCount,
                    buffer);
                return(dstOffset + dataCount);
            };

            EnumerateIntervals <uint>(
                intervals,
                srcTile,
                bulkTransfer);
            dstTilePart.Close();
            srcTile.Close();
        }
Beispiel #2
0
        private void CopyImage()
        {
            var cs        = _jp2.OpenCodestream();
            int tileparts = cs.OpenChildren().Count();
            var markers   = cs.Markers.Values
                            .Where(ms => ms.Type != MarkerType.TLM);
            var csout = new JP2Codestream(markers, tileparts);

            csout.Bind(_mem, 0);
            JP2TilePart tpin  = cs.OpenTilePart(0, 0);
            JP2TilePart tpout = csout.CreateTilePart(0, true);

            tpout.AddPacketLengths(
                tpin.GetPacketLengths(0, tpin.Packets));
            tpout.Flush();
            uint dataCount =
                JP2TilePart.BulkTransferData(tpout, 0, tpin, 0, tpin.Packets);

            csout.Flush();
        }
Beispiel #3
0
        public void Initialize()
        {
            _fs   = File.OpenRead("test.jp2");
            _mem  = new MemoryStream();
            _csin = Jp2File.Open(_fs).OpenCodestream();
            var siz   = _csin.Markers[MarkerType.SIZ] as SizMarker;
            var cod   = _csin.Markers[MarkerType.COD] as CodMarker;
            var qcd   = _csin.Markers[MarkerType.QCD] as QcdMarker;
            var tpin  = _csin.OpenTilePart(0, 0);
            var csout = new JP2Codestream(new List <MarkerSegment>()
            {
                siz, cod, qcd
            }, 1);

            csout.Bind(_mem, 0);
            var tpout   = csout.CreateTilePart(0, true);
            var lengths = tpin.GetPacketLengths(0, tpin.Packets);

            tpout.AddPacketLengths(lengths);
            tpout.Flush();
            csout.Flush();
            _mem.Seek(0, SeekOrigin.Begin);
        }