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