OCR¶
Simba has OCR functions (Optical Text Recognition); these are used to read text from an image.
It also has a wide variation of text finding functions. Both will be covered in this article.
Fonts¶
Fonts are an essential part of the text finding and identifying. Now follows a brief explanation of the Font related functions in Simba.
All fonts have an unique identifier in the shape of a string
.
If you create or load a new font, they will need to be given a name.
LoadSystemFont¶
function LoadSystemFont(const SysFont: TFont; const FontName: string):
boolean;
This font loads a previously created Font with the name specified by FontName.
Example:
program new;
var
Font : TFont;
begin
Font := TFont.Create;
Font.Name := 'Courier New';
Font.Size := 10;
Font.Style := [];
LoadSystemFont(Font,'test');
DisplayDebugImgWindow(0,0);
DisplayDebugImgWindow(150,50);
DrawBitmapDebugImg(BitmapFromText('BMP[0] has not been freed','test'));
Font.free;
end.
LoadFont¶
function LoadFont(const FontName: string; shadow: boolean): boolean;
Load the font specific by the FontName. The font has to recide in the Fonts directory.
As of Simba version 993 and up, LoadFont also accepts paths outside the Fonts directory. In this case FontName is thus an entire path; and the internal font name is simply the name of the last folder in the path.
FreeFont¶
function FreeFont(const FontName: string): boolean;
This function is used to free a font identified by FontName.
BitmapFromText¶
function BitmapFromText(const text, font: String): integer;
This function creates a bitmap from a string text with the given font. For an explanation on how to use and work with Bitmaps, please refer to Bitmap.
TPAFromText¶
function TPAFromText(const text, font: String;var w,h : integer): TPointArray;
This function creates a TPA from a string text with the given font. For an explanation on how to use and work with TPAs, please refer to TPointArrays.
TPAFromTextWrap¶
procedure TPAFromTextWrap(const text, font: String;var w,h : integer;var TPA : TPointArray);
A wrapper function for the previously mentioned function. Required to work arounds bugs in the interpreter.
MaskFromText¶
function MaskFromText(const text, font: String): TMask;
This function creates a Mask from a string text with the given font. For an explanation on how to use and work with TPAs, please refer to CreateMaskFromBitmap.
Reading Text¶
rs_GetUpText¶
function rs_GetUpText: string;
This function is a function specific to RuneScape(tm); it reads the text in the upper left corner into a string.
How these functions actually work can be found here: Uptext.
rs_GetUpTextAt¶
function rs_GetUpTextAt(x, y : integer): string;
This function is a function specific to RuneScape(tm); it reads the text at the specified position in (x, y) into a string.
rs_GetUpTextAtEx¶
function rs_GetUpTextAt(x, y : integer; shadow: boolean; fontname: string): string;
This function is a function specific to RuneScape(tm); it reads the text at the specified position in (x, y) into a string, optionally using the shadows of the font. Fontname specifies the name of the font to use; with the other functions this defaults to “UpChars”.
GetTextAt¶
function GetTextAt(const atX, atY, minvspacing, maxvspacing, hspacing,color, tol, len: integer;const font: string): string;
A general function for reading text. Reads text at (atX, atY) with a minimal vertical spacing of minvspacing and a maximal vertical spacing of maxvspacing, the text color should match the color color with the given tolerance Tolerance; the length of the text is specified with len. Finally, the font to use for the identifying is specified with the fontname font.
GetTextAtEx¶
function GetTextAtEx(const xs,ys,xe,ye, minvspacing, maxvspacing, hspacing,color, tol: integer;const font: string): string;
A general function for reading text. Reads text in the rectangle defined by (xs, ys), (xe, ye) with a minimal vertical spacing of minvspacing and a maximal vertical spacing of maxvspacing, the text color should match the color color with the given tolerance Tolerance; the length of the text is specified with len. Finally, the font to use for the identifying is specified with the fontname font.
GetTextATPA¶
function GetTextATPA(const ATPA : T2DPointArray; const maxvspacing : integer; const font : string): string;
Similar to GetTextAt but reads the text from a ATPA rather than the client.
GetTextAtExWrap¶
function GetTextAtExWrap(const xs,ys,xe,ye, minvspacing, maxvspacing, hspacing,color, tol: integer;const font: string): string;
A wrapper function for the previously mentioned function. Required to work arounds bugs in the interpreter.
Modifying the Uptext filter¶
rs_ResetUpTextFilter¶
Reset the colors for the color-filter to default. See rs_SetUpTextFilter for an example.
rs_SetUpTextFilter¶
procedure rs_SetUpTextFilter(filter: TOCRFilterDataArray);
Defines the colors that the color-filter will look for.
Example:
program UpTextFilter;
{ Some constants for the OCR - taken directly from Simba }
const
{ Very rough limits for R, G, B }
ocr_Limit_High = 190;
ocr_Limit_Med = 130;
ocr_Limit_Low = 65;
{ `base' Colors of the Uptext }
{ White }
ocr_White = 16777215;
{ Level < Your Level }
ocr_Green = 65280;
{ Level > Your Level }
ocr_Red = 255;
{ Interact or Level = Your Level }
ocr_Yellow = 65535;
{ Object }
ocr_Blue = 16776960;
{ Item }
ocr_ItemC = 16744447;
{ Item }
ocr_ItemC2 = ocr_Red or ocr_Green;
{ Shadow }
ocr_Purple = 8388736;
const
OF_LN = 256;
OF_HN = -1;
{ Helper function to easily load a struct }
function load0(r_low,r_high,g_low,g_high,b_low,b_high,set_col: integer;
is_text_color: boolean): tocrfilterdata;
begin
result.r_low := r_low;
result.r_high := r_high;
result.g_low := g_low;
result.g_high := g_high;
result.b_low := b_low;
result.b_high := b_high;
result.set_col := set_col;
result._type := 0;
result.is_text_color:= is_text_color;
end;
{
Load our own ``filter data''. This particular set doesn't contain the item
colors - those are replaced with extra (effectively nill as they already
exist) green colors.
}
rocedure foo;
var filterdata: TOCRFilterDataArray;
begin
setlength(filterdata, 9);
filterdata[0] := load0(65, OF_HN, OF_LN, 190, OF_LN, 190, ocr_Blue, True); // blue
filterdata[1] := load0(65, OF_HN, OF_LN, 190, 65, OF_HN, ocr_Green, True); // green
// ``False'' item
filterdata[2] := load0(65, OF_HN, OF_LN, 190, 65, OF_HN, ocr_Green, True); // green
{ This is the real one }
//filterdata[2] := load0(OF_LN, 190, 220, 100, 127, 40, ocr_ItemC, True); // itemC
filterdata[3] := load0(OF_LN, 190, OF_LN, 190, 65, OF_HN, ocr_Yellow, True); // yellow
filterdata[4] := load0(OF_LN, 190, 65, OF_HN, 65, OF_HN, ocr_Red, True); // red
filterdata[5] := load0(OF_LN, 190, OF_LN, 65, 65, OF_HN, ocr_Red, True); // red 2
filterdata[6] := load0(190 + 10, 130, OF_LN, 65 - 10, 20, OF_HN, ocr_Green, True); // green 2
// ``False'' item 2
filterdata[7] := load0(65, OF_HN, OF_LN, 190, 65, OF_HN, ocr_Green, True);
{ This is the real one }
//filterdata[7] := load0(190, 140, 210, 150, 200, 160, ocr_ItemC2, True); // item2, temp item_c
filterdata[8] := load0(65, OF_HN, 65, OF_HN, 65, OF_HN, ocr_Purple, False); // shadow
rs_SetUpTextFilter(filterdata);
end;
var
bmp: integer;
begin
bmp := LoadBitmap('uptext.png');
SetTargetBitmap(bmp);
writeln( rs_GetUpTextAt(0, 0) );
foo;
writeln( rs_GetUpTextAt(0, 0) );
rs_ResetUpTextFilter;
writeln( rs_GetUpTextAt(0, 0) );
SetDesktopAsClient;
FreeBitmap(bmp);
end.
IsFontLoaded¶
function IsFontLoaded(const FontName: string): Boolean
ocr_FilterUpTextByCharacteristics¶
procedure ocr_FilterUpTextByCharacteristics(Bitmap: TMufasaBitmap)