Search code examples
c#asp.netimage-processingmetadatasystem.drawing

Easy way to clean metadata from an image?


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 think implementation I currently have works, but I'm not sure if it's affecting the quality of images or if there's a better way to handle this task. Could you let me know if you know of a better way to do this?

Here's the method in question:

public byte[] CleanMetadata(byte[] data)
{
    Image image;

    if (tryGetImageFromBytes(data, out image))
    {
        Bitmap bitmap = new Bitmap(image);

        using (var graphics = Graphics.FromImage(bitmap))
        {
            graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
            graphics.CompositingMode = CompositingMode.SourceCopy;
            graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;

            graphics.DrawImage(image, new Point(0, 0));
        }

        ImageConverter converter = new ImageConverter();

        return (byte[])converter.ConvertTo(image, typeof(byte[]));
    }

    return null;
}

And, for reference, the tryGetImageFromBytes method:

private bool tryGetImageFromBytes(byte[] data, out Image image)
{
    try
    {
        using (var ms = new MemoryStream(data))
        {
            image = Image.FromStream(ms);
        }
    }
    catch (ArgumentException)
    {
        image = null;

        return false;
    }

    return true;
}

To reiterate: is there a better way to remove metadata from an image that doesn't involve redrawing it?

Thanks in advance.


Solution

  • 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.