Пример #1
0
        public void SplitSegmentData_NoSegments()
        {
            var data     = new byte[] { };
            var segments = JpegSegmentUtils.SplitSegmentData(data, JpegSegmentType.App1, "T").ToList();

            Assert.AreEqual(0, segments.Count);
        }
Пример #2
0
        public void SplitSegmentData_OneSegment()
        {
            var data     = new byte[] { 0x12, 0x34 };
            var segments = JpegSegmentUtils.SplitSegmentData(data, JpegSegmentType.App1, "T", 5).ToList();

            Assert.AreEqual(1, segments.Count);

            Assert.AreEqual(JpegSegmentType.App1, segments[0].Type);
            CollectionAssert.AreEqual(new byte[]
            {
                (byte)'T', 0x12, 0x34
            }, segments[0].Bytes);
        }
Пример #3
0
        public void Store(IEntity entity)
        {
            if (entity == null)
            {
                throw new ArgumentNullException(nameof(entity));
            }

            string tmpFileName;

            using (var segmentReader = _segmentReaderFactory.CreateFromPath(entity.Path))
                using (var segmentWriter = _segmentWriterFactory.CreateFromPath(entity.Path, out tmpFileName))
                {
                    // copy all but attribute segments
                    for (;;)
                    {
                        var segment = segmentReader.ReadSegment();
                        if (segment == null)
                        {
                            break;
                        }

                        if (IsAttributeSegment(segment) ||
                            segment.Type == JpegSegmentType.Sos)
                        {
                            continue;
                        }

                        segmentWriter.WriteSegment(segment);
                    }

                    // serialize attributes to JpegSegments
                    var serialized = Serialize(entity);
                    var segments   = JpegSegmentUtils.SplitSegmentData(serialized, JpegSegmentType.App1,
                                                                       AttributeReader.JpegSegmentHeader);

                    // write attribute segments
                    foreach (var segment in segments)
                    {
                        segmentWriter.WriteSegment(segment);
                    }

                    // write SOS segment and image data (including the EOI segment at the end)
                    segmentWriter.Finish(segmentReader.BaseStream);
                }

            // replace the original file with the modified file
            _fileSystem.ReplaceFile(tmpFileName, entity.Path, null);
        }
Пример #4
0
        public void SplitSegmentData_MultipleSegmentsWithTheActialMaximalSegmentSize()
        {
            var data = new byte[0xFFFF - 1];

            data[data.Length - 1] = 0xFF;
            data[data.Length - 2] = 0xEE;

            var segments = JpegSegmentUtils.SplitSegmentData(data, JpegSegmentType.App1, "T").ToList();

            Assert.AreEqual(2, segments.Count);
            Assert.AreEqual(0xFFFF - 2, segments[0].Bytes.Length);
            Assert.AreEqual(3, segments[1].Bytes.Length);
            Assert.AreEqual((byte)'T', segments[1].Bytes[0]);
            Assert.AreEqual(0xEE, segments[1].Bytes[1]);
            Assert.AreEqual(0xFF, segments[1].Bytes[2]);
        }
Пример #5
0
        public void SplitSegmentData_MultipleSegments()
        {
            var data     = new byte[] { 0x12, 0x34, 0x56, 0x78, 0x9A };
            var segments = JpegSegmentUtils.SplitSegmentData(data, JpegSegmentType.App1, "T", 5).ToList();

            Assert.AreEqual(2, segments.Count);

            Assert.AreEqual(JpegSegmentType.App1, segments[0].Type);
            CollectionAssert.AreEqual(new byte[]
            {
                (byte)'T', 0x12, 0x34, 0x56, 0x78
            }, segments[0].Bytes);

            Assert.AreEqual(JpegSegmentType.App1, segments[1].Type);
            CollectionAssert.AreEqual(new byte[]
            {
                (byte)'T', 0x9A
            }, segments[1].Bytes);
        }