рд╣рдо Node.js рдкрд░ рд╕реБрдВрджрд░ рдПрд╕рд╡реАрдЬреА рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ


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


рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЗрдЦреЛрдВ рдореЗрдВ, рд╣рд░ рдХреЛрдИ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддрд╛ рд╣реИ, рдХрд┐ рдЗрди рд╕рднреА рдареВрдВрда рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдЗрди-рд▓рд╛рдЗрди рдкреГрд╖реНрдареЛрдВ рдореЗрдВ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЖрдЬ рд╣рдо рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреИрд╕реЗ рдЖрдк Node.js. рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рд╛рдж рдФрд░ рд░рдВрдЧ рдореЗрдВ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдПрд╕рд╡реАрдЬреА рдЫрд╡рд┐рдпреЛрдВ рд╕реЗ рд╣реИрдВрдбрд▓рдмрд╛рд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рднрд░реЗрдВрдЧреЗ, рд░рдВрдЧ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдзрд╛рд░рдг рдврд╛рд▓ рдпрд╛ рддреНрд░рд┐рдХреЛрдгрд╛рд╕рди, рд╡реЛрд░реЛрдиреЛрдИ рдореЛрдЬрд╝реЗрдХ рдФрд░ рдлрд┐рд▓реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪрд░рдгреЛрдВ рдореЗрдВ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЖрд▓реЗрдЦ рдЙрди рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдЬреЛ рдЗрд╕ рдмрд╛рдд рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреБрднрд╡реА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдкрд╕рдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдЯреНрд░реЗрдирд┐рдВрдЧ


рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдирдкреАрдПрдо рдирд╛рдордХ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рдорд╛рдиреЛрдВ рдХреЗ рдПрдХ рдЕрдерд╛рд╣ рднрдВрдбрд╛рд░ рдореЗрдВ рдЬрд╛рдПрдВрдЧреЗред рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реА рдареВрдВрда рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ (рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдбреЗрд╡рд▓рдкрд░ рдХреА рдорд╢реАрди рдкрд░, рдпрджрд┐ рд╣рдо рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рд╕реНрдереИрддрд┐рдХ рд╕рд╛рдЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ), рддреЛ рд╣рдо рд╕рдордпрдкреВрд░реНрд╡ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд╕рд╛рде рд╕реМрджрд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рд╣рдо рд╣рд░ рдЙрд╕ рдЪреАрдЬ рд╕реЗ рдЬреБрдбрд╝реЗрдВрдЧреЗ рдЬреЛ рд╣рдореЗрдВ рдкрд╕рдВрдж рд╣реИред рддреЛ, рд╣рдо npm init рдордВрддреНрд░ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдЪрдпрди рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред


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


 npm i --save color-thief 

рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд рдЗрд╕ рдкреИрдХреЗрдЬ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп, рдПрдХ рд╕рдорд╕реНрдпрд╛ рдереА - рдХреБрдЫ рдЧрд╛рдпрдм рдХреИрд░реЛ рдкреИрдХреЗрдЬ, рдЬреЛ рдПрдирдкреАрдПрдо рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдЕрдЬреАрдм рддреНрд░реБрдЯрд┐ рдХреЛ рдХреБрдЫ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:


 sudo apt install libcairo2-dev libjpeg-dev libgif-dev 

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


 npm i --save rgb-hex 

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

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


 npm i --save image-size 

рдЪреВрдВрдХрд┐ рд╣рдо рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╡реЗ рд╕рднреА рдПрд╕рд╡реАрдЬреА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╣реЛрдВрдЧреЗ, рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рдЙрдирдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХрд╛ рдПрдХ рдФрд░ рд╕рд╡рд╛рд▓ рдЙрдареЗрдЧрд╛ред рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЬреЗрдПрд╕ рдореЗрдВ рдкреИрдЯрд░реНрди рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдЪрдХрдорд╛ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдХреНрдпреЛрдВ? "рд╕рд╛рдорд╛рдиреНрдп" рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рд▓реЗрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣реИрдВрдбрд▓рдмрд╛рд░ ред рд╕рд░рд▓ рдФрд░ рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯ, рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рд╕рд╣реА рд╣реЛрдЧрд╛ред


 npm i --save handlebars 

