将带有图像的 FixedDocument 保存到 XPS 文件
Saving a FixedDocument with images to XPS file
我已经将 FixedDocument 保存到 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?
我遇到了同样的问题:我的文件太大,因为照片被嵌入为 png 而不是 jpeg。我通过将所有 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());
}
}
}
}
我已经将 FixedDocument 保存到 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?
我遇到了同样的问题:我的文件太大,因为照片被嵌入为 png 而不是 jpeg。我通过将所有 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());
}
}
}
}