2016-08-12 3 views
1

이 방법으로 이미지의 크기를 조정할 수 있으며 XMP 데이터를 제외한 모든 메타 데이터를 새 이미지에 입력 할 수있었습니다. 이제는 C++에서 XMP 부분을 관리하는 방법에 대한 주제 만 찾을 수 있지만 C#에서는 필요합니다. 내가 얻은 가장 가까운 것은 xmp-sharp project이며 Adobe의 SDK의 일부 이전 포트를 기반으로합니다. 그러나 저를 위해 작동하지 않습니다. 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(); 

스트림이 시크 경우, 다시 원점을 추구 할 수있을 것 (또는 제로로 Position를 설정하여 Seek 방법을 사용.)

관련 문제