<TesseractOCRアプリケーションの画面一覧について>
・メイン画面・・・ジョブの状況を一目で確認できるようにする・帳票定義一覧・・・帳票定義の内容を一覧で表示
・帳票定義詳細・・・帳票定義の詳細を更新・削除
・読取枠定義・・・帳票定義の読取枠の定義を更新・削除
・ジョブ定義一覧・・・ジョブの一覧を表示
・ジョブ定義詳細・・・ジョブの内容を登録・削除
・ジョブ結果項目修正・・・OCRの結果を確認、修正
<メイン画面>
特に複雑な画面構成ではないので、Gridコントロールを使い、DataGridを配置していく。
OCRManager.exeでOCR.exeのために画像を読取枠ごとに切り取っている。この画面はその画像を表示し、データの修正を行えるようにしている。データを修正してからダウンロードでCSVファイル化することができる。
<読取枠定義>
この画面がTesseractOCRでは一番手間がかかると思っていたが、InkCanvasを利用すると比較的簡単に処理が記述できた。
<画像を表示しているXaml部分>
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" Grid.Row="0" >
<InkCanvas Grid.Row="0" Name="ikcReadItemCanvas" Width="{Binding ActualWidth, ElementName=image}" Height="{Binding ActualHeight, ElementName=image}"
HorizontalAlignment="Left" VerticalAlignment="Top" EditingMode="Select" >
<InkCanvas.RenderTransform>
<MatrixTransform x:Name="matrixTransform" />
</InkCanvas.RenderTransform>
<InkCanvas.Background>
<VisualBrush >
<VisualBrush.Visual>
<Image x:Name="image" Stretch="Fill" Width="{Binding RelativeSource={RelativeSource Self}, Path=Source.PixelWidth}" Height="{Binding RelativeSource={RelativeSource Self}, Path=Source.PixelHeight}" />
</VisualBrush.Visual>
</VisualBrush>
</InkCanvas.Background>
</InkCanvas>
</ScrollViewer>
<呼び出し側>
/// <summary>
/// 画像設定処理(他の画面からこれを呼ぶ)
/// </summary>
/// <param name="filePath">画像ファイルパス</param>
/// <returns>読み込み成功時true</returns>
public bool SetImage(string filePath)
{
// パスが空
if (string.IsNullOrEmpty(filePath))
{
return false;
}
var bmp = new BitmapImage();
bmp.BeginInit();
bmp.UriSource = new Uri(filePath);
bmp.EndInit();
// 画像設定
image.Source = bmp;
return true;
}
<Borderの表示方法>
var b = new Border();
ikcReadItemCanvas.Children.Add(b);
InkCanvas.SetTop(b, 10);
InkCanvas.SetLeft(b, 20);
<保存するとき>
y = InkCanvas.GetTop(b);
x = InkCanvas.GetLeft(b);
ViewModelに配列を用意しておいて、Borderをインスタンス化し、List<Border>に別管理しておいて保存時に利用するのがおすすめ。
一応今回の画面は読取枠を表現するためにFileItemクラスというのを作成しておいて、
プロパティとしてBorderArea(Borderクラス),Title(Stringクラス)などを用意しておいた。BorderAreaプロパティは、ikcReadItemCanvasのChildrenにAddしてある。
例)
FileItem i = new FileItem();
ThisViewModel.FileItems.Add(i);
ikcReadItemCanvas.Children.Add(i.BorderArea);
InkCanvas.SetTop(i.BorderArea, 10);
InkCanvas.SetLeft(i.BorderArea, 20);
0 件のコメント:
コメントを投稿