従来、Delphiで画像ファイル内の文字を認識するためには
海外のサードパーティ製コンポーネントを使用する方法が一般的でした。
それらは海外製ということもあり日本語に強くはありませんでした。
一方、文字認識自体はGoogleやLINE等で技術革新が進んでおり、
これらの技術をDelphiから利用することも可能になっています。
今回はGoogleのWeb APIをDelphiから呼び出して、
画像ファイル内の文字認識(OCR = Optical Character Recognition)を行う手順を紹介します。
Cloud Vision APIキーの取得
今回はGoogleの「Cloud Vision API」を使用します。
Cloud Vision API では、PC内のローカル画像を対象にして、
RESTで画像をbase64として送信できます。
その後、JSONで返ってきた文字認識の結果を取り出すことができます。
準備として、Cloud Vision APIを使用するためのAPIキーを取得する必要があります。
以下のサイトにアクセスし、Google Cloudのアカウントを作成します。
既にアカウントをお持ちの場合はログインします。
Vision AI: 画像とビジュアル AI ツール | Google Cloud
Cloud Vision API の利用登録を行い、APIキーを作成します。
(詳細な手順は日々変わる可能性があるため、本記事では割愛します。)
OCRロジックの実装
Cloud Vision の APIキーを取得できたら、Delphi側の実装に移ります。
今回はローカルの画像を送信して、結果をMemoに表示するサンプルを作成していきます。
Delphiを起動したらプロジェクトを新規作成し、
新規フォームにTEdit・TMemo・TButtonを配置します。
(今回はEdit1・Memo1・Button1)
- Edit1:送信する画像ファイルのパス指定用。
- Memo1:受信した結果から取得した文字列セット用。
- Button1:処理実行ボタン。

処理に必要なユニットを認識させるため、
「System.NetEncoding, System.JSON, System.IOUtils, System.Net.HttpClientComponent」
の4つをuses節に追加します。
OCRのメイン処理と呼び出し処理として、それぞれ以下のようにロジックを記述します。
メイン処理は「OCR_Image」関数にまとめ、
画面側の処理はButton1のクリック時処理としています。
「OCR_Image」関数の引数にAPIキーも含めています。
{*******************************************************************************
目的 : OCRメイン処理
引数 : AFileName - 文字認識させたい画像ファイルのフルパス
AApiKey - Cloud VisionのAPIキー
戻値 : レスポンスJSONから取得した認識後の文字列
*******************************************************************************}
function OCR_Image(const AFileName, AApiKey: string): string;
var
Http: TNetHTTPClient;
ReqStream, ResStream: TStringStream;
ImgBytes: TBytes;
Base64Img: string;
JsonReq: TJSONObject;
JsonRes: TJSONObject;
Responses: TJSONArray;
FirstResponse: TJSONObject;
FullText: TJSONObject;
begin
Result := '';
// ファイルをバイト列として読み込む
ImgBytes := TFile.ReadAllBytes(AFileName);
Base64Img := TNetEncoding.Base64.EncodeBytesToString(ImgBytes);
// リクエストJSON作成
JsonReq := TJSONObject.Create;
try
JsonReq.AddPair(
'requests',
TJSONArray.Create(
TJSONObject.Create
.AddPair(
'image',
TJSONObject.Create.AddPair('content', Base64Img)
)
.AddPair(
'features',
TJSONArray.Create(
TJSONObject.Create.AddPair('type', 'TEXT_DETECTION')
)
)
)
);
ReqStream := TStringStream.Create(JsonReq.ToString, TEncoding.UTF8);
finally
JsonReq.Free;
end;
ResStream := TStringStream.Create('', TEncoding.UTF8);
Http := TNetHTTPClient.Create(nil);
try
// リクエスト実行
Http.Post(
'https://vision.googleapis.com/v1/images:annotate?key=' + AApiKey,
ReqStream,
ResStream
);
// レスポンスJSON取得
JsonRes := TJSONObject.ParseJSONValue(ResStream.DataString) as TJSONObject;
try
Responses := JsonRes.GetValue<TJSONArray>('responses');
if (Responses <> nil) and (Responses.Count > 0) then
begin
FirstResponse := Responses.Items[0] as TJSONObject;
FullText := FirstResponse.GetValue<TJSONObject>('fullTextAnnotation');
if FullText <> nil then
Result := FullText.GetValue<string>('text');
end;
finally
JsonRes.Free;
end;
finally
Http.Free;
ReqStream.Free;
ResStream.Free;
end;
end;
{*******************************************************************************
目的 : 処理実行ボタン押下時処理
引数 :
戻値 :
*******************************************************************************}
procedure TForm1.Button1Click(Sender: TObject);
var
Text: string;
begin
// エクスプローラからコピペした際の""を除去
Edit1.Text := StringReplace(Edit1.Text, '"', '', [rfReplaceAll]);
// ファイルの存在チェック
if not(FileExists(Edit1.Text)) then
begin
ShowMessage('指定されたファイルが存在しません。');
Abort;
end;
// 関数実行
Text := OCR_Image(Edit1.Text, 'YOUR_API_KEY'); // 取得したAPIキーを引数にセット
// 戻り値の取得文字列をMemoにセット
Memo1.Lines.Text := Text;
end;
使用イメージ
たとえば例として、
以下の写真データを文字認識させてみたいと思います。
(以前のこちらの記事のサムネイル写真の加工前データです)

