2016-08-02 40 views
1

我已经保存了固定文档XPS文件,例如:保存与图像XPS文件中的固定文档

void SaveDocument(FixedDocument document, string filePath) 
{ 
    var xps = new XpsDocument(
     filePath, FileAccess.Write, CompressionOption.Maximum); 

    var writer = XpsDocument.CreateXpsDocumentWriter(xps); 
    writer.Write(document); 

    xps.Close(); 
} 

然后我打开XPS文件的ZIP档案,看到我的图片保存作为PNG文件。 如何将图像文件格式更改为JPG?

+0

为什么要这么做?使用XpsDocumentWriter的目的是编写一个.xps文件,该文件已成功完成。包含在.xps文件中的图像数据的文件类型应该完全不相关。 – Jon

+1

我需要JPG格式来减少文档的文件大小。 – CrazyCoder

回答

1

我有同样的问题:我的文件太大了,因为照片被嵌入为png而不是jpeg。我通过将所有png文件转换为包中的jpeg来修复它。为了避免必须更新对图像的引用,我保留了相同的URI,但这意味着您的jpegs的内部URI将以误导性的“.png”结尾。显然,如果要选择将哪些图像转换为jpeg,这会变得更加复杂。

public static void ReplacePngsWithJpegs(Package package) 
{ 
    // We're modifying the enumerable as we iterate, so take a snapshot with ToList() 
    foreach (var part in package.GetParts().ToList()) 
    { 
     if (part.ContentType == "image/png") 
     { 
      using (var jpegStream = new MemoryStream()) 
      using (var image = System.Drawing.Image.FromStream(part.GetStream())) 
      { 
       image.Save(jpegStream, System.Drawing.Imaging.ImageFormat.Jpeg); 
       jpegStream.Seek(0, SeekOrigin.Begin); 

       // Cannot access Uri after part is removed, so store it 
       var uri = part.Uri; 

       package.DeletePart(uri); 

       var jpegPart = package.CreatePart(uri, "image/jpeg"); 
       jpegStream.CopyTo(jpegPart.GetStream()); 
      } 
     } 
    } 
} 
+0

我在一年前以类似的方式解决了这个问题,但我解析了ZIP压缩文件。你的方式更原生,更干净。谢谢。 – CrazyCoder