反转 Pdf 中的 WriteableBitmap 颜色 Reader (UWP)

Inverting WriteableBitmap colors in Pdf Reader (UWP)

我正在尝试反转 UWP pdf reader 中页面的颜色(使用 Windows.Data.Pdf) .

我的一段代码:

using Windows.Data.Pdf;

private PdfPageRenderOptions _ro;
private PdfPage _page;
private WriteableBitmap wb;

...

private async void InvertPage() {
    using(var stream = new InMemoryRandomAccessStream()) {
        await _page.RenderToStreamAsync(stream,_ro);
        await wb.SetSourceAsync(stream);
        // also tried wb.SetSource(stream);

        wb.Invert(); // ERROR IN HERE 

   }
}

我在正常获取图像(无反转)或逐字节反转像素方面没有问题,但它太慢了所以我试图在 Windows.UI.Xaml.Media.Imaging.WriteableBitmap 中使用 Invert() 反转但它抛出一个例外!

{"Attempted to read or write protected memory. This is often an indication that other memory is corrupt."}


提示:

当我改用 await _page.RenderToStreamAsync(stream); 时,一切正常。 (但必须在 stream 中包含 PdfPageRenderOptions)

这里有几点说明:

  1. Invert 不是 Windows.UI.Xaml.Media.Imaging.WriteableBitmap 的成员。您可能正在使用 WriteableBitmapEx,它提供 Invert() 作为扩展方法。
  2. WriteableBitmapEx 的反转 returns 新反转的 WriteableBitmap。它不会反转到位。
  3. WriteableBitmapEx 提供了一个 FromStream 助手来从流创建 WriteableBitmap。

考虑到这些,您可以像下面这样重写 InvertPage。由于 Invert 创建了一个新的 WriteableBitmap,此版本是异步的并且 returns 新位图,以便调用者可以将其设置为 属性 提供显示图像的任何内容。

private async Task<WriteableBitmap> InvertPageAsync()
{
    using (var stream = new InMemoryRandomAccessStream())
    {
        await _page.RenderToStreamAsync(stream, _ro);

        // Use WriteableBitmapEx's FromStream
        WriteableBitmap newWb = await wb.FromStream(stream);

        return newWb.Invert(); // ERROR IN HERE 
    }
}


async Task UpdatePdf()
{
    // Load the document, page, etc. and PreparePageAsync
    // ...
    // ...

    // Invert the page and show it in pageImage
    pageImage.Source = await InvertPageAsync();
}

如果您在没有 GetBitmapContext 块的情况下使用 WriteableBitmapEx 的 SetPixel,则单独循环遍历像素会非常慢。 WriteableBitmapEx 需要提取WriteableBitmap 的PixelBuffer 来设置一个像素。如果您使用 GetBitmapContext,它将在处理 BitmapContext 之前对所有调用执行一次。如果您不调用 GetBitmapContext,那么它将需要为每个 SetPixel 调用获取 PixelBuffer。