Как я могу получить некоторые данные изображения и отформатировать их, используя MS Open XML SDK? - PullRequest
6 голосов
/ 21 августа 2011

Это дополнительный вопрос к Как получить изображения из файла .pptx с помощью MS Open XML SDK?

Как я могу получить:

  • Данные изображения из объекта DocumentFormat.OpenXml.Presentation.Picture?
  • Имя и / или тип изображения?

скажем, в следующем:

using (var doc = PresentationDocument.Open(pptx_filename, false)) {
    var presentation = doc.PresentationPart.Presentation;

    foreach (SlideId slide_id in presentation.SlideIdList) {
        SlidePart slide_part = doc.PresentationPart.GetPartById(slide_id.RelationshipId) as SlidePart;
        if (slide_part == null || slide_part.Slide == null)
            continue;
        Slide slide = slide_part.Slide;
        foreach (var pic in slide.Descendants<Picture>()) {
            // how can one obtain the pic format and image data?
        }
    }
}

Я понимаю, что здесь вроде бы просят ответы «из печи», но я просто нигде не могу найти достаточно хороших документов, чтобы понять это самостоятельно.

1 Ответ

10 голосов
/ 21 августа 2011

Сначала получите ссылку на ImagePart вашей картинки. Класс ImagePart предоставляет информацию, которую вы ищете. Вот пример кода:

string fileName = @"c:\temp\myppt.pptx";
using (var doc = PresentationDocument.Open(fileName, false))
{        
  var presentation = doc.PresentationPart.Presentation;

  foreach (SlideId slide_id in presentation.SlideIdList)
  {          
    SlidePart slide_part = doc.PresentationPart.GetPartById(slide_id.RelationshipId) as SlidePart;
    if (slide_part == null || slide_part.Slide == null)
      continue;
    Slide slide = slide_part.Slide;

    // from a picture
    foreach (var pic in slide.Descendants<Picture>())
    {                                
      // First, get relationship id of image
      string rId = pic.BlipFill.Blip.Embed.Value;

      ImagePart imagePart = (ImagePart)slide.SlidePart.GetPartById(rId);

     // Get the original file name.
      Console.Out.WriteLine(imagePart.Uri.OriginalString);                        
      // Get the content type (e.g. image/jpeg).
      Console.Out.WriteLine("content-type: {0}", imagePart.ContentType);           

      // GetStream() returns the image data
      System.Drawing.Image img = System.Drawing.Image.FromStream(imagePart.GetStream());

      // You could save the image to disk using the System.Drawing.Image class
      img.Save(@"c:\temp\temp.jpg"); 
    }                    
  }
}

По тому же признаку вы также можете перебирать все ImagePart-а SlidePart, используя следующий код:

// iterate over the image parts of the slide part
foreach (var imgPart in slide_part.ImageParts)
{            
  Console.Out.WriteLine("uri: {0}",imgPart.Uri);
  Console.Out.WriteLine("content type: {0}", imgPart.ContentType);                        
}

Надеюсь, это поможет.

...