问题描述
使用 PdfPig 提取的图像是 XObject Image 或 InlineImage 类型(均继承自 IPdfImage)。我想在一个简单的 WPF 应用程序中保存和显示它们。为此,我需要以更易于访问的形式使用它们,例如 BitmapImage 格式。实现这一目标的正确方法是什么?图书馆文档在这里没有帮助,我悲惨的尝试没有成功。
解决方法
我还没有测试过任何这些,但如果它不起作用,它至少应该让你走上正确的道路。
查看 GitHub 上的 PdfPig 源代码,我可以看到 XObjectImage
和 InlineImage
都有一个函数 TryGetPng
。从它的外观来看,我认为这个字节数组将与普通 PNG 文件的内容匹配,这意味着您应该能够将它直接加载到 BitmapImage
中。
从 this answer 获取一些代码。像这样的事情可能会奏效:
InlineImage pdfImage;
byte[] png;
if (pdfImage.TryGetPng(out png))
{
var bitmap = (BitmapSource)new ImageSourceConverter().ConvertFrom(png);
}
注意:这两个类还有一个 TryGetBytes
方法,它可以代替 TryGetPng
。我只是不确定 TryGetBytes
的输出格式是什么,所以我对 TryGetPng
更有信心。不过,如果一个不起作用,我会同时尝试。
FWIW,通过反复试验,我目前的方法是从 The following StateError was thrown building StreamBuilder<DocumentSnapshot<Object?>>(dirty,state: _StreamBuilderBaseState<DocumentSnapshot<Object?>,AsyncSnapshot<DocumentSnapshot<Object?>>>#4c964):
Bad state: cannot get a field on a DocumentSnapshotPlatform which does not exist
The relevant error-causing widget was
StreamBuilder<DocumentSnapshot<Object?>>
package:iparts_user/widgets/orders_widget.dart:18
When the exception was thrown,this was the stack
#0 DocumentSnapshotPlatform.get
package:cloud_firestore_platform_interface/…/platform_interface/platform_interface_document_snapshot.dart:76
#1 _JsonDocumentSnapshot.get
package:cloud_firestore/src/document_snapshot.dart:92
#2 _JsonDocumentSnapshot.[]
package:cloud_firestore/src/document_snapshot.dart:96
#3 OrderWidget.build.<anonymous closure>
package:iparts_user/widgets/orders_widget.dart:39
#4 StreamBuilder.build
package:flutter/…/widgets/async.dart:545
...
开始,如果失败则回退到 TryGetPng
。然后我将提取的字节解释为 RawBytes
。我根本不使用 System.Drawing.Image
。这是我的代码(F#,但应该很容易转换为 C#):
TryGetBytes