рд╣рдо рддреБрд░рдВрдд рдЗрд╕ рдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдЬрдЯрд┐рд▓ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рд╣рдо main.js рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдВ рдЕрдкрдиреА рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбреНрдпреВрд▓ рднреА рдмрдирд╛рддреЗ рд╣реИрдВред


 const ColorThief = require('color-thief'); const Handlebars = require('handlebars'); const rgbHex = require('rgb-hex'); const sizeOf = require('image-size'); const fs = require('fs'); 

ColorThief рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ


 const thief = new ColorThief(); 

рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдХрдиреЗрдХреНрдЯ рдХреА рдЧрдИ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, "рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдПрдХ рддрд╕реНрд╡реАрд░ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛" рдФрд░ "рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛" рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЪрд┐рддреНрд░ рд╣реИ редjpg:


 const image = fs.readFileSync('1.jpg'); const size = sizeOf('1.jpg'); const height = size.height; const width = size.width; 

Node.js рд╕реЗ рдЕрдкрд░рд┐рдЪрд┐рдд рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрд╣рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд▓рдЧрднрдЧ рд╕рднреА рдЪреАрдЬреЗрдВ рд╕рдордХрд╛рд▓рд┐рдХ рдпрд╛ рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдирд╛рдо рдХреЗ рдЕрдВрдд рдореЗрдВ "рд╕рд┐рдВрдХ" рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЬрдЯрд┐рд▓рддрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рди рдХрд░реЗрдВ рдФрд░ рд╣рдорд╛рд░реЗ рджрд┐рдорд╛рдЧ рдХреЛ рдиреАрд▓реЗ рд░рдВрдЧ рд╕реЗ рдмрд╛рд╣рд░ рди рдХрд░реЗрдВред


рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред


рд░рдВрдЧ рднрд░рдирд╛



рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рд░рд▓ рдЖрдпрдд рдХреЛ рднрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░реЗрдВрдЧреЗред рд╣рдорд╛рд░реА рддрд╕реНрд╡реАрд░ рдХреЗ рддреАрди рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдВрдЧреЗ - рдЪреМрдбрд╝рд╛рдИ, рдКрдВрдЪрд╛рдИ рдФрд░ рд░рдВрдЧ рднрд░реЗрдВред рд╣рдо рдПрдХ рдЖрдпрдд рдХреЗ рд╕рд╛рде рдПрдХ рдПрд╕рд╡реАрдЬреА рдЫрд╡рд┐ рдмрдирд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрди рдореВрд▓реНрдпреЛрдВ рдХреЗ рдмрдЬрд╛рдп рд╣рдо рдмреНрд░реИрдХреЗрдЯ рдХреЗ рдЬреЛрдбрд╝реЗ рдФрд░ рдЙрди рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЗ рдирд╛рдореЛрдВ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдкреНрд░реЗрд╖рд┐рдд рдбреЗрдЯрд╛ рд╣реЛрдЧрд╛ред рдЖрдк рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдкрд╛рд░рдВрдкрд░рд┐рдХ HTML рдХреЗ рд╕рд╛рде рджреЗрдЦ рдЪреБрдХреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Vue рдХреБрдЫ рдЗрд╕реА рддрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдХреЛрдИ рднреА SVG рдЫрд╡рд┐ рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЬрд╣рдордд рдирд╣реАрдВ рдЙрдард╛рддрд╛ рд╣реИ - рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рдХреЛ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд▓рдВрдмреЗ рд╕рдордп рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред рдкрд╛рда рд╡рд╣ рдФрд░ рдЕрдлреНрд░реАрдХрд╛ рдореЗрдВ рдкрд╛рда рд╣реИред


 <svg version='1.1' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100' preserveAspectRatio='none' height='{{ height }}' width='{{ width }}'> <rect x='0' y='0' height='100' width='100' fill='{{ color }}' /> </svg> 

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


 function generateOneColor() { const rgb = thief.getColor(image); const color = '#' + rgbHex(...rgb); const template = Handlebars.compile(fs.readFileSync('template-one-color.svg', 'utf-8')); const svg = template({ height, width, color }); fs.writeFileSync('1-one-color.svg', svg, 'utf-8'); } 

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


