2016-08-12 8 views
1

У меня есть этот метод для изменения размеров изображений, и мне удалось ввести все метаданные в новое изображение, кроме данных XMP. Теперь я могу только найти темы о том, как управлять частью XMP на C++, но мне нужно это в C#. Самый близкий я получил xmp-sharp project, который основан на каком-то старом порту SDK от Adobe, но я не могу заставить это работать для меня. MetaDataExtractor project дает мне те же результаты - то есть формат файла/кодировка не поддерживается. Я пробовал это с файлами .jpg, .png и .tif.Как читать и писать метаданные XMP в C#?

Нет ли хорошего способа чтения и записи XMP в C#?

Вот мой код, если это какой-либо помощи (опуская все ненужные части):

public Task<Stream> Resize(Size size, Stream image) 
{ 
    using (var bitmap = Image.FromStream(image)) 
    { 
    var newSize = new Size(size.Width, size.Height); 
    var ms = new MemoryStream(); 
    using (var bmPhoto = new Bitmap(newSize.Width, newSize.Height, PixelFormat.Format24bppRgb)) 
    { 
     // This saves all metadata except XMP 
     foreach (var id in bitmap.PropertyIdList) 
     bmPhoto.SetPropertyItem(bitmap.GetPropertyItem(id)); 

     // Trying to use xmp-sharp for the XMP part 
     try 
     { 
     IXmpMeta xmp = XmpMetaFactory.Parse(image); 
     } 
     catch (XmpException e) 
     { 
     // Here, I always get "Unsupported Encoding, XML parsing failure" 
     } 

     // Trying to use MetadataExtractor for the XMP part 
     try 
     { 
     var xmpDirs = ImageMetadataReader.ReadMetadata(image).Where(d => d.Name == "XMP"); 
     } 
     catch (Exception e) 
     { 
     // Here, I always get "File format is not supported" 
     } 

     // more code to modify image and save to stream 
    } 
    ms.Position = 0; 
    return Task.FromResult<Stream>(ms); 
    } 
} 

ответ

0

Причина вы получаете «Формат файла не поддерживается», потому что вы уже поглотил изображение из потока, когда вы в первых нескольких строках - Image.FromStream(image).

Если вы этого не сделаете, вы должны обнаружить, что вы можете просто прочесть XMP.

var xmp = ImageMetadataReader.ReadMetadata(stream).OfType<XmpDirectory().FirstOrDefault(); 

Если поток доступный для поиска, вы можете быть в состоянии искать обратно в начало координат (с использованием методы Seek, или путем установки Position к нулю.)