Сохранение FixedDocument с изображениями в файл XPS

Я сохранил 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?

1 ответ

Решение

У меня была та же проблема: мой размер файла был слишком большим, потому что фотографии были вставлены в формате png вместо jpeg. Я исправил это, конвертировав все файлы png в формат jpeg. Я оставил URI такими же, чтобы не обновлять ссылки на изображение, но это означает, что внутренний URI ваших jpegs будет заканчиваться вводящим в заблуждение ".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());
            }
        }
    }
}
Другие вопросы по тегам