# JavaScript Raw APIs

**getScreenSize()**

Returns `Object` - `{width: Integer, height: Integer}`

```
var sizeObj = getScreenSize();
console.log(sizeObj.width, sizeObj.height);
// 1080 1920
```

**getScreenshot()**

Returns `Integer` - The image pointer

```
var img = getScreenshot();
console.log(img);
// 122344533 <- image pointer
releaseImage(img); // Don't forgot release a pointer
```

**getScreenshotModify(cropX, cropY, cropWidth, cropHeight, resizeWidth, resizeHeight, qualitys)**

Get screenshot, crop and resize. For speeding up screenshot.

* `cropX` Integer
* `cropY` Integer
* `cropWidth` Integer
* `cropHeight` Integer
* `resizeWidth` Integer
* `resizeHeight` Integer
* `quality` Integer

Returns `Integer` - The image pointer

```
var image = getScreenshotModify(200, 200, 100, 100, 50, 50, 80);
console.log(image); // image width = 50, height = 50 
// 12333122
releaseImage(image);
```

**execute(command)**

Call exec command in android system. It's permission is same as `adb shell`

* `command` String

Returns `String` - The result of the execution

```
var result = execute("ls -al /sdcard");
console.log(result);
// drwxr-xr-x   2 root  root    64B 12 14 23:44 Robotmon
```

**tap(x, y, during)**

Simulate a tap event

* `x` Integer
* `y` Integer
* `during` Integer

```
tap(200, 200, 10);
// Will inject a tap down and a tap up event to system
```

**tapDown(x, y, during)**

* `x` Integer
* `y` Integer
* `during` Integer

```
tapDown(200, 200, 40);
// Will inject a tapDown event to system
```

**tapUp(x, y, during)**

* `x` Integer
* `y` Integer
* `during` Integer

```
tapUp(200, 200, 40);
// Will inject a tapUo event to system
```

**moveTo(x, y, during)**

moveTo should be betewwn `tapDown` and `tapUp`

* `x` Integer
* `y` Integer
* `during` Integer

```
tapDown(500, 300, 40);
moveTo(500, 600, 40);
tapUp(500, 600, 40);
// Will inject a swipe down event
```

**swipe(x1, y1, x2, y2, during)**

Simulate a swipe event, using `tapDown`, `moveTo` and `tapUp` event. This function may not work in some game, you should implement yourself.

* `x1` Integer
* `y1` Integer
* `x2` Integer
* `y2` Integer
* `during` Integer

```
swipe(500, 300, 40); // same as above example
// Will inject a swipe down event
```

**keycode(label, during)**

