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); } } }
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)); }