Как делать скриншоты в ElectronJS?
ElectronJS - это платформа с открытым исходным кодом, используемая для создания кроссплатформенных нативных настольных приложений с использованием веб-технологий, таких как HTML, CSS и JavaScript, которые могут работать в операционных системах Windows , macOS и Linux. Он объединяет движок Chromium и NodeJS в единую среду выполнения.
Electron поддерживает создание файлов PDF и печать файлов с веб-страницы в настольных приложениях. Наряду с этими функциями, Electron также предоставляет способ, с помощью которого мы можем делать снимки экрана веб-страницы и сохранять их в виде файла изображения в собственной системе, используя методы экземпляра объекта BrowserWindow и свойство webContents. Electron внутренне обрабатывает изображения с помощью класса NativeImage, поэтому нам также требуются методы Instance модуля nativeImage для преобразования соответствующего NativeImage в формат PNG или JPEG , прежде чем они могут быть сохранены в собственной системе. Для сохранения файлов в собственной системе мы будем использовать методы экземпляра диалогового модуля в Electron. В этом руководстве будет показано, как делать снимки экрана веб-страницы в Electron и сохранять их в собственной системе.
Мы предполагаем, что вы знакомы с предварительными условиями, описанными в вышеупомянутой ссылке. Для работы Electron в системе должны быть предварительно установлены node и npm.
Пример: следуйте инструкциям, приведенным в разделе «Создание PDF в ElectronJS», чтобы настроить базовое приложение Electron. Скопируйте код Boilerplate для файлов main.js и index.html, как указано в статье. Также внесите необходимые изменения, упомянутые в файле package.json, чтобы запустить приложение Electron. Мы продолжим создавать наше приложение, используя ту же кодовую базу. Основные шаги, необходимые для настройки приложения Electron, остаются прежними.
package.json:
{ "имя": "электрон-скриншот", "версия": "1.0.0", "description": "Скриншот в электронном", "main": "main.js", "scripts": { "старт": "электрон". }, "ключевые слова": [ "электрон" ], «автор»: «Радхеш Ханна», "лицензия": "ISC", "dependencies": { "электрон": "^ 8.3.0" } }
Создайте папку с активами в соответствии со структурой проекта. Мы будем использовать папку с ресурсами в качестве пути по умолчанию для хранения снимков экрана, сделанных приложением.
Вывод: На этом этапе настроено наше основное электронное приложение. После запуска приложения мы должны увидеть следующий результат.
Скриншот в Electron: BrowserWindow Instance, webContents Свойство и диалог модуль является частью основного процесса. Чтобы импортировать и использовать объект BrowserWindow и диалоговый модуль в процессе визуализации , мы будем использовать удаленный модуль Electron.
index.html : добавьте в этот файл следующий фрагмент. Кнопка « Сделать снимок экрана» еще не имеет связанных с ней функций. Чтобы изменить это, добавьте следующий код в файл index.js.
html
< h3 >Screenshot of Page in Electron</ h3 > < button id = "screenshot" > Take Screenshot </ button > |
index.js : добавьте в этот файл следующий фрагмент.
javascript
const electron = require( "electron" ); const BrowserWindow = electron.remote.BrowserWindow; const path = require( "path" ); const fs = require( "fs" ); // Importing dialog module using remote const dialog = electron.remote.dialog; // let win = BrowserWindow.getAllWindows()[0]; let win = BrowserWindow.getFocusedWindow(); var screenshot = document.getElementById( "screenshot" ); screenshot.addEventListener( "click" , (event) => { win.webContents .capturePage({ x: 0, y: 0, width: 800, height: 600, }) .then((img) => { dialog .showSaveDialog({ title: "Select the File Path to save" , // Default path to assets folder defaultPath: path.join(__dirname, "../assets/image.png" ), // defaultPath: path.join(__dirname, // '../assets/image.jpeg'), buttonLabel: "Save" , // Restricting the user to only Image Files. filters: [ { name: "Image Files" , extensions: [ "png" , "jpeg" , "jpg" ], }, ], properties: [], }) .then((file) => { // Stating whether dialog operation was // cancelled or not. console.log(file.canceled); if (!file.canceled) { console.log(file.filePath.toString()); // Creating and Writing to the image.png file // Can save the File as a jpeg file as well, // by simply using img.toJPEG(100); fs.writeFile(file.filePath.toString(), img.toPNG(), "base64" , function (err) { if (err) throw err; console.log( "Saved!" ); }); } }) . catch ((err) => { console.log(err); }); }) . catch ((err) => { console.log(err); }); }); |
Объяснение: Метод экземпляра win.webContents.capturePage (rectangle) просто делает снимок экрана веб-страницы, заданной объектом прямоугольника. Отсутствие прямоугольного объекта захватит всю видимую веб-страницу, то есть весь видимый экземпляр BrowserWindow. Он принимает следующие параметры.
- rectangle: Object (Необязательно) Объект прямоугольника . Он состоит из следующих параметров, которые необходимы для определения прямоугольника и его положения на веб-странице / экране.
- x: Integer Координата X начала прямоугольника. В этом случае координата X представляет собой координату веб-страницы / экрана, которую необходимо захватить.
- y: Integer Координата Y начала прямоугольника. В этом случае координата Y представляет собой координату веб-страницы / экрана, которую нужно захватить.
- width: Integer Ширина прямоугольника. В этом случае он представляет собой ширину веб-страницы / экрана, которую нужно захватить.
- height: Integer Высота прямоугольника. В этом случае он представляет собой высоту веб-страницы / экрана, которую нужно захватить.
Метод экземпляра win.webContents.capturePage () возвращает Promise и разрешается с экземпляром NativeImage при успешном создании снимка экрана. Нам нужно преобразовать этот экземпляр NativeImage в JPEG или PNG, используя методы экземпляра модуля nativeImage, прежде чем его можно будет сохранить в собственной системе.
- image.toPNG (options) Этот метод экземпляра преобразует экземпляр NativeImage в формат PNG , возвращая буфер NodeJS, содержащий данные изображения в кодировке PNG. Мы будем использовать буфер, возвращаемый этим методом, для записи изображения в файл .png, как показано в коде с использованием модуля fs. Кодировка по умолчанию для файла PNG будет base64 . Он принимает следующие параметры.
- options: Object (Необязательно) Объект options состоит из одного параметра, то есть scaleFactor: Double (Необязательно), представляющего коэффициент масштабирования (масштабирование) изображения. По умолчанию принято значение 1.0 .
- image.toJPEG (качество) Этот метод экземпляра преобразует экземпляр NativeImage в формат JPEG , возвращая буфер NodeJS, содержащий данные изображения в кодировке JPEG. Мы будем использовать буфер, возвращаемый этим методом, для записи изображения в файл .jpeg, как показано в коде с использованием модуля fs. Кодировка по умолчанию для файла JPEG будет base64 . Он принимает следующие параметры.
- quality: Integer Это значение не может быть пустым. Может принимать значение от 0 до 100 . Это значение представляет собой коэффициент качества изображения, где 0 - самое низкое качество, а 100 - самое высокое качество изображения.
Метод экземпляра dialog.showSaveDialog (options) модуля диалогового окна используется для взаимодействия с собственной файловой системой, чтобы открыть диалоговое окно системы для сохранения файлов на локальном компьютере путем выборки пути к файлу, указанного пользователем. По умолчанию мы указываем путь к папке с ресурсами и сохраняем файл изображения в формате PNG с именем image.png . Дополнительные сведения о том, как ограничить пользователя форматами PNG / JPEG и свойствах метода dialog.showSaveDialog () , см. В разделе «Сохранение файлов в ElectronJS».
Чтобы получить текущий экземпляр BrowserWindow в процессе рендеринга, мы можем использовать некоторые статические методы, предоставляемые объектом BrowserWindow.
- BrowserWindow.getAllWindows (): этот метод возвращает массив активных / открытых экземпляров BrowserWindow. В этом приложении у нас есть только один активный экземпляр BrowserWindow, и на него можно напрямую ссылаться из массива, как показано в коде.
- BrowserWindow.getFocusedWindow (): этот метод возвращает экземпляр BrowserWindow, который сфокусирован в приложении. Если текущий экземпляр BrowserWindow не найден, возвращается значение null . В этом приложении у нас есть только один активный экземпляр BrowserWindow, и на него можно напрямую ссылаться с помощью этого метода, как показано в коде.
Выход: