2016-08-12 4 views
1

Ich habe diese Methode zur Größenanpassung von Bildern, und ich habe es geschafft, alle Metadaten in das neue Bild mit Ausnahme der XMP-Daten einzugeben. Jetzt kann ich nur Themen finden, wie man den XMP-Teil in C++ verwaltet, aber ich brauche es in C#. Der nächste, den ich bekommen habe, ist der , der auf einem alten Port von Adobe SDK basiert, aber ich kann das nicht für mich arbeiten. Die MetaDataExtractor project gibt mir die gleichen Ergebnisse - das heißt, Dateiformat/Codierung wird nicht unterstützt. Ich habe dies mit .jpg, .png und .tif-Dateien versucht.Wie lese und schreibe ich XMP-Metadaten in C#?

Gibt es keine gute Möglichkeit, XMP in C# zu lesen und zu schreiben?

Hier ist mein Code, wenn es keine Hilfe ist (alle irrelevanten Teile weggelassen):

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); 
    } 
} 

Antwort

0

Der Grund, warum Sie „nicht unterstützten Dateiformat ist“ erhalten, weil Sie bereits das Bild aus dem Strom verbraucht, wenn Sie in den ersten Zeilen Image.FromStream(image) genannt.

Wenn Sie das nicht tun, sollten Sie feststellen, dass Sie das XMP gut lesen können.

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

Wenn Ihr Stream seekable ist, könnten Sie in der Lage sein, zurück zum Ursprung zu suchen (mit der Seek Methode oder durch Position auf Null.)

Verwandte Themen