рд╕реНрдХреНрд░реАрди рдХреИрдкреНрдЪрд░ рдПрдкреАрдЖрдИ рдХрд╛ рдкрд░рд┐рдЪрдп - рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ QR рдХреЛрдб рд╕реНрдХреИрди рдХрд░реЗрдВ

рдкрд░рд┐рдЪрдп


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕реНрдХреНрд░реАрди рдХреИрдкреНрдЪрд░ рдПрдкреАрдЖрдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдПрдкреАрдЖрдИ 2014 рдореЗрдВ рдкреИрджрд╛ рд╣реБрдЖ рдерд╛, рдФрд░ рдЗрд╕реЗ рдирдпрд╛ рдХрд╣рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдорд░реНрдерди рдЕрднреА рднреА рдХрд╛рдлреА рдХрдордЬреЛрд░ рд╣реИред рдлрд┐рд░ рднреА, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЬрд╣рд╛рдВ рдпрд╣ рд╕рдорд░реНрдерди рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред


рдЖрдкрдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд▓рд┐рдВрдХ:



рдпрджрд┐ рдбреЗрдореЛ рдХреЗ рд╕рд╛рде рд▓рд┐рдВрдХ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╛ рдпрджрд┐ рдЖрдк рд╡рд╣рд╛рдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд▓рд╕реА рд╣реИрдВ) - рддреЛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдорд╛рдкреНрдд рдбреЗрдореЛ рдХреИрд╕реЗ рджрд┐рдЦрддрд╛ рд╣реИ:



рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред


рдкреНрд░реЗрд░рдгрд╛


рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореИрдВ рдПрдХ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд▓реЗрдХрд░ рдЖрдпрд╛ рд╣реВрдВ рдЬреЛ рдЕрдкрдиреЗ рдХрд╛рдо рдореЗрдВ рдХреНрдпреВрдЖрд░ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдпрджреНрдпрдкрд┐ рд╡реЗ рдЖрдорддреМрд░ рдкрд░ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рд▓рдВрдмреЗ рд▓рд┐рдВрдХ, рдЬрд╣рд╛рдВ рдЖрдк рдлреЛрди рдкрд░ рдЙрдиреНрд╣реЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд░ рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред рдпрджрд┐ QR рдХреЛрдб рдЙрд╕реА рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рд╕реНрдХреНрд░реАрди рдкрд░ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдкрд╣рдЪрд╛рди рдХреЗ рд▓рд┐рдП рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЧрдбрд╝рдмрдбрд╝ рдХрд░рдиреЗ рдпрд╛ рдЗрд╕реЗ рдлреЛрди рд╕реЗ рдкрд╣рдЪрд╛рдирдиреЗ рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рдкреАрд╕реА рдкрд░ рд╡рд╛рдкрд╕ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрд╕рд╣рдЬред


рдХреБрдЫ рдЙрддреНрдкрд╛рдж, рдЬреИрд╕реЗ 1Password , рдореЗрдВ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕рдорд╛рдзрд╛рди рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдХреНрдпреВрдЖрд░ рдХреЛрдб рд╕реЗ рдПрдХ рдЦрд╛рддрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╡реЗ рдПрдХ рдкрд╛рд░рджрд░реНрд╢реА рдЦрд┐рдбрд╝рдХреА рдЦреЛрд▓рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдк рдХреЛрдб рдХреЗ рд╕рд╛рде рдЫрд╡рд┐ рдкрд░ рдЦреАрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реИред рдпрд╣рд╛рдБ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:



рдпрд╣ рдЖрджрд░реНрд╢ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдорд╛рди рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдпрд╣ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ ...


рдорд┐рд▓рдирд╛ - getDisplayMedia