Send a key code event to system Like adb shell input keyevent command [Android Keycode List](https://developer.android.com/reference/android/view/KeyEvent.html)

* `label` String
* `during` Integer

```
keycode('HOME', 40); // same as keycode('KEYCODE_HOME', 40);
// Will send a HOME event to system
```

**typing(words, during)**

Only allow English words

* `words` String
* `during` Integer

```
typing('Hello!', 100);
// Will type 'H' 'e' 'l' 'l' 'o' '!' 6 words
```

#### OpenCV

**clone(sourceImg)**

Duplicate an image to another.

* `sourceImg` Integer

Returns `Integer` - The image pointer

```
var oriImage = getScreenshot();
for (var i = 0; i < 10; i++) {
  var cloneImage = clone(oriImage);
  // modify clone Image here
  smooth(cloneImage, 1, 5); // blur
  release(cloneImage);
}
release(oriImage);
```

**smooth(sourceImg, smoothType, size)**

Same as OpenCV `smooth()` function.

* `sourceImg` Integer
* `smoothType` Integer
* `size` Integer

| smoothType | description         |
| ---------- | ------------------- |
| 0          | CV\_BLUR\_NO\_SCALE |
| 1          | CV\_BLUR            |
| 2          | CV\_GAUSSIAN        |
| 3          | CV\_MEDIAN          |
| 4          | CV\_BILATERAL       |

```
var img = getScreenshot();
smooth(img, 2, 5); // Gaussian blur
saveImage(img, getStoragePath + '/smooth.png');
releaseImage(img);
```

**convertColor(sourceImg, code)**

Same as OpenCV `cvtColor()`. Not support different channels. If you want to convert to gray, please use bgrToGray. Note that `getScreenshot` and `getScreenshotModify` is BGR order;

* `sourceImg` Integer
* `code` Integer

| code | description |
| ---- | ----------- |
| 40   | CV\_BGR2HSV |
| 52   | CV\_BGR2HLS |

See more: [OpenCV Types](https://github.com/opencv/opencv/blob/2.4/modules/imgproc/include/opencv2/imgproc/types_c.h)

```
var img = getScreenshot();
// Convert BGR to HSV color
convertColor(img, 40);
releaseImage(img);
```

**bgrToGray(sourceImg)**

Convert form bgr (3 channels) to gray (1 channel).

* `sourceImg` Integer

Returns `Integer` - The gray image pointer

```
var img = getScreenshot();
var gray = bgrToGray(img); // gray image
releaseImage(img);
releaseImage(gray);
```

**absDiff(sourceImg, targetImg)**

Same as OpenCV `adbdiff()`.

* `sourceImg` Integer
* `targetImg` Integer

Returns `Integer` - The image pointer of the difference

```
var img1 = getScreenshot();
sleep(100);
var img2 = getScreenshot();
var diff = absDiff(img1, img2); // in gray order
releaseImage(img1);
releaseImage(img2);
releaseImage(diff);
```

**threshold(sourceImg, thr, maxThr, code)**

Same as OpenCV `threshold()`.

* `sourceImg` Integer
* `thr` Float
* `maxThr` Float
* `code` Integer

| code | description       |
| ---- | ----------------- |
| 0    | CV\_THRES\_BINARY |

See more: [OpenCV Types](https://github.com/opencv/opencv/blob/2.4/modules/imgproc/include/opencv2/imgproc/types_c.h)

```
keycode('MENU');
sleep(1000);
var img1 = getScreenshot();
keycode('HOME');
sleep(1000);
var img2 = getScreenshot();
var diff = absDiff(img1, img2); // in gray order
threshold(diff, 100, 255); // set to 0 if <= 100, set to 255 if > 100
var value = getImageColor(diff, 500, 200); // value => {r":255,"g":0,"b":0","a":0}
console.log(value['r']); // current diff value is show on 'r'
// 255
releaseImage(img1);
releaseImage(img2);
releaseImage(diff);
```

**eroid(sourceImg, width, height, x, y)**

Same as OpenCV `eroid`.

`width`, `height`, `x`, `y` is `getStructuringElement()` parameters.

* `sourceImg` Integer
* `width` Integer
* `height` Integer
* `x` Integer
* `y` Integer

```
var img = getScreenshot();
threshold(img, 100, 255);
eroid(img, 3, 3, 1, 1);
saveImage(img, getStoragePath() + '/test_eroid.png');
releaseImage(img);
```

**dilate(sourceImg, width, height, x, y)**

Same as OpenCV `dilate`.

`width`, `height`, `x`, `y` is `getStructuringElement()` parameters.

* `sourceImg` Integer
* `width` Integer
* `height` Integer
* `x` Integer
* `y` Integer

```
var img = getScreenshot();
threshold(img, 100, 255);
dilate(img, 3, 3, 1, 1);
saveImage(img, getStoragePath() + '/test_dilate.png');
releaseImage(img);
```

**inRange(sourceImg, minB, minG, minR, minA, maxB, maxG, maxR, maxA)**

Same as OpenCV `inRange + clone + mask`. Filter with range color and clone to new image.

* `sourceImg` Integer
* `minB` Integer
* `minG` Integer
* `minR` Integer
* `minA` Integer
* `maxB` Integer
* `maxG` Integer
* `maxR` Integer
* `maxA` Integer

Returns `Integer` - The filtered image pointer

```
var img = getScreenshot();
var filteredImg = inRange(img, 0, 255, 255, 255, 255, 255, 255, 255); // only keep blue color pixel
saveImage(filteredImg, getStoragePath() + '/test_filterd.png');
releaseImage(img);
releaseImage(filteredImg);
```

**outRange(sourceImg, minB, minG, minR, minA, maxB, maxG, maxR, maxA)**

Same as OpenCV `inRange + clone + not + mask`. Filter without range color and clone to new image.

* `sourceImg` Integer
* `minB` Integer
* `minG` Integer
* `minR` Integer
* `minA` Integer
* `maxB` Integer
* `maxG` Integer
* `maxR` Integer
* `maxA` Integer

Returns `Integer` - The filtered image pointer

```
var img = getScreenshot();
var filteredImg = outRange(img, 0, 255, 255, 255, 255, 255, 255, 255); // keep all but blue color
saveImage(filteredImg, getStoragePath() + '/test_filterd.png');
releaseImage(img);
releaseImage(filteredImg);
```

**cloneWithMask(sourceImg, mask)**

Same as OpenCV `copyTo`. Clone image with mask (only support 1 channel)

* `sourceImg` Integer
* `mask` Integer

Returns `Integer` - new image pointer with mask

```
var img1 = getScreenshot();
sleep(100);
var img2 = getScreenshot();
var diff = absDiff(img1, img2);
sleep(100);
var img3 = cloneWithMask(img1, diff);
releaseImage(img1);
releaseImage(img2);
releaseImage(img3);
releaseImage(diff);
```

**houghCircles(sourceImg, method, dp, minDist, p1, p2, minR, maxR)**

Same as OpenCV `houghCircles`. For finding circles.

* `sourceImg` Integer
* `method` Integer (3 = CV\_HOUGH\_GRADIENT)
* `dp` Float (1) (ratio between input image and input params.)
* `minDist` Float (min distance between circles)
* `p1` Float (canny parameter)
* `p2` Float (canny parameter)
* `minR` Integer (min radius)
* `maxR` Integer (max radius)

Returns `Object` - Array of circles

```
var img = getScreenshot();
var points = houghCircles(img, 3, 1, 8, 4, 8, 6, 14);
console.log(points); // {"0": {"x": 102, "y": "233", "r": 9}}
releaseImage(img);
```

**canny(sourceImg, t1, t2, apertureSize)**

Same as OpenCV `canny`

* `sourceImg` Integer
* `t1` Float
* `t2` Float
* `apertureSize` Integer

Returns `Integer` - The canny image pointer

```
var img = getScreenshot();
threshold(img, 30, 255);
eroid(img, 5, 5, 1, 1);
var cannyImg = canny(img, 50, 150, 3);
saveImage(cannyImg, getStoragePath() + '/test_canny.png');
releaseImage(img);
releaseImage(cannyImg);
```

**findContours(cannyImgPtr, minArea, maxArea)**

Same as OpenCV `findContours`.

* `cannyImgPtr` Integer (Canny image as input)
* `minArea` Float
* `maxArea` Float

Returns `Object` - `{"0": {x: Integer, y: Integer}`

```
var img = getScreenshot();
threshold(img, 30, 255);
eroid(img, 5, 5, 1, 1);
var cannyImg = canny(img, 50, 150, 3);
var results = findContours(cannyImg, 1000, 10000); // area > 100
console.log(JSON.stringify(results));
// {"0":{"x":537,"y":1850},"1":{"x":133,"y":601}}
releaseImage(img);
releaseImage(cannyImg);
```

**drawCircle(sourceImg, x, y, radius, r, g, b, a)**

Draw circle in an image.

* `sourceImg` Integer
* `x` Integer
* `y` Integer
* `radius` Integer
* `r` Integer
* `g` Integer
* `b` Integer
* `a` Integer

```
var img = getScreenshot();
drawCircle(img, 100, 100, 10, 0, 0, 255, 0); // draw a blue circle
saveImage(img, getStoragePath() + '/test_drawCircle.png');
releaseImage(img);
```

**getIdentityScore(sourceImg, targetImg)**

* `sourceImg` Integer
* `targetImg` Integer

Returns `Float` - The identity score

```
keycode('MENU');
sleep(1000);
var img1 = getScreenshot();
keycode('HOME');
sleep(1000);
var img2 = getScreenshot();
var score = getIdentityScore(img1, img2);
console.log(score); // 0.6004924774169922
releaseImage(img1);
releaseImage(img2);
```

**cropImage(sourceImg, x, y, width, height)**

Crop image.

* `x` Integer
* `y` Integer
* `width` Integer
* `height` Integer

Returns `Integer` - The image pointer

```
var img = getScreenshot();
var cropImg = cropImage(img, 350, 550, 150, 150);
saveImage(cropImg, getStoragePath() + '/test_crop.png');
releaseImage(img);
releaseImage(cropImg);
```

**findImage(sourceImg, targetImg)**

Using OpenCV `Template Match` to fing image.

* `sourceImg` Integer
* `targetImg` Integer

Returns `Object` - `{x: Integer, y: Integer, score: Float}`

```
var img = getScreenshot();
var cropImg = cropImage(img, 350, 550, 150, 150);
var result = findImage(img, cropImg);
console.log(JSON.stringify(result)); // {"score":0.9999997615814209,"x":350,"y":550}
releaseImage(img);
releaseImage(cropImg);
```

**findImages(sourceImg, targetImg, scoreLimit, resultCountLimit, withoutOverlap)**

Same as `findImage()`, but find mulitple times.

* `sourceImg` Integer
* `targetImg` Integer
* `scoreLimit` Integer
* `resultCountLimit` Integer
* `withoutOverlap` Boolean

Returns `String` - `{"0": {"x": Integer, "y": Integer, "score": Float}, "1": {"x": Integer, "y": Integer, "score": Float}}`, Key is String!

```
var img = getScreenshot();
var cropImg = cropImage(img, 350, 550, 150, 150);
var result = findImages(img, cropImg, 0.95, 3, true);
console.log(JSON.stringify(result)); // {"0":{"score":0.9999997615814209,"x":350,"y":550}}
releaseImage(img);
releaseImage(cropImg);
```

**resizeImage(sourceImg, width, height)**

Resize image.

* `width` Integer
* `height` Integer

Returns `Integer` - The image pointer

```
var img = getScreenshot();
var resizeImg = resizeImage(img, 108, 192);
saveImage(resizeImg, getStoragePath() + '/test_resize.png');
releaseImage(img);
releaseImage(resizeImg);
```

**releaseImage(imgPtr)**

Very Important! You should call this function with all imgPtrs.

* `imgPtr` Integer

```
var img = getScreenshot(); // keep in memory
releaseImage(img); // release from memory
```

**getImageColor(sourceImg, x, y)**

Get color of point from an image.

* `sourceImg` Integer
* `x` Integer
* `y` Integer

Returns `Object` - `{r: Integer, g: Integer, b: Integer, a: Integer}`

```
var img = getScreenshot();
var color = getImageColor(img, 100, 100);
console.log(JSON.stringify(color)); // {"a":0,"b":21,"g":36,"r":198}
releaseImage(img);
```

**getImageSize(imgPtr)**

* `imgPtr` Integer

Returns `Object` - `{width: Integer, height: Integer}`

```
var img = getScreenshot();
var size = getImageSize(img);
console.log(JSON.stringify(size)); // {"height":1920,"width":1080}
releaseImage(img);
```

**saveImage(imgPtr, path)**

Save image to disk.

* `imgPtr` Integer
* `path` String

```
var img = getScreenshot();
saveImage(img, getStoragePath + '/test_save.png');
releaseImage(img);
```

**openImage(path)**

Open image from disk.

* `path` String

Returns `Integer` - The image pointer

```
var img = openImage(getStoragePath + '/test_save.png');
releaseImage(img);
```

**sleep(milliseconds)**

Like `sleep` function in C language, pause current process.

* `milliseconds` Integer

```
console.log('Hello');
sleep(1000);
console.log('Andy');
```

**getStoragePath()**

Get Robotmon folder. Like `/sdcard/Robotmon`.

Returns `String` - The storage path

```
console.log(getStoragePath());
```

**getImageFromURL(url)**

Get image from an url.

* `url` String

Returns `Integer` - The image pointer

**getImageFromBase64(base64)**

Get image from a base64 string.

* `base64` String

Returns `Integer` - The image pointer

**getBase64FromImage(imgPtr)**

Get base64 string from an image.

* `imgPtr` Integer

Returns `String` - base64

**readFile(path)**

Read a file as string.

* `path` String

Returns `String` - The text of the file

**writeFile(path, text)**

Write a string to a file.

* `path` String
* `text` String

**encrypt(script)**

Encrypted a string

* `script` String

Returns String - The encrypted script

**runEncryptedScript(script)**

Run a encrypted javascript string.

* `script` String - The script is encrypted by `encrypt`

**runScript(script)**

Run a javascript string.

* `script` String

**httpClient(method, url, body, headers)**

Do a http request.

* `method` String
* `url` String
* `body` String
* `headers` Object

Returns `String` - The result

```
httpClient('GET', 'http://httpbin.org/get', '', {});
httpClient('POST', 'http://httpbin.org/post', 'body data', {});
httpClient('POST', 'http://httpbin.org/post', 'foo=bar&bar=foo', {'Content-Type': 'application/x-www-form-urlencoded'});
```

**importJS(library)**

Import an JS library.

* `library` String

```
importJS('RBM-0.0.2') // import shared library in libs
importJS('js/customerJS') // import local library
```

**getVirtualButtonHeight()**

Returns `Integer` - The height of the virtual button


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://www.robotmon.app/jiao-ben-jiao-xue/api-documents/javascript-raw-apis.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