рдзреАрд░реЗ-рдзреАрд░реЗ рднрд░реЗрдВ


рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИред рдпрд╣рд╛рдВ рд╣рдо рдЪрд┐рддреНрд░ рд╕реЗ рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рд░рдВрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рдПрдХ рдЪрд┐рдХрдиреА рд╕рдВрдХреНрд░рдордг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдХрднреА-рдХрднреА рдЙрди рд╕рд╛рдЗрдЯреЛрдВ рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд▓рдВрдмреЗ рд░рд┐рдмрди рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВред



рд╣рдорд╛рд░реЗ SVG рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЛ рдЕрдм рдмрд╣реБрдд рд╣реА рдврд╛рд▓ рдХреЗ рд╕рд╛рде рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рд░реИрдЦрд┐рдХ рдврд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╣рдо рдХреЗрд╡рд▓ рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ - рд╢реБрд░реБрдЖрдд рдореЗрдВ рд░рдВрдЧ рдФрд░ рдЕрдВрдд рдореЗрдВ рд░рдВрдЧ:


 <defs> <linearGradient id='my-gradient' x1='0%' y1='0%' x2='100%' y2='0%' gradientTransform='rotate(45)'> <stop offset='0%' style='stop-color:{{ startColor }};stop-opacity:1' /> <stop offset='100%' style='stop-color:{{ endColor }};stop-opacity:1' /> </linearGradient> </defs> <rect x='0' y='0' height='100' width='100' fill='url(#my-gradient)' /> 

рд░рдВрдЧ рд╕реНрд╡рдпрдВ рдЙрд╕реА ColorThief рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ - рдпрд╛ рддреЛ рдпрд╣ рд╣рдореЗрдВ рдПрдХ рдкреНрд░рд╛рдердорд┐рдХ рд░рдВрдЧ рджреЗрддрд╛ рд╣реИ, рдпрд╛ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд░рдВрдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдкреИрд▓реЗрдЯред рдХрд╛рдлреА рдЖрд░рд╛рдо рд╕реЗред рдврд╛рд▓ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рджреЛ рд░рдВрдЧреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рдЕрдиреНрдпрдерд╛, рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рд╕рдорд╛рди рд╣реИ:


 function generateGradient() { const palette = thief.getPalette(image, 2); const startColor = '#' + rgbHex(...palette[0]); const endColor = '#' + rgbHex(...palette[1]); const template = Handlebars.compile(fs.readFileSync('template-gradient.svg', 'utf-8')); const svg = template({ height, width, startColor, endColor }); // . . . 

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


рдЖрдпрдд рдореЛрдЬрд╝реЗрдХ


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



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


 {{# each rects }} <rect x='{{ x }}' y='{{ y }}' height='11' width='11' fill='{{ color }}' /> {{/each }} 

рддрджрдиреБрд╕рд╛рд░, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╣реА, рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкреВрд░реНрдг рд░рдВрдЧ рдкреИрд▓реЗрдЯ рд╣реИ, рдПрдХреНрд╕ / рд╡рд╛рдИ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реВрдк рд╣реИ рдФрд░ рдкреИрд▓реЗрдЯ рд╕реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░рдВрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рдЖрдпрдд рдмрдирд╛рддреЗ рд╣реИрдВред рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ:


 function generateMosaic() { const palette = thief.getPalette(image, 16); palette.forEach(function(color, index) { palette[index] = '#' + rgbHex(...color); }); const rects = []; for (let x = 0; x < 100; x += 10) { for (let y = 0; y < 100; y += 10) { const color = palette[Math.floor(Math.random() * 15)]; rects.push({ x, y, color }); } } const template = Handlebars.compile(fs.readFileSync('template-mosaic.svg', 'utf-8')); const svg = template({ height, width, rects }); // . . . 

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдореЛрдЬрд╝реЗрдХ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рддрд╕реНрд╡реАрд░ рдХреЗ рд░рдВрдЧ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рд░рдВрдЧреЛрдВ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рд╡реИрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬреИрд╕рд╛ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ ColorThief рдХреА рдХреНрд╖рдорддрд╛рдПрдВ рд╕реАрдорд┐рдд рд╣реИрдВред рдореИрдВ рдПрдХ рдореЛрдЬрд╝реЗрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдореВрд▓ рддрд╕реНрд╡реАрд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рди рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд░рдВрдЧ рдХреЗ рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рдИрдВрдЯреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯред


рдкрдЪреНрдЪреАрдХрд╛рд░реА рдореЗрдВ рд╕реБрдзрд╛рд░


рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдЧрд╣рд░рд╛рдИ рдореЗрдВ рдЬрд╛рдирд╛ рд╣реИ рдФрд░ рдЪрд┐рддреНрд░ рдореЗрдВ рдкрд┐рдХреНрд╕реЗрд▓ рд╕реЗ рд░рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИ ...



рдЪреВрдВрдХрд┐ рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдПрдХ рдХреИрдирд╡рд╛рд╕ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╕реЗ рдЖрдорддреМрд░ рдкрд░ рд╣рдореЗрдВ рдпрд╣ рдбреЗрдЯрд╛ рдорд┐рд▓рддрд╛ рд╣реИ, рд╣рдо рд╕рд╣рд╛рдпрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧреЗрдЯ-рдкрд┐рдХреНрд╕реЗрд▓ рдкреИрдХреЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░реЗрдВрдЧреЗред рд╡рд╣ рдПрдХ рддрд╕реНрд╡реАрд░ рдХреЗ рд╕рд╛рде рдмрдлрд░ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдЦреАрдВрдЪ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реИред


 npm i --save get-pixels 

рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:


 getPixels(image, 'image/jpg', (err, pixels) => { // . . . }); 

рд╣рдореЗрдВ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛ рдлрд╝реАрд▓реНрдб рд╣реЛрддрд╛ рд╣реИ - рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рдПрдХ рд╕рд░рдгреА, рдЙрд╕реА рддрд░рд╣ рдЬреИрд╕реЗ рдХрд┐ рд╣рдо рдХреИрдирд╡рд╛рд╕ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (X, Y) рджреНрд╡рд╛рд░рд╛ рдкрд┐рдХреНрд╕реЗрд▓ рдХрд╛ рд░рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рд░рд▓ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 const pixelPosition = 4 * (y * width + x); const rgb = [ pixels.data[pixelPosition], pixels.data[pixelPosition + 1], pixels.data[pixelPosition + 2] ]; 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреНрд░рддреНрдпреЗрдХ рдЖрдпрдд рдХреЗ рд▓рд┐рдП рд╣рдо рд░рдВрдЧ рдкреИрд▓реЗрдЯ рд╕реЗ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд╕реАрдзреЗ рдЪрд┐рддреНрд░ рд╕реЗ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдорд┐рд▓реЗрдЧрд╛ (рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рдирд╣реАрдВ рднреВрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рддрд╕реНрд╡реАрд░ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣рдорд╛рд░реЗ "рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд" 0 рд╕реЗ 100 рддрдХ рднрд┐рдиреНрди рд╣реИрдВ):


 function generateImprovedMosaic() { getPixels(image, 'image/jpg', (err, pixels) => { if (err) { console.log(err); return; } const rects = []; for (let x = 0; x < 100; x += 5) { const realX = Math.floor(x * width / 100); for (let y = 0; y < 100; y += 5) { const realY = Math.floor(y * height / 100); const pixelPosition = 4 * (realY * width + realX); const rgb = [ pixels.data[pixelPosition], pixels.data[pixelPosition + 1], pixels.data[pixelPosition + 2] ]; const color = '#' + rgbHex(...rgb); rects.push({ x, y, color }); } } // . . . 

рдЕрдзрд┐рдХ рд╕реБрдВрджрд░рддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо "рдИрдВрдЯреЛрдВ" рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдереЛрдбрд╝рд╛ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рд╣рдо рдЗрд╕ рдЖрдХрд╛рд░ рдХреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдирд╣реАрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ (рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдпрд╣ рдЫрд╡рд┐ рдХреА рдЪреМрдбрд╝рд╛рдИ рдпрд╛ рдКрдВрдЪрд╛рдИ рдХреЗ рд╕рдорд╛рди рдкреИрд░рд╛рдореАрдЯрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛрдЧрд╛), рд╣рдо рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рд╣реА рдЖрдХрд╛рд░ рдорд╛рди рдмрджрд▓ рджреЗрдВрдЧреЗ:


 {{# each rects }} <rect x='{{ x }}' y='{{ y }}' height='6' width='6' fill='{{ color }}' /> {{/each }} 

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдореЛрдЬрд╝реЗрдХ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореВрд▓ рдЫрд╡рд┐ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдо рдЬрдЧрд╣ рдкрд░рд┐рдорд╛рдг рдХрд╛ рдХреНрд░рдо рд▓реЗрддрд╛ рд╣реИред


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

рд▓реЗрдХрд┐рди рдЪрд▓реЛ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред


рдЯреНрд░рд╛рдИрдРрдиреНрдЧреНрдпреБрд▓реЗрд╢рдВрд╕



рдЖрдпрддрд╛рдХрд╛рд░ рдЕрдЪреНрдЫреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рддреНрд░рд┐рдХреЛрдг рдЖрдорддреМрд░ рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд░реЛрдЪрдХ рдкрд░рд┐рдгрд╛рдо рджреЗрддреЗ рд╣реИрдВред рддреЛ рдЖрдЗрдП рддреНрд░рд┐рдХреЛрдг рдХреЗ рдвреЗрд░ рд╕реЗ рдореЛрдЬрд╝реЗрдХ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИрдВ, рд╣рдо Delaunay рддреНрд░рд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:


 npm i --save delaunay-triangulate 

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


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

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


 function generateTriangulation() { // . . . const basePoints = []; for (let x = 0; x <= 100; x += 5) { for (let y = 0; y <= 100; y += 5) { const point = [x, y]; if ((x >= 5) && (x <= 95)) { point[0] += Math.floor(10 * Math.random() - 5); } if ((y >= 5) && (y <= 95)) { point[1] += Math.floor(10 * Math.random() - 5); } basePoints.push(point); } } const triangles = triangulate(basePoints); // . . . 

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


 const polygons = []; triangles.forEach((triangle) => { let x = Math.floor((basePoints[triangle[0]][0] + basePoints[triangle[1]][0] + basePoints[triangle[2]][0]) / 3); let y = Math.floor((basePoints[triangle[0]][1] + basePoints[triangle[1]][1] + basePoints[triangle[2]][1]) / 3); if (x === 100) { x = 99; } if (y === 100) { y = 99; } const realX = Math.floor(x * width / 100); const realY = Math.floor(y * height / 100); const pixelPosition = 4 * (realY * width + realX); const rgb = [ pixels.data[pixelPosition], pixels.data[pixelPosition + 1], pixels.data[pixelPosition + 2] ]; const color = '#' + rgbHex(...rgb); const points = ' ' + basePoints[triangle[0]][0] + ',' + basePoints[triangle[0]][1] + ' ' + basePoints[triangle[1]][0] + ',' + basePoints[triangle[1]][1] + ' ' + basePoints[triangle[2]][0] + ',' + basePoints[triangle[2]][1]; polygons.push({ points, color }); }); 

рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд░рдВрдЧ рдХреЗ рд╕рд╛рде рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рдмрд╛рд░реНрд╕ рдореЗрдВ рднреЗрдЬ рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдерд╛ред


рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рд╣реА, рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрдпрдд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдмрд╣реБрднреБрдЬ:


 {{# each polygons }} <polygon points='{{ points }}' style='stroke-width:0.1;stroke:{{ color }};fill:{{ color }}' /> {{/each }} 

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


рд╡реЛрд░реЛрдиреЛрдИ рдХреА рдореЛрдЬрд╝реЗрдХ


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



рдЕрдиреНрдп рдЬреНрдЮрд╛рдд рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рддрд░рд╣, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:


 npm i --save voronoi 

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


 function generateVoronoi() { // . . . const box = { xl: 0, xr: 100, yt: 0, yb: 100 }; const diagram = voronoi.compute(basePoints, box); const polygons = []; diagram.cells.forEach((cell) => { let x = cell.site.x; let y = cell.site.y; if (x === 100) { x = 99; } if (y === 100) { y = 99; } const realX = Math.floor(x * width / 100); const realY = Math.floor(y * height / 100); const pixelPosition = 4 * (realY * width + realX); const rgb = [ pixels.data[pixelPosition], pixels.data[pixelPosition + 1], pixels.data[pixelPosition + 2] ]; const color = '#' + rgbHex(...rgb); let points = ''; cell.halfedges.forEach((halfedge) => { const endPoint = halfedge.getEndpoint(); points += endPoint.x.toFixed(2) + ',' + endPoint.y.toFixed(2) + ' '; }); polygons.push({ points, color }); }); // . . . 

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


рд╕рднреА рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдкреВрд░реНрдгрд╛рдВрдХ рдпрд╛ рдХрдо рд╕реЗ рдХрдо рджрд╢рдорд▓рд╡ рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рд░рд╛рдЙрдВрдб рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИред рдПрд╕рд╡реАрдЬреА рдореЗрдВ рдЕрддреНрдпрдзрд┐рдХ рд╕рдЯреАрдХрддрд╛ рдпрд╣рд╛рдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХрд░реЗрдЧрд╛ред

рдзреБрдВрдзрд▓реА рдкрдЪреНрдЪреАрдХрд╛рд░реА


рдЕрдВрддрд┐рдо рдЙрджрд╛рд╣рд░рдг рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдПрдХ рдзреБрдВрдзрд▓реА рдореЛрдЬрд╝реЗрдХ рд╣реИред рд╣рдорд╛рд░реЗ рд╣рд╛рдереЛрдВ рдореЗрдВ рдПрд╕рд╡реАрдЬреА рдХреА рд╕рд╛рд░реА рд╢рдХреНрддрд┐ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдлрд┐рд▓реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?



рдЖрдпрддреЛрдВ рдХреА рдкрд╣рд▓реА рдореЛрдЬрд╝реЗрдХ рд▓реЗрдВ рдФрд░ рдЙрд╕рдореЗрдВ рдорд╛рдирдХ "рдХрд▓рдВрдХ" рдлрд╝рд┐рд▓реНрдЯрд░ рдЬреЛрдбрд╝реЗрдВ:


 <defs> <filter id='my-filter' x='0' y='0'> <feGaussianBlur in='SourceGraphic' stdDeviation='2' /> </filter> </defs> <g filter='url(#my-filter)'> {{# each rects }} <rect x='{{ x }}' y='{{ y }}' height='6' width='6' fill='{{ color }}' /> {{/each }} </g> 

рдкрд░рд┐рдгрд╛рдо рд╣рдорд╛рд░реА рддрд╕реНрд╡реАрд░ рдХрд╛ рдПрдХ рдзреБрдВрдзрд▓рд╛, "рд╕реЗрдВрд╕рд░" рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рд╣реИ, рдпрд╣ рд▓рдЧрднрдЧ 10 рдЧреБрдирд╛ рдХрдо рдЬрдЧрд╣ рд▓реЗрддрд╛ рд╣реИ (рд╕рдВрдкреАрдбрд╝рди рдХреЗ рдмрд┐рдирд╛), рд╡реЗрдХреНрдЯрд░ рдФрд░ рдХрд┐рд╕реА рднреА рд╕реНрдХреНрд░реАрди рдХреЗ рдЖрдХрд╛рд░ рддрдХ рдлреИрд▓рд╛ рд╣реИред рдЙрд╕реА рддрд░рд╣, рдЖрдк рд╣рдорд╛рд░реЗ рдмрд╛рдХреА рдореЛрдЬрд╝рд╛рдЗрдХ рдХреЛ рдзреБрдВрдзрд▓рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


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

рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рдмрдЬрд╛рдп


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рдХреИрд╕реЗ рдЖрдк Node.js рдкрд░ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ SVG рд╕реНрдЯрдм рдЪрд┐рддреНрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЗрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдХрд╛рдо рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рдЖрдк рд╣рд╛рде рд╕реЗ рд╕рдм рдХреБрдЫ рдирд╣реАрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ, рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВред рдЧреАрдереВрдм рдкрд░ рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдЙрдкрд▓рдмреНрдз рд╣реИрдВ ред

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


All Articles