diff --git a/ZeroLevel/Services/Drawing/JpegExifRemovePatcher.cs b/ZeroLevel/Services/Drawing/JpegExifRemovePatcher.cs new file mode 100644 index 0000000..34fd73e --- /dev/null +++ b/ZeroLevel/Services/Drawing/JpegExifRemovePatcher.cs @@ -0,0 +1,58 @@ +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 + } + } +}