如何在Windows应用商店应用程序中实现PDF文件的昼夜转换

本文关键字:PDF 实现 文件 转换 昼夜 应用程序 Windows 应用 | 更新日期: 2023-09-27 18:23:59

我正在尝试为pdf文件实现昼夜模式;渲染后。最好的解决方案是什么?可以通过使用Windows应用商店中的主题来完成吗?

如何在Windows应用商店应用程序中实现PDF文件的昼夜转换

Venkata也在MSDN论坛上发表了帖子,他在论坛上澄清说,他正在使用PdfDocument API,并希望将白色转换为黑色,将黑色转换为白色。如果你这样做,请确保将高对比度模式考虑在内(我会跳过高对比度下的反转,因为用户已经在管理了)。

您可以在传递给RenderToStreamAsync的PdfPageRenderOptions中设置页面背景(如果您使用的是IPdfRendererNative和RenderPageToSurface,则可以在PDF_RENDER_PARAMS中设置,但无法覆盖该级别的前景。

将页面渲染为屏幕外位图后,就可以编辑其像素。例如,您可以将其加载到WriteableBitmap中,然后循环像素并反转颜色:

StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///assets/demo.pdf"));
PdfDocument pdfDoc = await PdfDocument.LoadFromFileAsync(file);
PdfPage pdfPage = pdfDoc.GetPage(0);
using (IRandomAccessStream stream = new InMemoryRandomAccessStream())
{
    PdfPageRenderOptions options = new PdfPageRenderOptions();
    await pdfPage.RenderToStreamAsync(stream, options);
    WriteableBitmap wb = new WriteableBitmap((int)pdfPage.Size.Height, (int)pdfPage.Size.Width);
    await wb.SetSourceAsync(stream);
    using (Stream pixels = wb.PixelBuffer.AsStream())
    {
        pixels.Seek(0, SeekOrigin.Begin);
        for (int i = 0; i < pixels.Length; i++)
        {
            byte subPixel = (byte)pixels.ReadByte();
            // WB pixels are RGBA. Only change RGB, not A
            if ((i + 1) % 4 != 0)
            {
                // write over the same pixel we just read
                pixels.Seek(-1, SeekOrigin.Current);
                // write the modified pixel (inverted colour in this case)
                pixels.WriteByte((byte)(byte.MaxValue - subPixel));
            }
        }
    }
    // Display the page on an Image in our Xaml Visual Tree
    img.Source = wb;
}