рдЦреИрд░, рд▓рдЧрднрдЧред рдпрд╣рд╛рдВ рд╕реНрдХреНрд░реАрди рдХреИрдкреНрдЪрд░ рдПрдкреАрдЖрдИ рдЗрд╕рдХреА рдПрдХрдорд╛рддреНрд░ getDisplayMedia рдкрджреНрдзрддрд┐ рд╕реЗ getDisplayMedia ред getDisplayMedia рдЕрдкрдиреЗ рдХреИрдорд░реЗ рдХреЗ рдмрдЬрд╛рдп рдХреЗрд╡рд▓ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реНрдХреНрд░реАрди рдХреЗ рд▓рд┐рдП getDisplayMedia рдХреА рддрд░рд╣ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдорд░реНрдерди, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреИрдорд░реЗ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдкрдХ рд╣реИред рдПрдордбреАрдПрди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЖрдк рдЗрд╕реЗ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕, рдХреНрд░реЛрдо, рдПрдЬ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЧрд▓рдд рдЬрдЧрд╣ рдкрд░ рд╣реИ - navigator рдореЗрдВ рд╕рд╣реА рд╣реИ, рдФрд░ navigator.mediaDevices рдореЗрдВ рдирд╣реАрдВ navigator.mediaDevices ) + рдПрдЬ рдореЛрдмрд╛рдЗрд▓ рдФрд░ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдУрдкреЗрд░рд╛ред


рдЕрдкреЗрдХреНрд╖рд┐рдд рдмрд┐рдЧ рдЯреВ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдореЛрдмрд╛рдЗрд▓ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрддреНрд╕реБрдХ рдЪрдпрдиред


рдПрдкреАрдЖрдИ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИред рдпрд╣ getUserMedia рдХреЗ рд╕рдорд╛рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рджрд░реНрд╢рди рд╕рддрд╣реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ :


  • рдореЙрдирд┐рдЯрд░ (рд╕рдВрдкреВрд░реНрдг рд╕реНрдХреНрд░реАрди) рд╕реЗ,
  • рдПрдХ рдЦрд┐рдбрд╝рдХреА рдпрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЖрд╡реЗрджрди рдХреЗ рд╕рднреА рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рд╕реЗ,
  • рдХрд┐рд╕реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ , рдпрд╛ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реЗред рдХреНрд░реЛрдо рдореЗрдВ, рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдПрдХ рдЕрд▓рдЧ рдЯреИрдм рд╣реИ, рд▓реЗрдХрд┐рди FF рдореЗрдВ рдРрд╕рд╛ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдкреАрдЖрдИ, рдЬреЛ рдЖрдкрдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рдкрд░реЗ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ ... рдпрд╣ рдкрд░рд┐рдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдЖрдорддреМрд░ рдкрд░ рдХреБрдЫ рдкрд░реЗрд╢рд╛рдирд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЭреБрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдХрд╛рдлреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рдЕрдиреНрдп рд╡рд┐рдВрдбреЛ рд╕реЗ рдЪрд┐рддреНрд░ рдХреИрдкреНрдЪрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Google Translate Camera рдЬреИрд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдкрд╣рдЪрд╛рди рдФрд░ рдЕрдиреБрд╡рд╛рдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЦреИрд░, рдФрд░ рд╢рд╛рдпрдж рдХрдИ рдФрд░ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рдЙрдкрдпреЛрдЧ рд╣реИрдВред


рд╣рдо рдЬрдорд╛ рдХрд░рддреЗ рд╣реИрдВ


рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдЙрди рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬреЛ рдПрдкреАрдЖрдИ рд╣рдореЗрдВ рджреЗрддрд╛ рд╣реИред рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ?


рдФрд░ рдлрд┐рд░ рд╣рдореЗрдВ рдЗрд╕ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдЙрди рдЫрд╡рд┐рдпреЛрдВ рд╕реЗ рдЖрдЧреЗ рдирд┐рдХрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЬрд┐рди рдкрд░ рд╣рдо рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо <video> , <canvas> рддрддреНрд╡реЛрдВ рдФрд░ рдХреБрдЫ рдФрд░ рдЬреЗрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред


рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдПрдХ рдХреНрд▓реЛрдЬрд╝-рдЕрдк рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


  • <video> рд▓рд┐рдП рдбрд╛рдпрд░реЗрдХреНрдЯ рд╕реНрдЯреНрд░реАрдо;
  • рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде <video> рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ <canvas> рдореЗрдВ рдЦреАрдВрдЪреЗрдВ;
  • getImageData 2D рд╕рдВрджрд░реНрдн рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ <canvas> рд╕реЗ рдПрдХ ImageData рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реАрдЬрд┐рдПред

