Чтобы декодировать капчу, я выполняю следующие шаги:
Чтобы декодировать капчу, я выполняю следующие действия:
p>
- С помощью медиапроекции Android сделайте полный снимок экрана мобильного телефона, на котором присутствует капча.
Обрежьте захваченный снимок экрана, создав другой Растровое изображение из изображения, полученного на шаге 1 с помощью Bonds(rect.left,rect.top,rect.width,rect.height), полученного из узла доступности элемента captcha. - Передайте обрезанное изображение для декодирования капчи с помощью извлечения изображения в текст (OCR).
Чтобы получить капчу-часть изображения, я я создаю другое изображение, используя Bonds(rect.left,rect.top,rect.width,rect.height), полученное из узла доступности, но оно не захватывает необходимую часть изображения.
Найдите элемент и получил границы элемента капчи с помощью приведенного ниже кода из accessibilityNodeInfo (MyAccessibilityService.java)
List findAccessibilityNodeInfosCaptchas = accessibilityNodeInfo.findAccessibilityNodeInfosByViewId("app.package.name:id/captcha");
if (findAccessibilityNodeInfosCaptchas.size() > 0) {
Rect rect = new Rect(0,0,0,0);
findAccessibilityNodeInfosCaptchas.get(0).getBoundsInScreen(rect);
Log.d(strTag,"Rect"+rect);
ScreenCaptureService.rectleft = rect.left;
ScreenCaptureService.rectTop = rect.top;
ScreenCaptureService.rectWidth = rect.width();
ScreenCaptureService.rectHeight = rect.height();
}
Сделайте полный снимок экрана с помощью Media Projection
Скриншот экрана мобильного устройства
обрезанное изображение
Код для скриншота и обрезки изображения ниже (ScreenCaptureService.java)
Размер экрана 1080X2285
Rect(162, 992 - 502, 1090)
public void onImageAvailable(ImageReader reader) {
FileOutputStream fos = null;
Bitmap bitmap = null;
Bitmap bitmapTmp = null;
stopProjection();
try (Image image = mImageReader.acquireLatestImage()) {
if (image != null) {
Image.Plane[] planes = image.getPlanes();
ByteBuffer buffer = planes[0].getBuffer();
int pixelStride = planes[0].getPixelStride();
int rowStride = planes[0].getRowStride();
int rowPadding = rowStride - pixelStride * mWidth;
Log.d("DebugApp", "onImageAvailable");
// create bitmap
bitmap = Bitmap.createBitmap(mWidth + rowPadding / pixelStride, mHeight, Bitmap.Config.ARGB_8888);
bitmap.copyPixelsFromBuffer(buffer);
// write bitmap to a file
fos = new FileOutputStream(mStoreDir + "/myscreen_" + IMAGES_PRODUCED + ".png");
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
/// create cropped image of captcha page
//bitmapTmp = Bitmap.createBitmap(bitmap,162,992,502,1090);
Log.d("DebugApp", "left top width height " + ScreenCaptureService.rectleft + ":" + ScreenCaptureService.rectTop + ":" + ScreenCaptureService.rectWidth + ":" + ScreenCaptureService.rectHeight);
bitmapTmp = Bitmap.createBitmap(bitmap,
ScreenCaptureService.rectleft,
ScreenCaptureService.rectTop,
ScreenCaptureService.rectWidth,
ScreenCaptureService.rectHeight);
// write bitmap to a file
fos = new FileOutputStream(mStoreDir + "/myscreen_tmp" + IMAGES_PRODUCED + ".png");
bitmapTmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
///
IMAGES_PRODUCED++;
Log.e("DebugApp", "captured image: " + IMAGES_PRODUCED);
//stopProjection();
}
} catch (Exception e) {
e.printStackTrace();
Log.d("DebugApp", "Exp " + e.toString());
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
if (bitmap != null) {
bitmap.recycle();
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... essibility