我正在尝试在UWP
pdf阅读器中反转页面的颜色(使用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
)
这里有几点注意事项:
考虑到这些,您可以像下面这样重写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] 删除。
我来说两句