using System.IO; namespace ZeroLevel.Services.Drawing { public class JpegExifRemovePatcher { public void Patch(string source, string target) { using (var from_stream = File.Open(source, FileMode.Open)) { using (var to_stream = File.Create(target)) { PatchAwayExif(from_stream, to_stream); } } } public Stream PatchAwayExif(Stream inStream, Stream outStream) { byte[] jpegHeader = new byte[2]; jpegHeader[0] = (byte)inStream.ReadByte(); jpegHeader[1] = (byte)inStream.ReadByte(); if (jpegHeader[0] == 0xff && jpegHeader[1] == 0xd8) //check if it's a jpeg file { SkipAppHeaderSection(inStream); } outStream.WriteByte(0xff); outStream.WriteByte(0xd8); int readCount; byte[] readBuffer = new byte[8192]; while ((readCount = inStream.Read(readBuffer, 0, readBuffer.Length)) > 0) outStream.Write(readBuffer, 0, readCount); return outStream; } private void SkipAppHeaderSection(Stream inStream) { byte[] header = new byte[2]; header[0] = (byte)inStream.ReadByte(); header[1] = (byte)inStream.ReadByte(); while (header[0] == 0xff && (header[1] >= 0xe0 && header[1] <= 0xef)) { int exifLength = inStream.ReadByte(); exifLength = exifLength << 8; exifLength |= inStream.ReadByte(); for (int i = 0; i < exifLength - 2; i++) { inStream.ReadByte(); } header[0] = (byte)inStream.ReadByte(); header[1] = (byte)inStream.ReadByte(); } inStream.Position -= 2; //skip back two bytes } } }