2

我是stackoverflow的新手,希望我的问题出现在正确的地方?

我要申请一本书,看起来和纸上的一样。所以我有这本书所有页面的图像。

问题是,我希望当用户单击/点击任何末尾带有点的句子时,会出现有关该句子的一些细节(即用另一种语言翻译该句子)

像这样的东西: 在此处输入图像描述

我想知道如何实现这个?比 500 页的书的每一句话都可怕的剪裁更好的方法!

4

1 回答 1

1

不完全是您所期待的,而是一些提示。

除非你做一些 OCR 来识别/分割你的文本,否则我真的看不出你是如何从图像句子中检测到的(如果我错了,请有人纠正我)以及它们突出显示它们或提供视觉提示的界限;所以我假设你会在图像中使用一些 OCR。(只要它足以返回字符/句子的区域,以便您可以提供视觉提示并为该句子选择相关的翻译)

这里有一些可以免费使用的 OCR 库的链接:

https://stackoverflow.com/questions/744966/any-open-source-c-sharp-ocr-library

最好的 .NET OCR API?

完成 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 下,你可能需要重建它

于 2013-06-20T14:08:37.023 回答