使用.NET调整图像大小而不丢失EXIF数据

6
什么是在.NET中调整图像大小的最佳方法,而不会丢失EXIF数据?我可以使用.NET 2 System.Drawing.*类、WPF类或开源库。目前我发现唯一简单的处理方式是使用Graphics.FromImage (.NET 2)进行调整大小,并使用开源库手动重新编写每个数据的EXIF数据(一个一个地)。

我在CodePlex上添加了一个项目,其中包括不会丢失EXIF数据的调整大小功能:http://tidytinypics.codeplex.com/ - TigrouMeow
2个回答

3
您提出的先提取EXIF数据再进行调整大小,然后重新插入EXIF数据的建议似乎是一个不错的解决方案。
只有像JPEG和TIFF这样的格式才能定义EXIF数据 - 当您将这样的图像加载到Graphics对象中进行调整大小时,实际上是将图像转换为常规位图。因此,您会失去EXIF数据。
关于使用C#提取EXIF的相关主题可以在这里找到。

好的,我保留了我的解决方案,它运行得非常好,只是代码有点多,但速度足够快 :) - TigrouMeow
我所知道的另一种选择是ImageMagick - 我了解到你可以在不丢失EXIF数据的情况下进行转换,但该库本质上正在做你已经在做的同样的事情,只是可能更快。 - Charlie Salts

2

我使用Magick .NET并创建了两个扩展方法:

    public static byte[] ToByteArray(this Image imageIn)
    {
        MemoryStream ms = new MemoryStream();
        imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
        return ms.ToArray();
    }

    public static Image AttachMetadData(this Image imgModified, Image imgOriginal)
    {
        using (MagickImage imgMeta = new MagickImage(imgOriginal.ToByteArray()))
        using (MagickImage imgModi = new MagickImage(imgModified.ToByteArray()))
        {
            foreach (var profileName in imgMeta.ProfileNames)
            {
                imgModi.AddProfile(imgMeta.GetProfile(profileName));
            }
            imgModified = imgModi.ToImage();
        }
        return imgModified;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接