def smallgrayscaleTest(): largeNoiseFp = open('largenoise.png', 'rb') largeNoiseIm = Image.open(largeNoiseFp) imageWidth, imageHeight = largeNoiseIm.size bottomRightCorner30x30 = largeNoiseIm.crop( (imageWidth - 30, imageHeight - 30, imageWidth, imageHeight)) largeNoiseIm = largeNoiseIm.crop( (imageWidth - 100, imageHeight - 100, imageWidth, imageHeight)) startTime = time.time() result = pyscreeze.locate(bottomRightCorner30x30, largeNoiseIm, grayscale=False) print('Non-grayscale located at %s in: %s seconds' % (result, round(time.time() - startTime, 2))) startTime = time.time() result = pyscreeze.locate(bottomRightCorner30x30, largeNoiseIm, grayscale=True) print('Grayscale located at %s in: %s seconds' % (result, round(time.time() - startTime, 2))) largeNoiseFp.close()
def test_locate_filename(self): self.assertEqual((94, 94, 4, 4), tuple(pyscreeze.locate('slash.png', 'haystack1.png'))) self.assertEqual((93, 93, 4, 4), tuple(pyscreeze.locate('slash.png', 'haystack2.png'))) self.assertEqual((94, 94, 4, 4), tuple( pyscreeze.locate('slash.png', 'haystack1.png', grayscale=True))) self.assertEqual((93, 93, 4, 4), tuple( pyscreeze.locate('slash.png', 'haystack2.png', grayscale=True))) pyscreeze.USE_IMAGE_NOT_FOUND_EXCEPTION = True with self.assertRaises(pyscreeze.ImageNotFoundException): pyscreeze.locate('slash.png', 'colornoise.png') with self.assertRaises(pyscreeze.ImageNotFoundException): pyscreeze.locate('slash.png', 'colornoise.png', grayscale=True) pyscreeze.USE_IMAGE_NOT_FOUND_EXCEPTION = False self.assertEqual(pyscreeze.locate('slash.png', 'colornoise.png'), None) self.assertEqual( pyscreeze.locate('slash.png', 'colornoise.png', grayscale=True), None)
def test_imageNotFound(self): colorNoiseFp = open('colornoise.png', 'rb') colorNoiseIm = Image.open(colorNoiseFp) slashFp = open('slash.png', 'rb') slashIm = Image.open(slashFp) with self.assertRaises(pyscreeze.ImageNotFoundException): pyscreeze.locate(slashIm, colorNoiseIm) colorNoiseFp.close() slashFp.close()
def test_imageNotFound(self): colorNoiseFp = open('colornoise.png' ,'rb') colorNoiseIm = Image.open(colorNoiseFp) slashFp = open('slash.png' ,'rb') slashIm = Image.open(slashFp) with self.assertRaises(pyscreeze.ImageNotFoundException): pyscreeze.locate(slashIm, colorNoiseIm) colorNoiseFp.close() slashFp.close()
def test_locate_im(self): slashFp = open('slash.png' ,'rb') haystack1Fp = open('haystack1.png' ,'rb') haystack2Fp = open('haystack2.png' ,'rb') colorNoiseFp = open('colornoise.png' ,'rb') slashIm = Image.open(slashFp) haystack1Im = Image.open(haystack1Fp) haystack2Im = Image.open(haystack2Fp) colorNoiseIm = Image.open(colorNoiseFp) self.assertEqual((94, 94, 4, 4), tuple(pyscreeze.locate(slashIm, haystack1Im))) self.assertEqual((93, 93, 4, 4), tuple(pyscreeze.locate(slashIm, haystack2Im))) self.assertEqual((94, 94, 4, 4), tuple(pyscreeze.locate(slashIm, haystack1Im, grayscale=True))) self.assertEqual((93, 93, 4, 4), tuple(pyscreeze.locate(slashIm, haystack2Im, grayscale=True))) with self.assertRaises(pyscreeze.ImageNotFoundException): pyscreeze.locate(slashIm, colorNoiseIm) with self.assertRaises(pyscreeze.ImageNotFoundException): pyscreeze.locate(slashIm, colorNoiseIm, grayscale=True) slashFp.close() haystack1Fp.close() haystack2Fp.close() colorNoiseFp.close()
def test_locate_im(self): slashFp = open('slash.png', 'rb') haystack1Fp = open('haystack1.png', 'rb') haystack2Fp = open('haystack2.png', 'rb') colorNoiseFp = open('colornoise.png', 'rb') slashIm = Image.open(slashFp) haystack1Im = Image.open(haystack1Fp) haystack2Im = Image.open(haystack2Fp) colorNoiseIm = Image.open(colorNoiseFp) self.assertEqual((94, 94, 4, 4), tuple(pyscreeze.locate(slashIm, haystack1Im))) self.assertEqual((93, 93, 4, 4), tuple(pyscreeze.locate(slashIm, haystack2Im))) self.assertEqual( (94, 94, 4, 4), tuple(pyscreeze.locate(slashIm, haystack1Im, grayscale=True))) self.assertEqual( (93, 93, 4, 4), tuple(pyscreeze.locate(slashIm, haystack2Im, grayscale=True))) with self.assertRaises(pyscreeze.ImageNotFoundException): pyscreeze.locate(slashIm, colorNoiseIm) with self.assertRaises(pyscreeze.ImageNotFoundException): pyscreeze.locate(slashIm, colorNoiseIm, grayscale=True) slashFp.close() haystack1Fp.close() haystack2Fp.close() colorNoiseFp.close()
def test_imageNotFound(self): colorNoiseFp = open('colornoise.png', 'rb') colorNoiseIm = Image.open(colorNoiseFp) slashFp = open('slash.png', 'rb') slashIm = Image.open(slashFp) pyscreeze.USE_IMAGE_NOT_FOUND_EXCEPTION = True with self.assertRaises(pyscreeze.ImageNotFoundException): pyscreeze.locate(slashIm, colorNoiseIm) pyscreeze.USE_IMAGE_NOT_FOUND_EXCEPTION = False self.assertEqual(pyscreeze.locate(slashIm, colorNoiseIm), None) colorNoiseFp.close() slashFp.close()
def locate(self, image, type='', **kwargs): if type == "base64": needle_image = BytesIO(base64.b64decode(image)) else: needle_image = Image.open(image) haystack_image = self.get_screenshot() if res := pyscreeze.locate(needle_image, haystack_image) != None: position = [] self.x = pyscreeze.center(res)[0] self.y = pyscreeze.center(res)[1] position.append(pyscreeze.center(res)[0]) position.append(pyscreeze.center(res)[1]) return True
def locate_on_screen(self, image, minSearchTime: int = 0, **kwargs): """ 在屏幕中定位指定图片的位置 @param {str|PIL.Image} image - 要定位的图片文件路径或图片对象 @param {int} minSearchTime=0 - 最长搜索时间,单位为毫秒,设置这个值可以在找不到图片的情况下,循环等待屏幕变化重新匹配 @param {dict} kwargs - 其他执行参数: {bool} grayscale=False - 是否转换图片为灰度检索(提升30%速度) {int} limit=10000 - 匹配数量限制 {int} step=1 - 匹配步骤,支持送1或2,如果为2会跳过细节,大约能提升3倍速度,但有可能匹配不上 {float} confidence=0.999 - 匹配度 @returns {(int, int, int, int)} - 返回图片的位置(x, y, width, height), 找不到返回None """ if type(image) == str: _image = Image.open(image) else: _image = image start = time.time() while True: try: screenshotIm = self.screenshot() retVal = pyscreeze.locate(_image, screenshotIm, **kwargs) if retVal or time.time() - start > minSearchTime: return retVal except pyscreeze.ImageNotFoundException: return None
def largegrayscaleTest(): largeNoiseFp = open('largenoise.png' ,'rb') largeNoiseIm = Image.open(largeNoiseFp) imageWidth, imageHeight = largeNoiseIm.size bottomRightCorner100x100 = largeNoiseIm.crop((imageWidth - 100, imageHeight - 100, imageWidth, imageHeight)) startTime = time.time() result = pyscreeze.locate(bottomRightCorner100x100, largeNoiseIm, grayscale=False) print('Non-grayscale located at %s in: %s seconds' % (result, round(time.time() - startTime, 2))) startTime = time.time() result = pyscreeze.locate(bottomRightCorner100x100, largeNoiseIm, grayscale=True) print('Grayscale located at %s in: %s seconds' % (result, round(time.time() - startTime, 2))) largeNoiseFp.close()
def test_locate_filename(self): self.assertEqual((94, 94, 4, 4), tuple(pyscreeze.locate('slash.png', 'haystack1.png'))) self.assertEqual((93, 93, 4, 4), tuple(pyscreeze.locate('slash.png', 'haystack2.png'))) self.assertEqual((94, 94, 4, 4), tuple(pyscreeze.locate('slash.png', 'haystack1.png', grayscale=True))) self.assertEqual((93, 93, 4, 4), tuple(pyscreeze.locate('slash.png', 'haystack2.png', grayscale=True))) with self.assertRaises(pyscreeze.ImageNotFoundException): pyscreeze.locate('slash.png', 'colornoise.png') with self.assertRaises(pyscreeze.ImageNotFoundException): pyscreeze.locate('slash.png', 'colornoise.png', grayscale=True)
def test_locate_im_step(self): slashFp = open('slash.png', 'rb') haystack1Fp = open('haystack1.png', 'rb') haystack2Fp = open('haystack2.png', 'rb') colorNoiseFp = open('colornoise.png', 'rb') slashIm = Image.open(slashFp) haystack1Im = Image.open(haystack1Fp) haystack2Im = Image.open(haystack2Fp) colorNoiseIm = Image.open(colorNoiseFp) for step in range(1, 10): self.assertEqual(((94, 94, 4, 4), step), (tuple( pyscreeze.locate(slashIm, haystack1Im, step=step)), step)) self.assertEqual(((93, 93, 4, 4), step), (tuple( pyscreeze.locate(slashIm, haystack2Im, step=step)), step)) self.assertEqual(((94, 94, 4, 4), step), (tuple( pyscreeze.locate( slashIm, haystack1Im, grayscale=True, step=step)), step)) self.assertEqual(((93, 93, 4, 4), step), (tuple( pyscreeze.locate( slashIm, haystack2Im, grayscale=True, step=step)), step)) self.assertEqual( (None, step), (pyscreeze.locate(slashIm, colorNoiseIm, step=step), step)) self.assertEqual((None, step), (pyscreeze.locate( slashIm, colorNoiseIm, grayscale=True, step=step), step)) slashFp.close() haystack1Fp.close() haystack2Fp.close() colorNoiseFp.close()
def locateTest(): largeNoiseFp = open('largenoise.png' ,'rb') largeNoiseIm = Image.open(largeNoiseFp) imageWidth, imageHeight = largeNoiseIm.size bottomRightCorner100x100 = largeNoiseIm.crop((imageWidth - 100, imageHeight - 100, imageWidth, imageHeight)) for step in (1, 2, 4, 8, 16, 32): startTime = time.time() result = pyscreeze.locate(bottomRightCorner100x100, largeNoiseIm, step=step) print('bottomRightCorner100x100 (step %s) located at %s in: %s seconds' % (step, result, round(time.time() - startTime, 2))) largeNoiseFp.close()
def test_locate_filename(self): self.assertEqual((94, 94, 4, 4), tuple(pyscreeze.locate('slash.png', 'haystack1.png'))) self.assertEqual((93, 93, 4, 4), tuple(pyscreeze.locate('slash.png', 'haystack2.png'))) self.assertEqual((94, 94, 4, 4), tuple(pyscreeze.locate('slash.png', 'haystack1.png', grayscale=True))) self.assertEqual((93, 93, 4, 4), tuple(pyscreeze.locate('slash.png', 'haystack2.png', grayscale=True))) self.assertEqual(None, pyscreeze.locate('slash.png', 'colornoise.png')) self.assertEqual(None, pyscreeze.locate('slash.png', 'colornoise.png', grayscale=True))
def test_imageNotFound(self): colorNoiseFp = open('colornoise.png' ,'rb') colorNoiseIm = Image.open(colorNoiseFp) slashFp = open('slash.png' ,'rb') slashIm = Image.open(slashFp) oldSetting = pyscreeze.RAISE_IF_NOT_FOUND pyscreeze.RAISE_IF_NOT_FOUND = True self.assertRaises(pyscreeze.ImageNotFoundException, pyscreeze.locate, slashIm, colorNoiseIm) pyscreeze.RAISE_IF_NOT_FOUND = False self.assertEqual(None, pyscreeze.locate(slashIm, colorNoiseIm)) pyscreeze.RAISE_IF_NOT_FOUND = oldSetting colorNoiseFp.close() slashFp.close()
def test_imageNotFound(self): colorNoiseFp = open('colornoise.png', 'rb') colorNoiseIm = Image.open(colorNoiseFp) slashFp = open('slash.png', 'rb') slashIm = Image.open(slashFp) oldSetting = pyscreeze.RAISE_IF_NOT_FOUND pyscreeze.RAISE_IF_NOT_FOUND = True self.assertRaises(pyscreeze.ImageNotFoundException, pyscreeze.locate, slashIm, colorNoiseIm) pyscreeze.RAISE_IF_NOT_FOUND = False self.assertEqual(None, pyscreeze.locate(slashIm, colorNoiseIm)) pyscreeze.RAISE_IF_NOT_FOUND = oldSetting colorNoiseFp.close() slashFp.close()
def locate(*images, For=0.0, region=None, grayscale=None, confidence: Union[float, list] = 0.8, verbose=False): imglist = list(images) retVal = [None] * len(imglist) if region is None: region = detect_monitor( -1, verbose=False) # default monitor is the last(rightmost) one. start = time.time() if not isinstance(confidence, list): confidence = [confidence] while True: with mss.mss() as sct: ltrb = (region[0], region[1], region[0] + region[2], region[1] + region[3]) x = sct.grab(monitor=ltrb) screenshotIm = Image.frombytes("RGB", x.size, x.bgra, "raw", "BGRX") for i in range(len(imglist)): for conf in confidence: try: imglist[i] = pyscreeze._load_cv2(imglist[i], grayscale=grayscale) bbox = pyscreeze.locate(imglist[i], screenshotIm, grayscale=grayscale, confidence=conf) retVal[i] = (int(bbox[0] + bbox[2] / 2 + region[0]), int(bbox[1] + bbox[3] / 2) + region[1]) del imglist[i] if verbose is True: print(f'{i}th image found on confidence {conf}') except OSError as e: raise e except Exception: pass if any(retVal) or time.time() - start > For: if len(retVal) == 1: return retVal[0], screenshotIm else: return retVal, screenshotIm
def test_locate_filename(self): self.assertEqual((94, 94, 4, 4), tuple(pyscreeze.locate('slash.png', 'haystack1.png'))) self.assertEqual((93, 93, 4, 4), tuple(pyscreeze.locate('slash.png', 'haystack2.png'))) self.assertEqual((94, 94, 4, 4), tuple( pyscreeze.locate('slash.png', 'haystack1.png', grayscale=True))) self.assertEqual((93, 93, 4, 4), tuple( pyscreeze.locate('slash.png', 'haystack2.png', grayscale=True))) with self.assertRaises(pyscreeze.ImageNotFoundException): pyscreeze.locate('slash.png', 'colornoise.png') with self.assertRaises(pyscreeze.ImageNotFoundException): pyscreeze.locate('slash.png', 'colornoise.png', grayscale=True)
def test_locate_filename(self): self.assertEqual((94, 94, 4, 4), tuple(pyscreeze.locate('slash.png', 'haystack1.png'))) self.assertEqual((93, 93, 4, 4), tuple(pyscreeze.locate('slash.png', 'haystack2.png'))) self.assertEqual((94, 94, 4, 4), tuple( pyscreeze.locate('slash.png', 'haystack1.png', grayscale=True))) self.assertEqual((93, 93, 4, 4), tuple( pyscreeze.locate('slash.png', 'haystack2.png', grayscale=True))) self.assertEqual(None, pyscreeze.locate('slash.png', 'colornoise.png')) self.assertEqual( None, pyscreeze.locate('slash.png', 'colornoise.png', grayscale=True))
def test_locate_im_step(self): slashFp = open('slash.png' ,'rb') haystack1Fp = open('haystack1.png' ,'rb') haystack2Fp = open('haystack2.png' ,'rb') colorNoiseFp = open('colornoise.png' ,'rb') slashIm = Image.open(slashFp) haystack1Im = Image.open(haystack1Fp) haystack2Im = Image.open(haystack2Fp) colorNoiseIm = Image.open(colorNoiseFp) for step in range(1, 10): self.assertEqual(((94, 94, 4, 4), step), (tuple(pyscreeze.locate(slashIm, haystack1Im, step=step)), step)) self.assertEqual(((93, 93, 4, 4), step), (tuple(pyscreeze.locate(slashIm, haystack2Im, step=step)), step)) self.assertEqual(((94, 94, 4, 4), step), (tuple(pyscreeze.locate(slashIm, haystack1Im, grayscale=True, step=step)), step)) self.assertEqual(((93, 93, 4, 4), step), (tuple(pyscreeze.locate(slashIm, haystack2Im, grayscale=True, step=step)), step)) self.assertEqual((None, step), (pyscreeze.locate(slashIm, colorNoiseIm, step=step), step)) self.assertEqual((None, step), (pyscreeze.locate(slashIm, colorNoiseIm, grayscale=True, step=step), step)) slashFp.close() haystack1Fp.close() haystack2Fp.close() colorNoiseFp.close()