Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Editing/Remove Exif Image data on Windows Phone

I'm using the excellent ExifLib to extract Exif data from my images on Windows Phone 8 (http://www.codeproject.com/Articles/36342/ExifLib-A-Fast-Exif-Data-Extractor-for-NET-2-0). However, due to privacy constraints I need to be able to delete GPS exif data from images imported from the user's photo library.

Unfortunately I can't find a way to easily edit or remove this data, any pointers or libraries that I'm missing?

Any help would be much appreciated.

like image 975
James Mundy Avatar asked Oct 04 '22 22:10

James Mundy


1 Answers

There's a blog post here showing how to remove the EXIF data without reencoding the image. Code from the post

using System.IO;

namespace ExifRemover
{
    public class JpegPatcher
    {
        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[4096];
            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
        }
    }
}
like image 88
keyboardP Avatar answered Oct 13 '22 10:10

keyboardP