?? unit1.pas
字號(hào):
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls;
const
iOcrTypeMultiLine = $0; //要識(shí)別為多行文字
iOcrTypeOneLine = $10000; //僅識(shí)別為一行文字
iOcrTypeOneCharacter = $20000; //僅識(shí)別為一個(gè)字
InfoAssociate = 1; //使用聯(lián)想詞庫(kù)
InfoAutoRotateBeforeRecognize = 2; //自動(dòng)傾斜更正
InfoSameFont = 4; //圖片中字體大小只有一種
InfoReservePositionCannotRecognize = 8; //不能識(shí)別的文字顯示為?
InfoUniteSameXInOneLine = $10; //強(qiáng)制合并同一行中的X坐標(biāo)相同的點(diǎn)陣(主要用于文字中有大量白斑或斷線的情況,其它情況下一般不要設(shè)置此值)
InfoRotate180 = $20; //嘗試旋轉(zhuǎn)180度來識(shí)別
InfoRecognizeTable = $40; //是否分析表格
iGrayAuto = $10000; //灰度轉(zhuǎn)為單色時(shí)自動(dòng)設(shè)置閥值
HzDigit = $10; //數(shù)字
HzEnglish = $20; //英文
HzInterpunction = $40; //其它符號(hào)
HzChinese = $80; //中文
HzOnlyone = $100; //僅單字節(jié),不允許雙字節(jié)英文、數(shù)字
HZAll = HZDigit or HZEnglish or HzInterpunction or HzChinese; //所有字
HZEDI = HZDigit or HZEnglish or HzInterpunction; //所有數(shù)字、英文、符號(hào)
HZEDIOnlyone = HZEDI or HzOnlyone; //所有數(shù)字、英文、符號(hào)(單字節(jié),不允許雙字節(jié)英文、數(shù)字)
HZDI = HZDigit or HzInterpunction; //所有數(shù)字、符號(hào)
MaxSuspect = 15;
type
TResult = record
Chinese: array[0..3] of char;
Precision: word;
CountSuspect: word;
ChineseSuspect: array[0..MaxSuspect * 2 + 1] of char;
PrecisionSuspect: array[0..MaxSuspect] of word;
Rect: TRect;
end;
PResult = ^TResult;
TOCRResult = packed record
Count: integer;
Result: array[0..1] of TResult;
end;
POCRResult = ^TOCRResult;
TForm1 = class(TForm)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
Image1: TImage;
Panel1: TPanel;
Button1: TButton;
TabSheet2: TTabSheet;
Memo1: TMemo;
Button2: TButton;
Buttontif2bmp: TButton;
ButtonScan: TButton;
ButtonScanAll: TButton;
Button3: TButton;
Button4: TButton;
OpenDialog1: TOpenDialog;
Button5: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Buttontif2bmpClick(Sender: TObject);
procedure ButtonScanClick(Sender: TObject);
procedure ButtonScanAllClick(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
function WOcrInit(iType, iInfo, iCharacterSet: integer; res1: integer): BOOL; stdcall; external 'OcrWencui.dll';
function WOcrStart(HBmp: HBitmap;
rRect: PRect; iGray, res: integer; var pOCRResult: POCRResult; var TextResult: pchar; OutputFile: Pchar): BOOL; stdcall; external 'OcrWencui.dll';
function WOcrStartFile(Filename: pchar; iPage: integer;
rRect: PRect; iGray, res: integer; var pOCRResult: POCRResult; var TextResult: pchar; OutputFile: Pchar): BOOL; stdcall; external 'OcrWencui.dll';
procedure WOcrStop; stdcall; external 'OcrWencui.dll';
function WConvertToBmp(FileSrc, BmpFileDst: pchar; iPage: integer): bool; stdcall; external 'OcrWencui.dll';
function WConvertColors(FileSrc, BmpFileDst: pchar; iPage, Colors, Value: integer): bool; stdcall; external 'OcrWencui.dll';
function WConvertKeepColor(FileSrc, BmpFileDst: pchar; iPage: integer; cColor: TColor; RedValue, GreenValue, BlueValue: byte): boolean; stdcall; external 'OcrWencui.dll';
function WScanerSelect(Scanname: pchar): bool; stdcall; external 'OcrWencui.dll';
function WScanParameter(Scanname: pchar; bInvert, bDouble: bool; ImageType, ImageRes, ImageBright, ImageContrast: integer; rect: PRect): bool; stdcall; external 'OcrWencui.dll'; //Rect的單位:毫米
function WScanStartOnePage(filename: pchar): integer; stdcall; external 'OcrWencui.dll';
function WScanStartMultiPage(bShowGUI: boolean; iFileType: integer; Filename: pchar; bOverwrite: bool; iMaxScanPageCount, iMultiFirstPage, iStep: integer): integer; stdcall; external 'OcrWencui.dll';
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
p: POCRResult;
i: integer;
s: string;
Ptext: pchar;
begin
// if WOcrStartFile('test.bmp',0, nil, iGrayAuto, 0, p, Ptext,
// pchar(extractfilepath(paramstr(0)) + '1.pdf')) then
if WOcrStart(image1.Picture.Bitmap.Handle, nil, iGrayAuto, 0, p, Ptext,
pchar(extractfilepath(paramstr(0)) + '1.rtf')) then
begin
//顯示每個(gè)漢字
memo1.Lines.Clear;
for i := 0 to p^.Count - 1 do
with p.Result[i] do
begin
setlength(s, CountSuspect * 2);
move(ChineseSuspect[0], s[1], CountSuspect * 2);
memo1.Lines.Add(format('%-4s 相似度:%3d%% Left:%-4d Right:%-4d Top:%-4d Bottom:%-4d 候選字:%s', [string(Chinese), Precision,
Rect.left, Rect.right, Rect.top, Rect.bottom, s]));
end;
//顯示全部結(jié)果
memo1.Lines.Add(strpas(ptext));
if PageControl1.ActivePageIndex <> 1 then
PageControl1.ActivePageIndex := 1;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
image1.Picture.LoadFromFile(extractfilepath(paramstr(0)) + 'test.bmp');
if not WOcrInit(iOcrTypeMultiLine or HZAll, //多行文字,所有字符
InfoAssociate or InfoRecognizeTable, //使用聯(lián)想詞庫(kù),分析表格
0, //字符集
0 //保留未用
) then
showmessage('初始化dll出錯(cuò),請(qǐng)檢查使用許可是否過期或與作者聯(lián)系.');
end;
procedure TForm1.Button2Click(Sender: TObject);
var
p: POCRResult;
i: integer;
s: string;
r: trect;
Ptext: pchar;
begin
r.left := 156;
r.Right := 507;
r.Top := 40;
r.Bottom := 100;
if WOcrStart(image1.Picture.Bitmap.Handle, @r, iGrayAuto, 0, p, Ptext, '') then
begin
memo1.Lines.Clear;
for i := 0 to p^.Count - 1 do
with p.Result[i] do
begin
setlength(s, CountSuspect * 2);
move(ChineseSuspect[0], s[1], CountSuspect * 2);
memo1.Lines.Add(format('%-4s 相似度:%3d%% Left:%-4d Right:%-4d Top:%-4d Bottom:%-4d 候選字:%s', [string(Chinese), Precision,
Rect.left, Rect.right, Rect.top, Rect.bottom, s]));
end;
memo1.Lines.Add(strpas(ptext));
if PageControl1.ActivePageIndex <> 1 then
PageControl1.ActivePageIndex := 1;
end;
end;
procedure TForm1.Buttontif2bmpClick(Sender: TObject);
var
path: string;
begin
path := extractfilepath(paramstr(0));
if WConvertToBmp(pchar(path + 'test.tif'), pchar(path + 'bak.bmp'), 0) then
showmessage('test.tif已轉(zhuǎn)為bak.bmp');
end;
procedure TForm1.ButtonScanClick(Sender: TObject);
var
scaner: array[0..1024] of char;
filename: string;
begin
filename := extractfilepath(paramstr(0)) + 'bak.bmp';
if WScanerSelect(@Scaner[0]) then
if WScanParameter(@scaner, false, false, 0, 200, -127, 0, nil) then
if WScanStartOnePage(pchar(filename)) <> 0 then
begin
showmessage('掃描完成,保存為' + filename);
image1.Picture.LoadFromFile(filename);
end;
end;
procedure TForm1.ButtonScanAllClick(Sender: TObject);
var
scaner: array[0..1024] of char;
filename: string;
iPage: integer;
begin
filename := extractfilepath(paramstr(0)) + 'bak';
if WScanerSelect(@Scaner[0]) then
if WScanParameter(@scaner, false, false, 0, 60, 0, 0, nil) then
begin
iPage := WScanStartMultiPage(false, 0, pchar(filename), true, maxint, 1, 2);
if iPage <> 0 then
begin
showmessagefmt('掃描完成%d頁(yè)', [iPage]);
image1.Picture.LoadFromFile(filename + '001.bmp');
end;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if WConvertColors('GLITE.BMP', 'bak.bmp', 0, 1, 128) then
showmessage('ok');
end;
procedure TForm1.Button4Click(Sender: TObject);
var
color: TColor;
begin
color := $0404FC; //04藍(lán) 04綠 紅FC
if WConvertKeepColor('GLITE.BMP', 'bak.bmp', 0, color, 20, 20, 20) then
showmessage('ok');
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
if OpenDialog1.Execute then
Image1.Picture.LoadFromFile(OpenDialog1.FileName);
end;
end.
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -