2016-08-12 11 views
1

イメージのサイズを変更するこの方法があり、XMPデータ以外のすべてのメタデータを新しいイメージに入力することができました。今、私はC++でXMPの部分をどのように管理するかについての話題しか見つけることができませんが、C#でそれを必要としています。私が得た最も近いものは、AdobeのSDKの古いポートに基づいているxmp-sharp projectですが、それは私のために働くことができません。 MetaDataExtractor projectは私には同じ結果、つまりファイルフォーマット/エンコーディングがサポートされていないことを示しています。私は.jpg、.png、.tifファイルでこれを試しました。C#でXMPメタデータを読み書きするにはどうすればよいですか?

C#でXMPを読み書きする良い方法はありませんか?ここで

は、それが任意のヘルプ(すべての無関係な部分を省略)のかどう私のコードです:

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を設定することもできます。)

関連する問題