将元数据写入jpg和png

时间:2015-03-13 16:34:48

标签: c# image

我需要为上传的图片添加元数据标签(描述)。

我找到了这个答案:https://stackoverflow.com/a/1764913/6776适用于JPG文件,但不适用于PNG。

private string Tag = "test meta data";

private static Stream TagImage(Stream input, string type)
{
    bool isJpg = type.EndsWith("jpg", StringComparison.InvariantCultureIgnoreCase) || type.EndsWith("jpeg", StringComparison.InvariantCultureIgnoreCase);
    bool isPng = type.EndsWith("png", StringComparison.InvariantCultureIgnoreCase);

    BitmapDecoder decoder = null;

    if (isJpg)
    {
        decoder = new JpegBitmapDecoder(input, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
    }
    else if (isPng)
    {
        decoder = new PngBitmapDecoder(input, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
    }
    else
    {
        return input;
    }

    // modify the metadata
    BitmapFrame bitmapFrame = decoder.Frames[0];
    BitmapMetadata metaData = (BitmapMetadata)bitmapFrame.Metadata.Clone();
    metaData.Subject = Tag;
    metaData.Comment = Tag;
    metaData.Title = Tag;

    // get an encoder to create a new jpg file with the new metadata.      
    BitmapEncoder encoder = null;
    if (isJpg)
    {
        encoder = new JpegBitmapEncoder();
    }
    else if (isPng)
    {
        encoder = new PngBitmapEncoder();
    }

    encoder.Frames.Add(BitmapFrame.Create(bitmapFrame, bitmapFrame.Thumbnail, metaData, bitmapFrame.ColorContexts));

    // Save the new image 
    Stream output = new MemoryStream();
    encoder.Save(output);

    output.Seek(0, SeekOrigin.Begin);

    return output;
}

当我上传jpg时效果很好,但是在metaData.Subject = Tag行使用png会抛出System.NotSupportedException(此编解码器不支持指定的属性)。

更新

似乎我必须使用基于图像格式的不同方法:

if (isJpg)
{
    metaData.SetQuery("/app1/ifd/exif:{uint=270}", Tag);
}
else
{
    metaData.SetQuery("/tEXt/{str=Description}", Tag);
}

基于the available formats' queries,第一个应该适用于两种格式。第二个也不起作用(它在图像中创建元数据但不保存其值)。

如果我尝试将第一种方法(/app1/ifd/exif)用于PNG,则在encoder.Save行我得到一个不受支持的例外,“没有适合的成像组件”。

3 个答案:

答案 0 :(得分:0)

CompactExifLib 库可以读取、写入和删除 JPEG、TIFF 和 PNG 文件中的 EXIF 标签:

https://www.codeproject.com/Articles/5251929/CompactExifLib-Access-to-EXIF-Tags-in-JPEG-TIFF-an

它完全是用 C# 编写的,可以免费使用。

答案 1 :(得分:0)

CompactExifLib 库可以在 JPEG、TIFF 和 PNG 文件中写入 EXIF 标签:

https://www.codeproject.com/Articles/5251929/CompactExifLib-Access-to-EXIF-Tags-in-JPEG-TIFF-an

它完全是用 C# 编写的,可以免费使用。

注意:我是这个库的作者。

答案 2 :(得分:-2)

PNG格式不支持元数据:(

XMP确实有用,在使用EXIF元数据和PNG进行JPEG转换时可能会有所帮助。