Извлеките или обрежьте определенную часть изображения, используя границы, полученные из информации об узле доступности вAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Извлеките или обрежьте определенную часть изображения, используя границы, полученные из информации об узле доступности в

Сообщение Anonymous »

Я разрабатываю приложение для Android для автоматизации ввода данных и заполнения капчи в другом приложении для Android. Я уже автоматизировал заполнение форм с помощью службы специальных возможностей Android, осталось только декодировать текст капчи из изображения капчи на экране.
Чтобы декодировать капчу, я выполняю следующие шаги:
Чтобы декодировать капчу, я выполняю следующие действия:
p>
  • С помощью медиапроекции Android сделайте полный снимок экрана мобильного телефона, на котором присутствует капча.

    Обрежьте захваченный снимок экрана, создав другой Растровое изображение из изображения, полученного на шаге 1 с помощью Bonds(rect.left,rect.top,rect.width,rect.height), полученного из узла доступности элемента captcha.
  • Передайте обрезанное изображение для декодирования капчи с помощью извлечения изображения в текст (OCR).
Проблема в том, что когда я создаю обрезанное изображение с помощью Bonds(rect.left,rect.top,rect.width,rect.height), полученные из узла доступности, я не могу захватить полную часть капчи.
Чтобы получить капчу-часть изображения, я я создаю другое изображение, используя 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»