Есть ли какой-нибудь способ получить более прямой доступ к видеоконтенту MediaStreamTrack?
blockquote>Не в реальном времени, нет. W3C обсуждал добавление такого API в рабочих, но сегодня его не существует.
API-интерфейс MediaRecorder приближается: он может предоставлять вам большие двоичные данные с интервалом в несколько миллисекунд (см. start (timeslice) ), но не в реальном времени.
Это кажется очень неэффективным ...
blockquote>Современные браузеры имеют фоновые потоки, которые выполняют тяжелую работу, например, уменьшение масштаба, поэтому я бы предостерег от преждевременной оптимизации. В общем, вещи замедляются только тогда, когда биты массово открываются для основного потока JavaScript. Поэтому я меньше беспокоюсь о разрешении вашей камеры, чем о размере вашего холста.
Если вам нужно всего несколько пикселей для яркости, сделайте ваш холст очень маленьким. Накладные расходы должны быть низкими. Например, :
video.srcObject = await navigator.mediaDevices.getUserMedia({video: true}); await new Promise(r => video.onloadedmetadata = r); const ctx = canvas.getContext('2d'); requestAnimationFrame(function loop() { ctx.drawImage(video, 0, 0, 16, 12); requestAnimationFrame(loop); });
Если все еще возникают проблемы, я бы уменьшил частоту кадров.
Посмотрите на следующий код в этом файле:
http://pbin.oogly.co.uk/listings/viewlistingdetail/d6fe483a52c52aa951ca15762ed3d3
Пример приведен здесь:
http: // www .java2s.com / Code / Java / Swing-JFC / JTextPaneStylesExample3.htm
Похоже, что вы можете изменить стиль с помощью следующего в слушателе действия:
final Style boldStyle = sc.addStyle("MainStyle", defaultStyle);
StyleConstants.setBold(boldStyle, true);
doc.setCharacterAttributes(0, 10, boldStyle, true);
Он устанавливает стиль текста между заданным смещением и длина до определенного стиля.
См. Полную вставку для более подробной информации. Это должно исправить вашу проблему.
Я бы порекомендовал взглянуть на Java Tutorial от Sun о панелях редактора.
Вот фрагмент кода для вставки отформатированного «Hello World!» строка в JEditorPane
:
Document doc = yourEditorPane.getDocument();
StyleContext sc = new StyleContext();
Style style = sc.addStyle("yourStyle", null);
Font font = new Font("Arial", Font.BOLD, 18);
StyleConstants.setForeground(style, Color.RED);
StyleConstants.setFontFamily(style, font.getFamily());
StyleConstants.setBold(style, true);
doc.insertString(doc.getLength(), "Hello World!", style);
Хорошо, вау. Сложный вопрос. Поэтому я не нашел способа получить стиль данного персонажа. Однако вы можете получить MutableAttributeSet для данного символа и затем проверить, находится ли стиль в этом наборе атрибутов.
Style s; //your style
Element run = styledDocument.getCharacterElement(
textPane.getSelectionStart() );
MutableAttributeSet curAttr =
( MutableAttributeSet )run.getAttributes();
boolean containsIt = curAttr.containsAttributes( s );
Одна проблема с получением стиля для диапазона символов состоит в том, что может быть применено более одного стиля. к этому диапазону (пример: вы можете выбрать текст, где некоторые выделены жирным шрифтом, а некоторые нет).
Чтобы обновить выделенный текст, вы можете:
Style s; //your style
JTextPane textPane; //your textpane
textPane.setCharacterAttributes( s, false );
Ох, и получается, что функция getLogicalStyle не работает, потому что она возвращает стиль по умолчанию (или, может быть, просто стиль) для абзаца, который содержит p, а не стиль символа в p.
Самый простой способ манипулировать текстовыми панелями - это использовать наборы редактора и связанные с ними действия . Вы можете найти демонстрацию этого в JDK примерах (в jdk \ demo \ jfc \ Stylepad ).
Пример кода, который устанавливает StyledEditorKit и использует FontSizeAction для управления текстом:
public static void main(String[] args) {
// create a rich text pane
JTextPane textPane = new JTextPane();
JScrollPane scrollPane = new JScrollPane(textPane,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
// install the editor kit
StyledEditorKit editorKit = new StyledEditorKit();
textPane.setEditorKit(editorKit);
// build the menu
JMenu fontMenu = new JMenu("Font Size");
for (int i = 48; i >= 8; i -= 10) {
JMenuItem menuItem = new JMenuItem("" + i);
// add an action
menuItem
.addActionListener(new StyledEditorKit.FontSizeAction(
"myaction-" + i, i));
fontMenu.add(menuItem);
}
JMenuBar menuBar = new JMenuBar();
menuBar.add(fontMenu);
// show in a frame
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 400);
frame.setJMenuBar(menuBar);
frame.setContentPane(scrollPane);
frame.setVisible(true);
}
(Совет: если вы хотите использовать FontFamilyAction , посмотрите GraphicsEnvironment.getAvailableFontFamilyNames () и логические имена семейств шрифтов .)