2016-08-02 20 views
1

XPSファイルに画像付きのFixedDocument保存:私は<strong>XPS例えば</strong>ファイルに<strong>たFixedDocument</strong>を保存した

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

同じ問題がありました。写真がjpegではなくpngとして埋め込まれていたため、ファイルサイズが大きすぎました。パッケージ内のすべてのpngファイルをjpegに変換して修正しました。私は画像への参照を更新する必要がないようにURIを同じにしていましたが、これはあなたのjpegの内部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

私は1年前同様にこの問題を解決しましたが、私はZIPアーカイブを解析しました。あなたのやり方はより自然で清潔です。ありがとう。 – CrazyCoder

関連する問題