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

沙赫里亚尔

我正在尝试在UWPpdf阅读器中反转页面的颜色(使用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 

   }
}

我在正常获取图像(不反转)或逐字节反转像素方面没有问题,但是它太慢了,因此我尝试使用Invert()in进行反转Windows.UI.Xaml.Media.Imaging.WriteableBitmap但会引发异常!

{“尝试读取或写入受保护的内存。这通常表明其他内存已损坏。”}

错误


暗示:

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

罗布·卡普兰(Rob Caplan)-MSFT

这里有几点注意事项:

  1. Invert不是Windows.UI.Xaml.Media.Imaging.WriteableBitmap的成员。您可能正在使用提供Invert()作为扩展方法的WriteableBitmapEx
  2. WriteableBitmapEx的Invert返回新反转的WriteableBitmap。它不会在原地反转。
  3. WriteableBitmapEx提供了FromStream帮助器,可以从流中创建WriteableBitmap。

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

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。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章