アプリケーションをコンパイルして起動したのち、
画像のフルパスを指定して、Button1(取り込みボタン)を押してみると……

この通りです。
日本語もバッチリ取得できています。
画像内の位置より取得結果の文字の順番は順不同ですが、
これぐらいの粗さの活字であれば誤字なく読み取ることが可能です。
<取得結果 全文>
MIGARO TECHNICAL REPORT ミガロ テクニカルレポート No.1 2008年秋 MIGARO. TECHNICAL REPORT ミガロ、テクニカルレポート No.5 2012年秋 MIGARO TECHNICAL REPORT ミガロ、テクニカルレポート No.10 2017年秋 MIGARO. TECHNICAL REPORT She N MIGARO. TECHNICAL REPORT ミガロ、テクニカルレポート No.11 2018年秋 MIGARO. TECHNICAL REPORT ミカロテクニカルレポート No.2 2009年秋 MIGARO TECHNICAL REPORT ミガロ、テクニカルレポート No.7 2014年秋 MIGARO. TECHNICAL REPORT ミガロ、テクニカルレポート MIGARO. TECHNICAL REPORT ミガロ、テクニカルレポート No.4 2011年秋 No.3 2010: MIGARO TECHNICAL REPORT ミガロ、テクニカルレポート No.8 2015年秋 MIGARO. TECHNICAL REPORT ミガロ、テクニカルレポート No.9 2016年秋 MIGARO TECHNICAL REPORT ミガロ、テクニカルレポート No.12 2019年秋 MIGARO. TECHNICAL REPORT ミガロ、テクニカルレポート No.13 2020年秋 MIGARO TECHNICAL REPORT 2024 NO.17 . ALL MIGARO. TECHNICAL REPORT 2021 ミガロ、テクニカルレポート2021年 No.14 株式会社 ミガロ. MIGARO. TECHNICAL REPORT 2022 ミガロ、テクニカルレポート2022年 NO.15 株式会社 ミガロ. MIGARO. TECHNICAL REPORT 2023 NO.16 ミガロ テクニカルレポート2023年 株式会社 ミガロ. MIGARO. TECHNICAL REPORT 2024 ミガロ テクニカルレポート 2024年 NO.17 株式会社 ミガロ.
Google APIのトークン消費量は気になりますが、
(ヘルプによれば、2026年4月現在、月あたり最初の1,000枚が無料枠になるとのこと)
こちらのロジックを使えばDelphiによる文字認識がぐっと便利になるかと思います。
ぜひご活用ください。
補足事項
- 今回使用した各処理は、Delphi/400 10 Seattle以降の各バージョンで対応しています。
- 今回使用したCloud Vision APIでは、Googleのドキュメントにおいて、
送信した画像を機械学習などには使用しないと保証されています。
⇒ データ使用に関するよくある質問 | Cloud Vision API | Google Cloud Documentation - 弊社で対応確認できたファイル形式はJPEG・PNG・GIF・BMP・TIFF・WEBP・ICOとなります。
(PDFは仕様が異なるため今回のロジックには非対応)
また20MBをこえるファイルには対応していません。
⇒ サポートされる画像 | Cloud Vision API | Google Cloud Documentation