我是stackoverflow的新手,希望我的问题出现在正确的地方?
我要申请一本书,看起来和纸上的一样。所以我有这本书所有页面的图像。
问题是,我希望当用户单击/点击任何末尾带有点的句子时,会出现有关该句子的一些细节(即用另一种语言翻译该句子)
像这样的东西:
我想知道如何实现这个?比 500 页的书的每一句话都可怕的剪裁更好的方法!
我是stackoverflow的新手,希望我的问题出现在正确的地方?
我要申请一本书,看起来和纸上的一样。所以我有这本书所有页面的图像。
问题是,我希望当用户单击/点击任何末尾带有点的句子时,会出现有关该句子的一些细节(即用另一种语言翻译该句子)
像这样的东西:
我想知道如何实现这个?比 500 页的书的每一句话都可怕的剪裁更好的方法!
不完全是您所期待的,而是一些提示。
除非你做一些 OCR 来识别/分割你的文本,否则我真的看不出你是如何从图像句子中检测到的(如果我错了,请有人纠正我)以及它们突出显示它们或提供视觉提示的界限;所以我假设你会在图像中使用一些 OCR。(只要它足以返回字符/句子的区域,以便您可以提供视觉提示并为该句子选择相关的翻译)
这里有一些可以免费使用的 OCR 库的链接:
https://stackoverflow.com/questions/744966/any-open-source-c-sharp-ocr-library
完成 OCR-ing 后,您现在将书作为字符串,并且您想要拆分它:
MatchCollection matches = Regex.Matches(_text, @"[A-Z].*?\.");
string[] strings = matches.Cast<Match>().Select(s => s.Value).ToArray();
(正则表达式大致完成了这项任务,它需要一些调整,例如处理段落)
我的其余答案不是您所期望的,无论如何我都会将其发布在这里,因为这是我在回答您的问题时创建的,您可能会发现将其放在位图上是否有用;所以请随意跳过它。我们可以争论它的用处,这里有一些关于你为什么喜欢它的论点:阅读起来不那么累,因为你可以设置字体大小,你可以在里面搜索哪个 IMO 是一个很棒的功能。
所以这里是:
我使用 FlowDocumentReader 来表示句子。在这里,我使用了 Run 和 ToolTip,但您可以使用 Hyperlink 来打开一些网站。
IEnumerable<Paragraph> paragraphs = strings.Select(s => new Paragraph(new Run(s) {ToolTip = "Translated text"}));
document.Blocks.AddRange(paragraphs);
以及相关的 XAML:
<FlowDocumentReader>
<FlowDocumentReader.Document>
<FlowDocument x:Name="document" />
</FlowDocumentReader.Document>
</FlowDocumentReader>
结果 :
编辑
这就是为什么我建议你使用 OCR 来获取单词的区域,仅此而已。
(取自http://www.pixel-technology.com/freeware/tessnet2/)
var tesseract = new Tesseract();
var bitmap = new Bitmap("snap00110.png");
List<Word> doOcr = tesseract.DoOCR(bitmap, new Rectangle(new Point(0, 0), bitmap.Size));
foreach (var word in doOcr)
{
var region = new Rectangle(word.Left, word.Top, word.Right - word.Left, word.Bottom - word.Top);
}
当你有单词区域时,你将能够实现你想要的。
注意:我一直在尝试这个库,如果你在 .NET 4.0 下,你可能需要重建它