反转 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)
这里有几点说明:
- Invert 不是 Windows.UI.Xaml.Media.Imaging.WriteableBitmap 的成员。您可能正在使用 WriteableBitmapEx,它提供 Invert() 作为扩展方法。
- WriteableBitmapEx 的反转 returns 新反转的 WriteableBitmap。它不会反转到位。
- 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。
我正在尝试反转 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)
这里有几点说明:
- Invert 不是 Windows.UI.Xaml.Media.Imaging.WriteableBitmap 的成员。您可能正在使用 WriteableBitmapEx,它提供 Invert() 作为扩展方法。
- WriteableBitmapEx 的反转 returns 新反转的 WriteableBitmap。它不会反转到位。
- 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。