рдЗрддрдиреА рд▓рдВрдмреА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдХрд╛рд░рдг рдпрд╣ рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдереЛрдбрд╝реА рдЕрдЬреАрдм рд▓рдЧ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рдзрд┐ рдХрд╛рдлреА рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ getUserMedia рдореЗрдВ рд╡реЗрдмрдХреИрдо рд╕реЗ рдбреЗрдЯрд╛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред


рдзрд╛рд░рд╛ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рдЗрд╕рд╕реЗ рдлреНрд░реЗрдо рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рд░ рдЪреАрдЬ рдХреЛ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдорд╛рдирддреЗ рд╣реБрдП, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 async function run() { const video = document.createElement('video'); const canvas = document.createElement('canvas'); const context = canvas.getContext('2d'); const displayMediaOptions = { video: { cursor: "never" }, audio: false } video.srcObject = await navigator.mediaDevices.getDisplayMedia(displayMediaOptions); const videoTrack = video.srcObject.getVideoTracks()[0]; const { height, width } = videoTrack.getSettings(); context.drawImage(video, 0, 0, width, height); return context.getImageData(0, 0, width, height); } await run(); 

рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдкрд╣рд▓реЗ рд╣рдо <video> рдФрд░ <canvas> рддрддреНрд╡ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдХреИрдирд╡рд╛рд╕ рдХреЛ 2 рдбреА рд╕рдВрджрд░реНрдн ( CanvasRenderingContext2D ) рдХреЗ рд▓рд┐рдП CanvasRenderingContext2D ред


рддрдм рд╣рдо рдкреНрд░рд╡рд╛рд╣ рдкреНрд░рддрд┐рдмрдВрдз / рд╢рд░реНрддреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ ред рдХреИрдорд░реЗ рдХреА рдзрд╛рд░рд╛рдУрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╣реИрдВред рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХрд░реНрд╕рд░ рдирд╣реАрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдореЗрдВ рдСрдбрд┐рдпреЛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рд▓реЗрдЦрди рдХреЗ рд╕рдордп, рдСрдбрд┐рдпреЛ рдХреИрдкреНрдЪрд░ рдЕрднреА рднреА рдХрд┐рд╕реА рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред


рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо <video> рддрддреНрд╡ рдХреЗ рд▓рд┐рдП MediaStream рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рд╛рдкреНрдд рд╕реНрдЯреНрд░реАрдо рдХреЛ рд╣реБрдХ рдХрд░рддреЗ рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ getDisplayMedia рдПрдХ рд╡рд╛рджрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред


рдЕрдВрдд рдореЗрдВ, рд╕реНрдЯреНрд░реАрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рд╕реЗ, рд╣рдореЗрдВ рд╡реАрдбрд┐рдпреЛ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдпрд╛рдж рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрдирд╡рд╛рд╕ рдкрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдлреНрд░реЗрдо рдХреЛ рдбреНрд░рд╛ рдХрд░реЗрдВ рдФрд░ ImageData рд╕реЗ рдЗрдореЗрдЬрдбреЗрдЯрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓реЗрдВред


рдкреВрд░реНрдг рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдПрдХ рдмрд╛рд░ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд▓реВрдк рдореЗрдВ рдлреНрд░реЗрдо рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЖрдк рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рдлреНрд░реЗрдо рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдЫрд╡рд┐ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред рдФрд░ рдпрд╣рд╛рдБ рдХреБрдЫ рд╢рдмреНрджреЛрдВ рдХреЛ рдХрд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рдЬрдм рдмрд╛рдд рдЖрддреА рд╣реИ "рдПрдХ рдирд┐рд░рдВрддрд░ рд▓реВрдк рдореЗрдВ рдбреЛрдо рдореЗрдВ рдХреБрдЫ рд╕рдВрднрд╛рд▓рдиреЗ" рдХреА, рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рдорди рдореЗрдВ рдЖрддреА рд╣реИ рд╡рд╣ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ requestAnimationFrame ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ред рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдЯреИрдм рд╕рдХреНрд░рд┐рдп рд╣реЛрдирд╛ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ - рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЖрд░рдПрдПрдл рд▓реВрдк рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд░реЛрдХрддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЗрд╕ рд╕рдордп рд╣реИ рдХрд┐ рд╣рдо рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред


рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рдЖрд░рдПрдПрдл рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ рд╕реЗрдЯрдЗрдВрдЯрд░рд╡рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдЪреАрдЬреЗрдВ рдЙрд╕рдХреЗ рд╕рд╛рде рдЗрддрдиреА рд╕рд╣рдЬ рдирд╣реАрдВ рд╣реИрдВред рдПрдХ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдЯреИрдм рдореЗрдВ, рдХреЙрд▓рдмреИрдХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░рд╛рд▓ рдХрдо рд╕реЗ рдХрдо 1 рд╕реЗрдХрдВрдб рд╣реИ ред рдлрд┐рд░ рднреА, рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред


рдЕрдВрдд рдореЗрдВ, рдЬрдм рд╣рдо рдлрд╝реНрд░реЗрдо рдкрд░ рдкрд╣реБрдБрдЪрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕ рдбреЗрдореЛ рдХреЗ рдкреНрд░рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо jsQR рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ: рдЗрдирдкреБрдЯ ImageData рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЫрд╡рд┐ рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИред рдпрджрд┐ рдкреНрд░рд╛рдкреНрдд рдЫрд╡рд┐ рдореЗрдВ рдПрдХ QR рдХреЛрдб рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ JS рдСрдмреНрдЬреЗрдХреНрдЯ рдорд┐рд▓реЗрдЧрд╛ред
рдЖрдЗрдП рдХреЛрдб рдХреЗ рдХреБрдЫ рдФрд░ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдкреВрд░рдХ рдХрд░реЗрдВ:


 const imageData = await run(); const code = jsQR(imageData.data, streamWidth, streamHeight); 

рд╣реЛ рдЧрдпрд╛!


NPM


рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдкреАрдЫреЗ рдХрд╛ рдореБрдЦреНрдп рдХреЛрдб рдПрдХ npm рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдкреИрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдмрд╛рдж рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдХреБрдЫ рд╕рдордп рдмрдЪрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдЗрд╕ рд╕реНрддрд░ рдкрд░ рдпрд╣ рдХреЗрд╡рд▓ рдХреЙрд▓рдмреИрдХ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ ImageData рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреА рдЖрд╡реГрддреНрддрд┐ рд╣реИред рд╕рднреА рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЬреЛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЕрдкрдиреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред


рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ stream-display рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ: рдПрдирдкреАрдПрдо | рдЧрд┐рдердм ред


рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд╕реНрддреБрддрдГ рдХреЛрдб рдХреА рддреАрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдФрд░ рдПрдХ рдХреЙрд▓рдмреИрдХ рдореЗрдВ рдШрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


 const callback = imageData => {...} // do whatever with those images const capture = new StreamDisplay(callback); // specify where the ImageData will go await capture.startCapture(); // when ready capture.stopCapture(); // when done 

рдпрд╣рд╛рдВ рдбреЗрдореЛ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рддреНрд╡рд░рд┐рдд рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрдбрдкреЗрди рд╕рдВрд╕реНрдХрд░рдг рднреА рд╣реИред рджреЛрдиреЛрдВ рдЙрджрд╛рд╣рд░рдг рдЙрдкрд░реЛрдХреНрдд рдПрдирдкреАрдПрдо рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред


рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛


