예제 #1
0
 /// <exception cref="System.IO.IOException"/>
 public static void SaveSegmentFiles([NotNull] string jpegFilePath, [NotNull] JpegSegmentData segmentData)
 {
     foreach (JpegSegmentType segmentType in segmentData.GetSegmentTypes())
     {
         IList <sbyte[]> segments = Iterables.ToList(segmentData.GetSegments(segmentType));
         if (segments.Count == 0)
         {
             continue;
         }
         if (segments.Count > 1)
         {
             for (int i = 0; i < segments.Count; i++)
             {
                 string outputFilePath = Sharpen.Extensions.StringFormat("%s.%s.%d", jpegFilePath, Sharpen.Extensions.ConvertToString(segmentType).ToLower(), i);
                 System.Console.Out.Println("Writing: " + outputFilePath);
                 FileUtil.SaveBytes(new FilePath(outputFilePath), segments[i]);
             }
         }
         else
         {
             string outputFilePath = Sharpen.Extensions.StringFormat("%s.%s", jpegFilePath, Sharpen.Extensions.ConvertToString(segmentType).ToLower());
             System.Console.Out.Println("Writing: " + outputFilePath);
             FileUtil.SaveBytes(new FilePath(outputFilePath), segments[0]);
         }
     }
 }
        /// <exception cref="System.IO.IOException"/>
        /// <exception cref="Com.Drew.Imaging.Jpeg.JpegProcessingException"/>
        public static void Main(string[] args)
        {
            if (args.Length < 1)
            {
                PrintUsage();
                System.Environment.Exit(1);
            }
            string filePath = args[0];

            if (!new FilePath(filePath).Exists())
            {
                System.Console.Error.Println("File does not exist");
                PrintUsage();
                System.Environment.Exit(1);
            }
            ICollection <JpegSegmentType> segmentTypes = new HashSet <JpegSegmentType>();

            for (int i = 1; i < args.Length; i++)
            {
                JpegSegmentType segmentType = JpegSegmentType.ValueOf(args[i].ToUpper());
                if (!segmentType.canContainMetadata)
                {
                    System.Console.Error.Printf("WARNING: Segment type %s cannot contain metadata so it may not be necessary to extract it%n", segmentType);
                }
                segmentTypes.Add(segmentType);
            }
            if (segmentTypes.Count == 0)
            {
                // If none specified, use all that could reasonably contain metadata
                Sharpen.Collections.AddAll(segmentTypes, JpegSegmentType.canContainMetadataTypes);
            }
            JpegSegmentData segmentData = JpegSegmentReader.ReadSegments(new FilePath(filePath), segmentTypes.AsIterable());

            SaveSegmentFiles(filePath, segmentData);
        }
        public void TestContainsSegment()
        {
            var segmentData  = new JpegSegmentData();
            var segmentType  = JpegSegmentType.App3;
            var segmentBytes = new byte[] { 1, 2, 3 };

            Assert.True(!segmentData.ContainsSegment(segmentType));
            segmentData.AddSegment(segmentType, segmentBytes);
            Assert.True(segmentData.ContainsSegment(segmentType));
        }
        public void TestAddAndGetSegment()
        {
            var segmentData  = new JpegSegmentData();
            var segmentType  = JpegSegmentType.App3;
            var segmentBytes = new byte[] { 1, 2, 3 };

            segmentData.AddSegment(segmentType, segmentBytes);
            Assert.Equal(1, segmentData.GetSegmentCount(segmentType));
            Assert.Equal(segmentBytes, segmentData.GetSegment(segmentType));
        }
        public void TestSegmentWithMultipleOccurrences()
        {
            var segmentData   = new JpegSegmentData();
            var segmentType   = JpegSegmentType.App3;
            var segmentBytes1 = new byte[] { 1, 2, 3 };
            var segmentBytes2 = new byte[] { 3, 2, 1 };

            segmentData.AddSegment(segmentType, segmentBytes1);
            segmentData.AddSegment(segmentType, segmentBytes2);
            Assert.Equal(2, segmentData.GetSegmentCount(segmentType));
            Assert.Equal(segmentBytes1, segmentData.GetSegment(segmentType));
            Assert.Equal(segmentBytes2, segmentData.GetSegment(segmentType, occurrence: 1));
        }
        public void TestRemoveSegmentOccurrence()
        {
            var segmentData   = new JpegSegmentData();
            var segmentType   = JpegSegmentType.App3;
            var segmentBytes1 = new byte[] { 1, 2, 3 };
            var segmentBytes2 = new byte[] { 3, 2, 1 };

            segmentData.AddSegment(segmentType, segmentBytes1);
            segmentData.AddSegment(segmentType, segmentBytes2);
            Assert.Equal(2, segmentData.GetSegmentCount(segmentType));
            Assert.Equal(segmentBytes1, segmentData.GetSegment(segmentType));
            segmentData.RemoveSegmentOccurrence(segmentType, 0);
            Assert.Equal(segmentBytes2, segmentData.GetSegment(segmentType));
        }
        public void TestAddingMultipleSegments()
        {
            var segmentData   = new JpegSegmentData();
            var segmentType1  = JpegSegmentType.App3;
            var segmentType2  = JpegSegmentType.App4;
            var segmentBytes1 = new byte[] { 1, 2, 3 };
            var segmentBytes2 = new byte[] { 3, 2, 1 };

            segmentData.AddSegment(segmentType1, segmentBytes1);
            segmentData.AddSegment(segmentType2, segmentBytes2);
            Assert.Equal(1, segmentData.GetSegmentCount(segmentType1));
            Assert.Equal(1, segmentData.GetSegmentCount(segmentType2));
            Assert.Equal(segmentBytes1, segmentData.GetSegment(segmentType1));
            Assert.Equal(segmentBytes2, segmentData.GetSegment(segmentType2));
        }
        public void TestRemoveSegment()
        {
            var segmentData   = new JpegSegmentData();
            var segmentType   = JpegSegmentType.App3;
            var segmentBytes1 = new byte[] { 1, 2, 3 };
            var segmentBytes2 = new byte[] { 3, 2, 1 };

            segmentData.AddSegment(segmentType, segmentBytes1);
            segmentData.AddSegment(segmentType, segmentBytes2);
            Assert.Equal(2, segmentData.GetSegmentCount(segmentType));
            Assert.True(segmentData.ContainsSegment(segmentType));
            Assert.Equal(segmentBytes1, segmentData.GetSegment(segmentType));
            segmentData.RemoveAllSegments(segmentType);
            Assert.True(!segmentData.ContainsSegment(segmentType));
            Assert.Equal(0, segmentData.GetSegmentCount(segmentType));
        }
        private static void SaveSegmentFiles(string jpegFilePath, JpegSegmentData segmentData)
        {
            foreach (var segmentType in segmentData.GetSegmentTypes())
            {
                IList <byte[]> segments = segmentData.GetSegments(segmentType).ToList();

                if (segments.Count == 0)
                {
                    continue;
                }

                var format = segments.Count > 1 ? "{0}.{1}.{2}" : "{0}.{1}";

                for (var i = 0; i < segments.Count; i++)
                {
                    var outputFilePath = string.Format(format, jpegFilePath, segmentType.ToString().ToLower(), i);

                    Console.Out.WriteLine("Writing: " + outputFilePath);
                    File.WriteAllBytes(outputFilePath, segments[i]);
                }
            }
        }