fix: circular menu icon is not circular when recording feat: splash ui for built apk docs: update to latest docs fix: floating menu not showing automatically
194 lines
6.7 KiB
JavaScript
194 lines
6.7 KiB
JavaScript
|
|
module.exports = function(__runtime__, scope){
|
|
const defaultColorThreshold = 4;
|
|
|
|
var images = {};
|
|
var colors = Object.create(__runtime__.colors);
|
|
colors.alpha = function(color){
|
|
color = parseColor(color);
|
|
return color >>> 24;
|
|
}
|
|
colors.red = function(color){
|
|
color = parseColor(color);
|
|
return (color >> 16) & 0xFF;
|
|
}
|
|
colors.green = function(color){
|
|
color = parseColor(color);
|
|
return (color >> 8) & 0xFF;
|
|
}
|
|
colors.blue = function(color){
|
|
color = parseColor(color);
|
|
return color & 0xFF;
|
|
}
|
|
|
|
colors.isSimilar = function(c1, c2, threshold, algorithm){
|
|
c1 = parseColor(c1);
|
|
c2 = parseColor(c2);
|
|
threshold = threshold == undefined ? 4 : threshold;
|
|
algorithm = algorithm == undefined ? "diff" : algorithm;
|
|
var colorDetector = getColorDetector(c1, algorithm, threshold);
|
|
return colorDetector.detectsColor(colors.red(c2), colors.green(c2), colors.blue(c2));
|
|
}
|
|
|
|
if(android.os.Build.VERSION.SDK_INT < 19){
|
|
return images;
|
|
}
|
|
|
|
var rtImages = __runtime__.getImages();
|
|
|
|
var colorFinder = rtImages.colorFinder;
|
|
|
|
images.requestScreenCapture = rtImages.requestScreenCapture.bind(rtImages);
|
|
|
|
images.captureScreen = rtImages.captureScreen.bind(rtImages);
|
|
|
|
images.read = rtImages.read.bind(rtImages);
|
|
|
|
images.load = rtImages.load.bind(rtImages);
|
|
|
|
images.saveImage = rtImages.saveImage.bind(rtImages);
|
|
|
|
images.clip = rtImages.clip.bind(rtImages);
|
|
|
|
images.save = images.saveImage;
|
|
|
|
images.pixel = rtImages.pixel;
|
|
|
|
images.detectsColor = function(img, color, x, y, threshold, algorithm){
|
|
color = parseColor(color);
|
|
algorithm = algorithm || "diff";
|
|
threshold = threshold || defaultColorThreshold;
|
|
var colorDetector = getColorDetector(color, algorithm, threshold);
|
|
var pixel = images.pixel(img, x, y);
|
|
return colorDetector.detectsColor(colors.red(pixel), colors.green(pixel), colors.blue(pixel));
|
|
}
|
|
|
|
images.findColor = function(img, color, options){
|
|
color = parseColor(color);
|
|
options = options || {};
|
|
var region = options.region || [];
|
|
if(options.similarity){
|
|
var threshold = parseInt(255 * (1 - options.similarity));
|
|
}else{
|
|
var threshold = options.threshold || defaultColorThreshold;
|
|
}
|
|
if(options.region){
|
|
return colorFinder.findColor(img, color, threshold, buildRegion(options.region, img));
|
|
}else{
|
|
return colorFinder.findColor(img, color, threshold, null);
|
|
}
|
|
}
|
|
|
|
images.findColorInRegion = function(img, color, x, y, width, height, threshold){
|
|
return findColor(img, color, {
|
|
region: [x, y, width, height],
|
|
threshold: threshold
|
|
});
|
|
}
|
|
|
|
images.findColorEquals = function(img, color, x, y, width, height){
|
|
return findColor(img, color, {
|
|
region: [x, y, width, height],
|
|
threshold: 0
|
|
});
|
|
}
|
|
|
|
images.findAllPointsForColor = function(img, color, options){
|
|
color = parseColor(color);
|
|
options = options || {};
|
|
if(options.similarity){
|
|
var threshold = parseInt(255 * (1 - options.similarity));
|
|
}else{
|
|
var threshold = options.threshold || defaultColorThreshold;
|
|
}
|
|
if(options.region){
|
|
return toPointArray(colorFinder.findAllPointsForColor(img, color, threshold, buildRegion(options.region, img)));
|
|
}else{
|
|
return toPointArray(colorFinder.findAllPointsForColor(img, color, threshold, null));
|
|
}
|
|
}
|
|
|
|
images.findMultiColors = function(img, firstColor, paths, options){
|
|
options = options || {};
|
|
firstColor = parseColor(firstColor);
|
|
var list = java.lang.reflect.Array.newInstance(java.lang.Integer.TYPE, paths.length * 3);
|
|
for(var i = 0; i < paths.length; i++){
|
|
var p = paths[i];
|
|
list[i * 3] = p[0];
|
|
list[i * 3 + 1] = p[1];
|
|
list[i * 3 + 2] = parseColor(p[2]);
|
|
}
|
|
var region = options.region ? buildRegion(options.region, img) : null;
|
|
var threshold = options.threshold === undefined ? defaultColorThreshold : options.threshold;
|
|
return colorFinder.findMultiColors(img, firstColor, threshold, region, list);
|
|
}
|
|
|
|
images.findImage = function(img, template, options){
|
|
options = options || {};
|
|
var threshold = options.threshold || 0.9;
|
|
var maxLevel = -1;
|
|
if(typeof(options.level) == 'number'){
|
|
maxLevel = options.level;
|
|
}
|
|
var weakThreshold = options.weakThreshold || 0.7;
|
|
if(options.region){
|
|
return rtImages.findImage(img, template, weakThreshold, threshold, buildRegion(options.region, img), maxLevel);
|
|
}else{
|
|
return rtImages.findImage(img, template, weakThreshold, threshold, null, maxLevel);
|
|
}
|
|
}
|
|
|
|
images.findImageInRegion = function(img, template, x, y, width, height, threshold){
|
|
return images.findImage(img, template, {
|
|
region: [x, y, width, height],
|
|
threshold: threshold
|
|
});
|
|
}
|
|
|
|
function getColorDetector(color, algorithm, threshold){
|
|
switch(algorithm){
|
|
case "rgb":
|
|
return new com.stardust.autojs.core.image.ColorDetector.RGBDistanceDetector(color, threshold);
|
|
case "equal":
|
|
return new com.stardust.autojs.core.image.ColorDetector.EqualityDetector(color);
|
|
case "diff":
|
|
return new com.stardust.autojs.core.image.ColorDetector.DifferenceDetector(color, threshold);
|
|
case "rgb+":
|
|
return new com.stardust.autojs.core.image.ColorDetector.WeightedRGBDistanceDetector(color, threshold);
|
|
case "hs":
|
|
return new com.stardust.autojs.core.image.ColorDetector.HSDistanceDetector(color, threshold);
|
|
}
|
|
throw new Error("Unknown algorithm: " + algorithm);
|
|
}
|
|
|
|
|
|
function toPointArray(points){
|
|
var arr = [];
|
|
for(var i = 0; i < points.length; i++){
|
|
arr.push(points[i]);
|
|
}
|
|
return arr;
|
|
}
|
|
|
|
function buildRegion(region, img){
|
|
var x = region[0] === undefined ? 0 : region[0];
|
|
var y = region[1] === undefined ? 0 : region[1];
|
|
var width = region[2] === undefined ? img.getWidth() - x : region[2];
|
|
var height = region[3] === undefined ? (img.getHeight() - y) : region[3];
|
|
var r = new org.opencv.core.Rect(x, y, width, height);
|
|
return r;
|
|
}
|
|
|
|
function parseColor(color){
|
|
if(typeof(color) == 'string'){
|
|
color = colors.parseColor(color);
|
|
}
|
|
return color;
|
|
}
|
|
|
|
scope.__asGlobal__(images, ['requestScreenCapture', 'captureScreen', 'findImage', 'findImageInRegion', 'findColor', 'findColorInRegion', 'findColorEquals', 'findMultiColors']);
|
|
|
|
scope.colors = colors;
|
|
|
|
return images;
|
|
} |