コード例 #1
0
        private static void ProcessFile(string inputFileName, string outputFileName, long jpegQuality = 100)
        {
            LinkedList <Tuple <string, byte[]> > jpegSegments;
            JpegFile jpegFile = new JpegFile();
            Dictionary <string, string> panoDict;

            byte[] extendedXMPURI       = Encoding.UTF8.GetBytes("http://ns.adobe.com/xmp/extension/");
            byte[] zeroByte             = { 0x0 };
            byte[] extendedXMPSignature = null;
            string extendXMP            = "";

            //            string inputJpeg = args[0];
            //            string outputJpeg = args[1];
            ExifReadWrite exif = new ExifReadWrite();


            using (var stream = File.OpenRead(inputFileName))
                jpegSegments = jpegFile.Parse(stream);

            bool xmpFound         = false;
            bool extendedXMPFound = false;

            foreach (var segment in jpegSegments)
            {
                //Console.WriteLine(segment.Item1);

                if (segment.Item1 == "EXIF")
                {
                    exif.ReadExifAPP1(segment.Item2);
                }

                if (xmpFound != true && segment.Item1 == "APP1")
                {
                    string start = Encoding.UTF8.GetString(segment.Item2, 0, 28);
                    if (start == "http://ns.adobe.com/xap/1.0/")
                    {
                        // XMP, extract the GPano if its there.
                        panoDict = jpegFile.ExtractGPano(Encoding.UTF8.GetString(segment.Item2, 29, segment.Item2.Length - 29));
                        string xmpMD5;
                        if (panoDict.TryGetValue("xmpNote:HasExtendedXMP", out xmpMD5))
                        {
                            extendedXMPSignature = extendedXMPURI.Concat(zeroByte).Concat(Encoding.UTF8.GetBytes(xmpMD5)).ToArray();
                            extendedXMPFound     = true;
                        }
                    }
                }

                if (extendedXMPFound == true && segment.Item1 == "APP1" && jpegFile.segmentCompare(extendedXMPSignature, segment.Item2))
                {
                    extendXMP += jpegFile.ProcessExtendedXMPSegemnt(segment.Item2, extendXMP.Length);
                }
            }

            var md5     = System.Security.Cryptography.MD5.Create();
            var md5hash = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(extendXMP));

            var sb = new StringBuilder();

            for (int i = 0; i < md5hash.Length; i++)
            {
                sb.Append(md5hash[i].ToString("x2"));
            }

            if (extendXMP.Length > 0)
            {
                var newJpeg = jpegFile.ProcessExtendedXMPXML(extendXMP);
                if (newJpeg != null)
                {
                    jpegFile.WriteCombineImage(inputFileName, outputFileName, newJpeg, exif, jpegQuality);
                }
            }
        }
コード例 #2
0
        public Vr180Jpeg SplitImage(string orginalJpeg, string format, long newJpegQuailty)
        {
            Bitmap    firstHalf, secondHalf;
            Bitmap    originalImage = new Bitmap(Image.FromFile(orginalJpeg));
            Rectangle rect;

            switch (format)
            {
            case "lr":

                rect      = new Rectangle(0, 0, originalImage.Width / 2, originalImage.Height);
                firstHalf = originalImage.Clone(rect, originalImage.PixelFormat);

                rect       = new Rectangle(originalImage.Width / 2, 0, originalImage.Width / 2, originalImage.Height);
                secondHalf = originalImage.Clone(rect, originalImage.PixelFormat);

                break;

            case "rl":

                rect      = new Rectangle(originalImage.Width / 2, 0, originalImage.Width / 2, originalImage.Height);
                firstHalf = originalImage.Clone(rect, originalImage.PixelFormat);

                rect       = new Rectangle(0, 0, originalImage.Width / 2, originalImage.Height);
                secondHalf = originalImage.Clone(rect, originalImage.PixelFormat);

                break;

            case "tb":

                rect      = new Rectangle(0, 0, originalImage.Width, originalImage.Height / 2);
                firstHalf = originalImage.Clone(rect, originalImage.PixelFormat);

                rect       = new Rectangle(0, originalImage.Height / 2, originalImage.Width, originalImage.Height / 2);
                secondHalf = originalImage.Clone(rect, originalImage.PixelFormat);

                break;

            case "bt":

                rect      = new Rectangle(0, originalImage.Height / 2, originalImage.Width, originalImage.Height / 2);
                firstHalf = originalImage.Clone(rect, originalImage.PixelFormat);

                rect       = new Rectangle(0, 0, originalImage.Width, originalImage.Height / 2);
                secondHalf = originalImage.Clone(rect, originalImage.PixelFormat);

                break;

            default:

                firstHalf  = null;
                secondHalf = null;
                break;
            }

            originalImage.Dispose();

            var exiflib = new ExifReadWrite();

            using (FileStream fs = new FileStream(orginalJpeg, FileMode.Open, FileAccess.Read)) {
                var segments = Parse(fs);
                foreach (var segment in segments)
                {
                    if (segment.Item1 == "EXIF")
                    {
                        exiflib.ReadExifAPP1(segment.Item2);
                    }
                }
            }

            return(new Vr180Jpeg(firstHalf, secondHalf, exiflib, newJpegQuailty));
        }