Easy way to clean metadata from an image?

前端 未结 2 1625
轮回少年
轮回少年 2021-01-07 10:38

I\'m working on a service for a company project that handles image processing, and one of the methods is supposed to clean the metadata from an image passed to it.

I

相关标签:
2条回答
  • 2021-01-07 11:19
    • The .NET way: You may want to try your hand at the System.Windows.Media.Imaging.BitmapEncoder class - more precisely, its Metadata collection. Quoting MSDN:

    Metadata - Gets or sets the metadata that will be associated with this bitmap during encoding.

    • The 'Oops, I (not so accidentally) forgot something way: Open the original bitmap file into a System.drawing.Bitmap object. Clone it to a new Bitmap object. Write the clone's contents to a new file. Like this one-liner:

      ((System.Drawing.Bitmap)System.Drawing.Image.FromFile(@"C:\file.png").Clone()).Save(@"C:\file-nometa.png");

    • The direct file manipulation way (only for JPEG): Blog post about removing the EXIF area.

    0 讨论(0)
  • 2021-01-07 11:34

    I would suggest this, the source is here: Removing Exif-Data for jpg file

    Changing a bit the 1st function

    public Stream PatchAwayExif(Stream inStream)
    {
      Stream outStream = new MemoryStream();
      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;
    }
    

    And the second function with no changes, as post

        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
        }
    
    0 讨论(0)
提交回复
热议问题