рдЗрд╕ рдХреЛрдб рдХреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдкреИрдХ рдХрд░рддреЗ рд╣реБрдП, рдореБрдЭреЗ рдпрд╣ рд╕реЛрдЪрдирд╛ рдерд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдореИрдВ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдЗрд╕рдореЗрдВ рдХреБрдЫ рдЫреЛрдЯреЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП 50 рдПрдордмреА рдХрд╛ рд╣реЗрдбрд▓реЗрд╕ рдХреНрд░реЛрдо рдЦреАрдВрдЪреЗрдВред рдФрд░ рдпрджреНрдпрдкрд┐ рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдЯрдмреНрд╕ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдмрд╣реБрдд рджрд░реНрджрдирд╛рдХ рд▓рдЧ рд░рд╣рд╛ рдерд╛, рдЕрдВрдд рдореЗрдВ рдореИрдВрдиреЗ рдРрд╕рд╛ рдХрд┐рдпрд╛ред
рдкрд░реАрдХреНрд╖рдг рдзрд╛рд╡рдХ рдХреЗ рд░реВрдк рдореЗрдВ, tape рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣рд╛рдБ рдореБрдЭреЗ рдЖрдЦрд┐рд░рдХрд╛рд░ рдЕрдиреБрдХрд░рдг рдХрд░рдирд╛ рд╣реИ:


  • document рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ DOM рддрддреНрд╡ред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ jsdom рд▓рд┐рдпрд╛;
  • рдХреБрдЫ jsdom рд╡рд┐рдзрд┐рдпрд╛рдБ рдЬрд┐рдирдореЗрдВ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЕрднрд╛рд╡ рд╣реИ: HTMLMediaElement#play , HTMLCanvasElement#getContext рдФрд░ navigator.mediaDevices#getDisplayMedia ;
  • рд╕рдордпред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ useFakeTimers рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬреЛ рд╣реБрдб рдХреЙрд▓ lolex рддрд╣рдд рд╣реИред рдпрд╣ рдЕрдкрдиреА рдЬрдЧрд╣ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ requestAnimationFrame , requestAnimationFrame рдФрд░ рдХрдИ рдЕрдиреНрдп рдХрд╛рд░реНрдп рдЬреЛ рд╕рдордп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдкрдХреЛ рдЗрд╕ рдирдХрд▓реА рд╕рдордп рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рднреА рджреЗрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ: jsdom рдЕрдкрдиреА рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдПрдХ рд╕реНрдерд╛рди рдкрд░ рд╕рдордп рдмреАрддрдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ sinon рдЪрд╛рд▓реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рдЬрдо рдЬрд╛рдПрдЧрд╛ред

рдореИрдВрдиреЗ рд╕рднреА рдлрд╝рдВрдХреНрд╢рди рд╕реНрдЯрдмреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрдиреЙрди рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬрд┐рдирдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдмрд╛рдХреА рдЦрд╛рд▓реА рдЬреЗрдПрд╕ рдХрд╛рд░реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред


рдмреЗрд╢рдХ, рдЖрдк рдЙрди рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд╕рд╛рде рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВред рд▓реЗрдХрд┐рди, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд╕реВрдЪреА рдЖрдкрдХреЛ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред


рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рднрдВрдбрд╛рд░ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рд╕реБрдВрджрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред


рдирд┐рд╖реНрдХрд░реНрд╖


рд╕рдорд╛рдзрд╛рди рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдкрд╛рд░рджрд░реНрд╢реА рдЦрд┐рдбрд╝рдХреА рдХреЗ рд░реВрдк рдореЗрдВ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдЗрд╕ рджрд┐рди рд╡реЗрдм рдЖрдПрдЧрд╛ред рдХреЛрдИ рдХреЗрд╡рд▓ рдпрд╣ рдЖрд╢рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЕрдкрдиреА рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦрдирд╛ рд╕реАрдЦреЗрдВрдЧреЗ - рдЗрди рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рд╕рдЦреНрддреА рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдмреАрдЪ, рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЬрдм рдЖрдк рдХреНрд░реЛрдо рдореЗрдВ рд╕реНрдХреНрд░реАрди рдХреЛ рдлреБрд▓ рдХрд░рддреЗ рд╣реИрдВ - рддреЛ рдЗрд╕реЗ рдкрд╛рд░реНрд╕, рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЖрджрд┐ред рдЗрд╕рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдЕрдзрд┐рдХ рдЕрдлрд╡рд╛рд╣ рди рдХрд░реЗрдВ!


рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдмрд╛рдж рдХрд┐рд╕реА рдиреЗ рдЦреБрдж рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рдЪрд╛рд▓ рд╕реАрдЦреА рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдФрд░ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВред рдФрд░ рдЬрд▓реНрдж рд╣реА рдорд┐рд▓рддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/hi460825/


All Articles