using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; namespace fptsplit { class Program { private const string OutputPattern = "{0}\\img{1}.jpg"; private static void ParseThumbFile(string thumbFile, string outputDir) { int counter = 0; using (BinaryReader br = new BinaryReader(File.Open(thumbFile, FileMode.Open, FileAccess.Read))) { Console.WriteLine("Parsing: " + thumbFile); long length = br.BaseStream.Length; // Header -> 512 bytes // 4 bytes id // 4 bytes 0x00000200 // 504 padding br.BaseStream.Seek(512, SeekOrigin.Begin); br.ReadInt32(); br.ReadInt32(); BinaryWriter bw = null; ushort v1, v2; while (br.BaseStream.Position < length) { v1 = (ushort)br.ReadInt16(); // JPEG format begins with 0xd8ff 0xe0ff if (v1 == 0xd8ff) { v2 = (ushort)br.ReadInt16(); if (v2 == 0xe0ff) { if (bw != null) { Console.Write("."); bw.Flush(); bw.Close(); counter++; } string outFile = String.Format(OutputPattern, outputDir, counter); FileStream fs = new FileStream(outFile, FileMode.Create, FileAccess.Write); bw = new BinaryWriter(fs); } bw.Write(v1); bw.Write(v2); } else { bw.Write(v1); } } // close stream bw.Flush(); bw.Close(); Console.WriteLine("\nExported " + counter + " images."); } } static void Main(string[] args) { string filename = null; string outputDir = null; try { if (args == null || args.Length == 0) { throw new Exception("Invalid arguments."); } else { int i = 0; while (i < args.Length) { if (args[i] == "/i") { filename = args[i + 1]; i++; } else if (args[i] == "/o") { outputDir = args[i + 1]; i++; } else { throw new Exception("Invalid argument: " + args[i]); } i++; } if (String.IsNullOrEmpty(filename)) throw new Exception("No input file."); if (String.IsNullOrEmpty(outputDir)) throw new Exception("No output dir."); } } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine("Usage: fptsplit.exe /i [Input File] /o [Output Directory]"); return; } try { ParseThumbFile(filename, outputDir); } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); } } } }