Пример #1
0
        /// <summary>
        /// Expands each packet interval in the source tile
        /// to a list of tilepart packet intervals.
        /// Performs the supplied function over the tile-part
        /// packet interval, with an optional computational
        /// result.
        /// </summary>
        /// <typeparam name="T">
        /// The optional aggregate result of perform
        /// </typeparam>
        /// <param name="intervals">The packet intervals</param>
        /// <param name="srcTile">The source tile</param>
        /// <param name="perform">
        /// The function to perform on each tile-part packet interval
        /// </param>
        private void EnumerateIntervals <T>(
            IEnumerable <PacketInterval> intervals,
            JP2Tile srcTile,
            Func <JP2TilePart, int, int, T, T> perform)
        {
            var scanner   = new SegmentScanner(srcTile.GetPacketCounts());
            T   aggregate = default(T);

            foreach (var ival in intervals)
            {
                // use inclusive end packet index
                SegmentLocation segStart = scanner.Find(ival.PacketStart);
                SegmentLocation segEnd   = scanner.Find(ival.PacketEnd - 1);
                int             tpStart  = segStart.SegmentIdx;
                int             tpEnd    = segEnd.SegmentIdx;
                // an interval of packets in the tile may span across multiple tile-parts.
                for (int tpIdx = tpStart; tpIdx <= tpEnd; tpIdx++)
                {
                    JP2TilePart tp       = srcTile.OpenTilePart(tpIdx);
                    int         pckStart = tpIdx == tpStart
                        ? segStart.InSegmentIdx : 0;
                    int pckEnd = tpIdx == tpEnd
                        ? (segEnd.InSegmentIdx + 1) : tp.Packets;
                    int pckCount = pckEnd - pckStart;
                    aggregate = perform(tp, pckStart, pckCount, aggregate);
                }
            }
        }
Пример #2
0
 public void Add(JP2TilePart tp)
 {
     if (_tileparts.Count >= MaxEntries)
     {
         throw new InvalidOperationException(String.Concat(
                                                 "Exceeded limit for this TLM marker, ",
                                                 "must create a new TLM"));
     }
     _tileparts.Add(tp);
     _isDirty = true;
 }
Пример #3
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();
        }
Пример #4
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();
        }