Как сделать снимок экрана RGBA с кукловодом?

Я работаю над веб-приложением для сравнения изображений с кукловодом, и вот что я пытаюсь сделать:

  1. откройте страницу кукловода, перейдите на страницу рендеринга с помощью веб-компонента программы просмотра моделей (API веб-графики Google).
  2. визуализировать что-либо с помощью программы просмотра моделей
  3. сделайте снимок экрана rgba после завершения рендеринга (используйте page.screenshot ())
  4. закрыть страницу.
  5. возьмите снимок экрана в качестве аргумента API сравнения изображений (ввод должен быть либо типом буфера nodejs, либо файлом png)

Все работает хорошо, за исключением 3-го шага, потому что при использовании метода page.screenshot () выходной файл png имеет формат RGB, а не RGBA. Я не нашел способа сделать это, и вот два решения, которые я попробовал:

Решение 1: api средства просмотра моделей имеет встроенную функцию, называемую toBlob (), которая возвращает объект Blob со всеми данными RGBA необходимого мне компонента средства просмотра моделей. Я знаю, как преобразовать объект Blob в буфер, поэтому это должно сработать, если я получу объект Blob. Вот как я пытаюсь получить объект blob.

  const Blob = await page.evaluate(async () => {
    const modelViewer = document.querySelector('#modelViewer');
    const Blob = await (modelViewer as any).toBlob();
    //console.log(Blob) this shows a correct Blob object under puppteer browser's devtool

    // in order to return something, i have convert Blob object all the way to a unit8Array
    //const arrayBuffer = await new Response(Blob).arrayBuffer();
    //const unit8Array = new Uint8Array(arrayBuffer);

    return Blob;
  });

Проблема в том, что объект Blob, возвращенный из page.evaluate (), пуст. Я дважды проверил объект Blob внутри функции Assessment (), и он правильно зарегистрирован в devtool браузера Puppteer. Я думаю, что причина в том, что eval () требует, чтобы возвращаемое значение было сериализуемым, а объект Blob, возможно, нет. Чтобы вернуть что-то непустое в контекст приложения, мне нужно полностью преобразовать это в unit8Array. Но я не нашел способа преобразовать unit8Array в объект Buffer, и даже если он есть, я думаю, это может быть очень неэффективным, потому что объект Blob, содержащий всю информацию о пикселях, может быть очень большим и, вероятно, будет много вычислений. в процессе конвертации.

Решение 2: я думаю об использовании page.evaluateHandle () для получения jsHandle компонента просмотра модели и запуска goBlob в контексте моего приложения, исправьте меня, если я ошибаюсь, но я думаю, что jsHandle только предполагается использовать в контексте марионетки, не так ли? Так что это решение должно быть неправильным

Следовательно, можно ли улучшить какое-либо мое решение? Или есть решение получше? Спасибо !


person Jiaxin Sun    schedule 16.07.2020    source источник


Ответы (1)


Если вы хотите использовать инструменты для создания снимков экрана Puppeteer, рассматривали ли вы возможность изменить фон страницы и найти значение альфа алгебраически? Размещение цвета (r, g, b, a) на белом дает значение RGB (R W, G W, B W) = (ar + (1-a) 255, ag + (1-a) 255, ab + (1-a) 255)), а размещение его на черном дает (R B, G < sub> B, B B) = (ar, ag, ab). Затем вы можете найти исходное альфа-значение с помощью

R W - R B = (1 - a) 255

а = 1 - (R W - R B) / 255

а затем просто разделите (R B, G B, B B) на a, чтобы восстановить компоненты (r , г, б).

Значения RGB, которые вы читаете, округляются до целых чисел, что повлияет на точность, с которой вы можете определить альфа-значение, но это, вероятно, не имеет значения для практических модульных тестов.

person GKFX    schedule 21.07.2020