рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ GIF GIF рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП


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

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдХрдирд╡рд░реНрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ


рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рд╕рд░реНрд╡рд░ рднрд╛рд╖рд╛рдПрдБ, рдЬреИрд╕реЗ рдХрд┐ PHP, C #, JAVA, рдЗрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд░ рд╕рдХрддреА рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╡рд╣рд╛рдБ рдПрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЫрд╡рд┐ рд╕рдВрдкрд╛рджрдХ рд╣реИ рдЬреЛ рдХреИрдирд╡рд╛рд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ jpg рдФрд░ png рд╕реНрд╡рд░реВрдкреЛрдВ рдореЗрдВ рдЪрд┐рддреНрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реИ, рддреЛ рдХрдо рд╕реЗ рдХрдо рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рднрд╛рдЧреЛрдВ рдореЗрдВ рддрд░реНрдХ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рдмрджрд╕реВрд░рдд рд╣реИред рдпрд╣ рдЙрд╕ рдЖрд╡реЗрджрди рдХреА рдЖрдВрддрд░рд┐рдХ рд╕реБрдВрджрд░рддрд╛ рдХреЗ рд▓рд┐рдП рдерд╛ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдерд╛ред рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдкреВрд░рд╛ рдЖрд╡реЗрджрди рдЬрд╡рд╛рд╕реНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╣реЛред

рдИрдВрдЯреЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд░реЛ


рдЬреЗрдкреАрдИрдЬреА рдпрд╛ рдкреАрдПрдирдЬреА рдХреЛ рдХреИрдирд╡рд╕ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдп рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:

canvas.toDataURL(mime) 

рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рдмреЗрд╕ 64 рдбрд╛рдЯреБрд░рд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЛрдЧрд╛, рдЬреЛ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрд╕рд╛рдиреА рд╕реЗ img рдЯреИрдЧ рдХреЗ src рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдорд╛рдЗрдо рдкреИрд░рд╛рдореАрдЯрд░ "рдЗрдореЗрдЬ / рдкреАрдПрдирдЬреА" рдпрд╛ "рдЗрдореЗрдЬ / рдЬреЗрдкреАрдИрдЬреА" рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк "рдЫрд╡рд┐ / gif" рдпрд╛ "рдЫрд╡рд┐ / bmp" рдХреЛ рдорд╛рдЗрдо рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкрд░рд┐рдгрд╛рдо рдЕрднреА рднреА PNG рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╣реЛрдЧрд╛ред

рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдЧреНрд░рд╣ рдкрд░ рдХреБрдЫ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЛ рднреА рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рдереА рдФрд░ рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдЗрд╕ рдкрд░ рд╣рд╛рде рдорд┐рд▓рд╛ред
рдореИрдВ рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рдерд╛, рдореБрдЭреЗ рдЬрд▓реНрджреА рд╕реЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдПрдХ рдХреЛрдб рдорд┐рд▓рд╛ рдЬреЛ BMP рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдХреИрдирд╡рд╛рд╕ рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИ: www.nihilogic.dk/labs/canvas2image
рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдХреЛрдб рдХрд╛ рдЯреБрдХрдбрд╝рд╛ рдирд┐рдХрд╛рд▓ рд▓реЗрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ GIF рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ред

рд▓реЗрдХрд┐рди GIF рдХреЗ рд╕рд╛рде рдпрд╣ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рдерд╛ред
рдПрдВрдЯреАрдореИрдЯрд░ 15 рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓реАрдб "рдХреИрдирд╡рд╛рд╕ рд╕реЗ рд▓реЗрдХрд░ рдЬрд┐рдлрд╝" рдереАрдо рдкрд░ рд▓рдЧрднрдЧ рд╕рднреА рдЦреЛрдЬреЗрдВ: github.com/antimatter15/ssgif
рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдкрд╣рд▓реА рдмрд╛рд░ рдЗрд╕реЗ рдЖрдЬрдорд╛рдпрд╛ред рдЙрд╕рдХреЗ рдкрд╛рд╕ рдПрдХ рдкреНрд▓рд╕ рд╣реИ: рд╡рд╣ рдЕрднреА рднреА рдЬреАрдЖрдИрдПрдл рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ рддрд╕реНрд╡реАрд░ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдирд┐рдореЗрдЯреЗрдб рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЬреЛрд░ рдХреЗрд╡рд▓ рдПрдиреАрдореЗрд╢рди рдкрд░ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдпрд╛ рддреЛ рдЫрд╡рд┐ рдЧреБрдгрд╡рддреНрддрд╛ рдпрд╛ рд░реВрдкрд╛рдВрддрд░рдг рдХреА рдЧрддрд┐ рдирд╣реАрдВ рджреЗрдЦреА рдереАред

antimatter15 (PNG to GIF, 100x16px, 56ms):


antimatter15 (JPEG to GIF, 604x377px, 4564ms):


рдПрдВрдЯреАрдореИрдЯрд░ 15 (GIF, 256x256px, 1052ms рдХреЗ рд▓рд┐рдП рдкрд╛рд░рджрд░реНрд╢реА PNG):


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рднреА рдЪрд┐рддреНрд░реЛрдВ рдореЗрдВ рд╡рд┐рдХреГрдд рд░рдВрдЧ рд╣реИрдВред рд▓реЗрдХрд┐рди рддреАрд╕рд░реЗ рдХреЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИред
рдореИрдВ рд╕рдордЭрд╛рдКрдВрдЧрд╛ рдХрд┐ рдЖрдЦрд╝рд┐рд░реА рддрд╕реНрд╡реАрд░ рдХрд╛ рдХреНрдпрд╛ рд╣реБрдЖред рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ PNG рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд╛рд░рджрд░реНрд╢реА рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд╕рд╛рде рдереАред рдХреИрдирд╡рд╛рд╕ RGBA рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд┐рдХреНрд╕реЗрд▓ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН, рддреАрди рд░рдВрдЧ рдФрд░ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХрд╛ рд╕реНрддрд░ред рд▓реЗрдХрд┐рди рдПрдВрдЯреАрдореИрдЯрд░ 15 рд╕реЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗрд╡рд▓ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рд╕реНрддрд░ рдХреА рдЕрдирджреЗрдЦреА рдХрд░рддреА рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрд▓рдд рд╣реИред

рдирд┐рд╖реНрдкрдХреНрд╖рддрд╛ рдореЗрдВ, рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдХреИрдирд╡рд╕ 2image рд▓рд╛рдЗрдмреНрд░реЗрд░реА рднреА рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХреЗ рд╕реНрддрд░ рдХрд╛ рдЕрдиреБрднрд╡ рдирд╣реАрдВ рдХрд░рддреА рд╣реИред
рдХреИрдирд╡рд╛рд╕ 2image (рдмреАрдПрдордкреА рдореЗрдВ рдкрд╛рд░рджрд░реНрд╢реА рдкреАрдПрдирдЬреА, 256x256px):


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

рдЖрдЧреЗ рдХреА рдЦреЛрдЬреЛрдВ рдиреЗ рдореБрдЭреЗ рдУрдордЧрд┐рдлрд╝ (GIF 89a рдПрдирдХреЛрдбрд░ рдХреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдПрдиреАрдореЗрд╢рди рдФрд░ рд╕рдВрдкреАрдбрд╝рди рд╢рд╛рдорд┐рд▓ рд╣реИрдВ) рдХреЗ рд▓рд┐рдП рдиреЗрддреГрддреНрд╡ рдХрд┐рдпрд╛: github.com/deanm/omggif
рдПрдХ рдкрд╛рд░рджрд░реНрд╢реА рдкрд┐рдХреНрд╕реЗрд▓ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦрдХрд░, рдореИрдВрдиреЗ рддреБрд░рдВрдд рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред

 // 1x1 transparent 43 bytes. function gen_empty_trans() { var gf = new omggif.GifWriter(buf, 1, 1, {palette: [0x000000, 0x000000]}); gf.addFrame(0, 0, 1, 1, [0], {transparent: 0}); return buf.slice(0, gf.end()); } 

рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдг рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдХреИрдирд╡рд╛рд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рддреИрдпрд╛рд░ рдкреИрд▓реЗрдЯ (рд░рдВрдЧреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА) рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЬрдм рдПрдХ рдлреНрд░реЗрдо рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдкреИрд▓реЗрдЯ рдореЗрдВ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реЛрддреА рд╣реИред
рдкреИрд▓реЗрдЯ рдФрд░ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рдирд╛, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдпрд╣ рдкрд░рд┐рдорд╛рдгреАрдХрд░рдг рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИред рдПрдВрдЯреАрдореИрдЯрд░ 15 рд╕реЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ, рдПрдХ рдЕрд▓рдЧ рдлрд╛рдЗрд▓ NeuQuant.js рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдереАред рдУрдордЧрд┐рдл рдореЗрдВ рдХреЛрдИ рдорд╛рддреНрд░рд╛ рдирд╣реАрдВ рд╣реИред
рдореИрдВрдиреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдХрдИ рдорд╛рддреНрд░рд╛рдУрдВ рдХреЛ рджреЗрдЦрд╛, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдиреЗ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред
рдУрдордЧрд┐рдлрд╝ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореБрдЭреЗ рдЕрдм GIF рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рд░реВрдк рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдкрд░рд┐рдорд╛рдгреАрдХрд░рдг рдХрд╛рд░реНрдп рдореБрдЭреЗ рдЗрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд▓рдЧ рд░рд╣рд╛ рдерд╛ред рдЗрд╕рд▓рд┐рдП, рдХрдирд╡рд░реНрдЯрд░ рдХреЛ рдЦреБрдж рд╣реА рдЦрддреНрдо рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред

рдПрдХ рдкреИрд▓реЗрдЯ рдФрд░ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо


рдЗрд╕рд▓рд┐рдП, рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рдкрд░рд┐рдорд╛рдгреАрдХрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ 4 рдЪрд░рдгреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛:
  1. рдкреИрд▓реЗрдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд┐рдХреНрд╕реЗрд▓ рдЦреЛрдЬреЗрдВред
  2. рдЙрди рд░рдВрдЧреЛрдВ рдХреЛ рдкрд╣рдЪрд╛рдиреЗрдВ рдЬреЛ рдкреИрд▓реЗрдЯ рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВред
  3. рдкреНрд░рддреНрдпреЗрдХ рд░рдВрдЧ рдХреЗ рд▓рд┐рдП рдЬреЛ рдкреИрд▓реЗрдЯ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдкреИрд▓реЗрдЯ рд╕реЗ рдирд┐рдХрдЯрддрдо рд░рдВрдЧ рдХреА рдЦреЛрдЬ рдХрд░реЗрдВ
  4. рдкреИрд▓реЗрдЯ рдореЗрдВ рд░рдВрдЧ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рдкрд┐рдХреНрд╕реЗрд▓ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВред

рд╕реНрдЯреЗрдЬ 1

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

рдлрд┐рд░ рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдирд╣реАрдВ рдЬрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдмрд╕ рдХреИрдирд╡рд╛рд╕ рдХреЛ рдХрдо рдХрд░реЗрдВ рдЬрдм рддрдХ рдХрд┐ рдЙрд╕рдореЗрдВ рд░рдВрдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 255 рд╕реЗ рдХрдо рди рд╣реЛ (рдПрдХ рд░рдВрдЧ рд╣рдореЗрд╢рд╛ рдкрд╛рд░рджрд░реНрд╢реА рд╣реЛрддрд╛ рд╣реИ)ред рдЪреВрдВрдХрд┐ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рджреНрд╡рд╛рд░рд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХрд╛ рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рдирд┐рдХрд▓рд╛ред рд╕рдВрдкреВрд░реНрдг рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ 1500ms рдореЗрдВ рд╕реЗ рдПрдХ рдХреБрддреНрддреЗ рдХреЗ рд╕рд╛рде jpg рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ 20ms (рдКрдкрд░ рджреЗрдЦреЗрдВ)ред

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЪрд┐рддреНрд░ рдХреЛ рджреЛ рдмрд╛рд░ рдмрд┐рд▓реНрдХреБрд▓ рдХрдо рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рд░рдВрдЧ рд╡рд┐рдХреГрдд рд╣реЛрддреЗ рд╣реИрдВред

рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдмрд╛рдЗрдЯ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рд╕реВрддреНрд░ рд▓рд╛рдЧреВ рдХрд┐рдП рд╣реИрдВ:

  рд▓рд╛рд▓ = 0xFF- рдЕрд▓реНрдлрд╛ * (1-рд▓рд╛рд▓ / 0xFF)
 рд╣рд░рд╛ = 0xFF- рдЕрд▓реНрдлрд╛ * (1-рд╣рд░рд╛ / 0xFF)
 рдиреАрд▓рд╛ = 0xFF- рдЕрд▓реНрдлрд╛ * (1-рдиреАрд▓рд╛ / 0xFF) 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдореИрдВ рдПрдХ рд╕рдлреЗрдж рдкреГрд╖реНрдарднреВрдорд┐ рдкрд░ рд╕рднреА рд░рдВрдЧ рдШрдЯрдХреЛрдВ рдХреЛ рд▓рдЧрд╛рддрд╛ рд╣реВрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рдЕрд▓реНрдлрд╛ 0 рд╣реИ, рддреЛ рдпрд╣ рдкрд┐рдХреНрд╕реЗрд▓ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд╛рд░рджрд░реНрд╢реА рд╣реИ рдФрд░ рдЗрд╕реЗ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЪрд░рдг 2 рдФрд░ 3

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

  d = sqrt ((X1 - x2) ^ 2 + (y1 - y2) ^ 2 + (z1 - z2) ^ 2) 

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

рдЕрддрд┐рд░рд┐рдХреНрдд рдЪрд░рдг

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

рд╕реНрдЯреЗрдЬ 4

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

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди


Javascrpt рдкрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рджреМрд░рд╛рди, рдореБрдЭреЗ рдЗрд╕ рднрд╛рд╖рд╛ рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛ рдЬрд┐рд╕рдиреЗ рдЧрддрд┐ рдХреЛ рдХрд╛рдлреА рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ред

рджреЛ-рд░рдВрдЧ рд╕реВрддреНрд░ рдЕрдиреБрдХреВрд▓рди

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

 // 1 Math.sqrt(Math.pow(red1-red2,2)+Math.pow(green1-green2,2)+Math.pow(blue1-blue2,2)) // 2 var mypow = function(a){ return a*a; }; Math.sqrt(mypow(red1-red2)+mypow(green1-green2)+mypow(blue1-blue2)) // 3 Math.sqrt((red1-red2)*(red1-red2)+(green1-green2)*(green1-green2)+(blue1-blue2)*(blue1-blue2)) // 4 var distance = function(a,b,c){ return Math.sqrt(a*a+b*b+c*c); }; distance(red1-red2, green1-green2,blue2-blue2) 

рдореИрдВ рд╣рд┐рдЯ рдкрд░реЗрдб рдХреЛ рд╕рдмрд╕реЗ рдзреАрдореЗ рд╕рдВрд╕реНрдХрд░рдг - рд╡рд┐рдХрд▓реНрдк рдирдВрдмрд░ 2 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛ред рд╕реНрд╡-рд▓рд┐рдЦрд┐рдд рд╕реНрдХреНрд╡реИрд░рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдмрд┐рд▓реНрдЯ-рдЗрди Math.pow рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 2.5 рдЧреБрдирд╛ рдзреАрдорд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк 3rd рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдПрдХ рд╣реА рд╣рд┐рд╕реНрд╕рд╛ Math.pow рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 10 рдЧреБрдирд╛ рдЕрдзрд┐рдХ рддреЗрдЬреА рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред рдЗрд╕рд╕реЗ рдореИрдВ рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реВрдВ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдпрд╣ рдмрд╣реБрдд рдзреАрд░реЗ-рдзреАрд░реЗ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╣реИред рдФрд░ рдЪреМрдерд╛ рд╡рд┐рдХрд▓реНрдк рдЗрд╕рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИ, рддреАрд╕рд░реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 10 рдЧреБрдирд╛ рдзреАрдорд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдЖрдЗрдП рдЧрддрд┐ рдмрдврд╝рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕реВрддреНрд░ рдХреА рдЧрдгрдирд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдиреНрдпреВрдирддрдо рдФрд░ рдЕрдзрд┐рдХрддрдо рд░рдВрдЧ рдЕрдВрддрд░ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдЖрдк рд╡рд░реНрдЧрдореВрд▓ рдХреА рдЧрдгрдирд╛ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред

 // 5 (red1-red2)*(red1-red2)+(green1-green2)*(green1-green2)+(blue1-blue2)*(blue1-blue2) 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рддреАрд╕рд░реЗ рд╡рд┐рдХрд▓реНрдк рдХреА рдЧрддрд┐ рдХреЛ 1.5 рдЧреБрдирд╛ рдмрдврд╝рд╛ рджреЗрддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдЧреЗ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреА рдЧрддрд┐ рдкрд░ рдмрд╣реБрдд рдХрдо рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИред рдирд┐рдореНрди рд╡рд┐рдХрд▓реНрдк рд▓рдЧрднрдЧ рд╕рдорд╛рди рдЧрддрд┐ рджреЗрддрд╛ рд╣реИ:

 // 6 (red=red1-red2)*red+(green=green1-green2)*green+(blue=blue1-blue2)*blue 

рддреАрди рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рджреВрд╕рд░реЗ рдФрд░ рддреАрд╕рд░реЗ рдЪрд░рдг рдХреА рддреБрд▓рдирд╛ рддрд╛рд▓рд┐рдХрд╛:
рдХреБрддреНрддрд╛рдЕрд▓реНрдлрд╛ рд░реЛрдорд┐рдпреЛрдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЖрдЗрдХрди
Math.sqrt (Math.pow (r1-r2,2) + Math.pow (g1-g2,2) + Math.pow (b1-b2,2))17211ms1762ms117ms
Math.sqrt (mypow (r1-r2) + mypow (g1-g2) + mypow (b1-b2))40790ms3875ms255ms
Math.sqrt ((r1-r2) * (r1-r2) + (g1-g2) * (g1-g2) + (b1-b2) * (b1-b2))1250ms149ms14ms
рджреВрд░реА (рдЖрд░ 1-рдЖрд░ 2, рдЬреА 1-рдЬреА 2, рдмреА 2-рдмреА 2)15006ms1556ms99ms
(r1-r2) * (r1-r2) + (g1-g2) * (g1-g2) + (b1-b2) * (b1-b2)779ms104ms12ms
(r = r1-r2) * r + (g = g1-g2) * g + (b = b1-b2) * b740ms100ms10ms

рдкреИрд▓реЗрдЯ рд╕рд░рдгреА рдЕрдиреБрдХреВрд▓рди

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдкреИрд▓реЗрдЯ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рдВрдЧреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдирдпрд╛ рд░рдВрдЧ рдЬреЛрдбрд╝рдирд╛ рдЗрд╕ рддрд░рд╣ рд╣реБрдЖ:

 if(palette.indexOf(color) == -1) palette.push(color); 

рд▓реЗрдХрд┐рди рдПрдХ рдмрдбрд╝реЗ рд╕рд░рдгреА рдореЗрдВ, indexOf рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдХрд╛рд░реНрдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЦреЛрдЬ рдХрд┐рдП рдЧрдП рд╕рднреА рддрддреНрд╡реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЛ рддреЗрдЬрд╝реА рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛:

 if(!palette[color)) palette[color]=true; 

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

 if(!palette[color)) palette[color]={r:red, g:green, b:blue}; 


рд▓реЗрдХрд┐рди рдкреИрд▓реЗрдЯ рднрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдорд╛рд░реНрдЧ рдХреЗ рдХрдИ рдЪрдХреНрд░реЛрдВ рдХреЛ рдорд╛рдирддрд╛ рд╣реИ:

 for(var color in palette){ var rgb=palette[color]; } 

рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдпрд╣ рдмрд╣реБрдд рдзреАрдорд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╣рдо рдХрд┐рд╕реА рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реЛрдВ:

 for(var i=0, n=palette.length; i<n; i++){ var pal=palette[i]; } 

рдЗрд╕рд▓рд┐рдП, рдкреИрд▓реЗрдЯ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рдгреА (рдкреИрд▓реЗрдЯ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдФрд░ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдкреИрд▓реЗрдЯ рдореЗрдВ рд░рдВрдЧ рд╣реИ, (рдореМрдЬреВрдж) рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

 if(!exists[color)){ exists[color]=true; palette.push({c:color, r:red, g:green, b:blue}); } for(var i=0, n=palette.length; i<n; i++){ var pal=palette[i]; } 

рд▓реВрдк рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди

рдореИрдВ рдЪрдХреНрд░ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдкрд░ рдереЛрдбрд╝рд╛ рдзреНрдпрд╛рди рджреВрдВрдЧрд╛:

 // 1 for(var i=0, n=palette.length; i<n; i++){ var pal=palette[i]; } // 2 for(var i=0; i<palette.length; i++){ var pal=palette[i]; } // 3 for(var i=0, pal; pal=palette[i]; i++){ } 

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореИрдВ рдмрд╛рдж рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдкреНрд░рджрд░реНрд╢рди рдХреЛ рджреЗрдЦреЗрдВ, рддреЛ рд╕реНрдерд┐рддрд┐ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИред рд▓рдЧрднрдЧ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИред рдЦреБрдж рдХреЗ рд▓рд┐рдП рдиреНрдпрд╛рдпрд╛рдзреАрд╢:
рдХреБрддреНрддрд╛рдЕрд▓реНрдлрд╛ рд░реЛрдорд┐рдпреЛрдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЖрдЗрдХрди
(var i = 0, n = palette.length; рдореИрдВ <n; i ++)238ms51ms3,5ms
(var i = 0; рдореИрдВ <palette.length; i ++)244ms55ms3,5ms
(var i = 0, pal; рдкрд╛рд▓ = рдкреИрд▓реЗрдЯ [i]; i ++)230ms54ms3,5ms


рдкрд░рд┐рдгрд╛рдо


PNG to GIF, 100x16px, 35ms:


JPEG to GIF, 604x377px, 1338ms:


GIF рдХреЗ рд▓рд┐рдП рдкрд╛рд░рджрд░реНрд╢реА PNG, 256x256px, 268ms:


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

рдпрд╣рд╛рдБ рдореЗрд░рд╛ рдХреЛрдб рд╣реИ
(рдХреИрдирд╡рд╕ рдЯреЙрдлрд┐рдЬрдбрд╛рдЯрд╛ рдФрд░ рдХреИрдирд╡рд╕рдкреНрд▓реЗрдЯ рдХреЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдп)
 // base64 encodes either a string or an array of charcodes var encodeData = function(data) { var strData = ""; if (typeof data == "string") { strData = data; } else { var aData = data; for (var i=0;i<aData.length;i++) { strData += String.fromCharCode(aData[i]); } } return btoa(strData); }; var readCanvasData = function(oCanvas) { var iWidth = parseInt(oCanvas.width); var iHeight = parseInt(oCanvas.height); return oCanvas.getContext("2d").getImageData(0,0,iWidth,iHeight); }; var makeDataURI = function(strData, strMime) { return "data:" + strMime + ";base64," + strData; }; var cW=0xff; var canvasPalette=function(canvas){ var oData = readCanvasData(canvas), data=oData.data, exists={}, palette=[]; for(var i = 0, n=data.length; i < n; i+=4){ var a=data[i+3]; if(a==0) continue; var r=(cW-a*(1-data[i]/cW))|0, g=(cW-a*(1-data[i+1]/cW))|0, b=(cW-a*(1-data[i+2]/cW))|0, col=b+(g<<8)+(r<<16); if(!exists[col]){ if(palette.length>=255){ var subcanvas=document.createElement('canvas'), width=oData.width>>1, height=oData.height>>1; subcanvas.width=width; subcanvas.height=height; subcanvas.getContext('2d').drawImage(canvas, 0, 0,width,height); return canvasPalette(subcanvas); } else{ exists[col]=true; palette.push({c:col,r:r,g:g,b:b}); } } } return {exists:exists, palette:palette}; } var canvasToGIFDataURL = function(canvas){ var dr,dg,db; var oData = readCanvasData(canvas); var data=oData.data; var palette=canvasPalette(canvas); var exists=palette.exists; palette=palette.palette; var outpalette=[]; var pixels=[]; var maxdDifI=null; var maxdDif=0; for(var i = 0,pi=0,l=data.length; i < l; i+=4, pi++){ var a=data[i+3]; if(a==0){ pixels[pi]=-1; continue; } var r=(cW-a*(1-data[i]/cW))|0, g=(cW-a*(1-data[i+1]/cW))|0, b=(cW-a*(1-data[i+2]/cW))|0, col=b+(g<<8)+(r<<16); pixels[pi]=col; if(!exists[col]){ exists[col]=true; var minDif=0xffffff, minDifColIndex=null; for(var j=0, nj=palette.length; j<nj; j++){ var pal=palette[j], d=(dr=pal.rr)*dr+(dg=pal.gg)*dg+(db=pal.bb)*db; if(d<minDif){ minDif=d; minDifColIndex=j; } } if(minDif > maxdDif) { maxdDif=minDif; maxDifI=outpalette.length; } outpalette.push({c:col, d:minDif, r:r, g:g, b:b, index:minDifColIndex}); } } while(maxdDif!=null && palette.length<255){ var dif=outpalette.splice(maxdDifI,1)[0]; maxdDif=null; maxdDifI=0; var r=dif.r, g=dif.g, b=dif.b, col=dif.c; var index=palette.length; palette.push({c:col,r:r,g:g,b:b}); for(var j=0, nj=outpalette.length; j<nj; j++){ var dif=outpalette[j], d=(dr=dif.rr)*dr+(dg=dif.gg)*dg+(db=dif.bb)*db; if(d<dif.d){ dif.d=d; dif.index=index; } if(dif.d > maxdDif) { maxdDif=dif.d; maxDifI=j; } } } var map={}; palette.unshift({c:-1}); for(var j=0,pal; pal=palette[j]; j++){ var col=pal.c; map[col]=j; palette[j]=col; } for(var j=0,dif; dif=outpalette[j]; j++){ map[dif.c]=dif.index+1; } var indexes=[]; for(var i = 0, pixel; pixel=pixels[i]; i++){ indexes.push(map[pixel]); } for(var l=2;l<=256;l=l<<1){ if(palette.length==l) break; if(palette.length<l) { while(palette.length<l) palette.push(0); break; } } var buf = []; var gf = new GifWriter(buf, oData.width, oData.height, {palette: palette}); gf.addFrame(0, 0, oData.width, oData.height, indexes,{transparent: 0}); var binary_gif = buf.slice(0, gf.end()); return makeDataURI(encodeData(binary_gif), 'image/gif'); }; 


рд╕реНрд░реЛрдд рддрд╕реНрд╡реАрд░реЗрдВ
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЖрдЗрдХрди


рдХреБрддреНрддрд╛


рдЕрд▓реНрдлрд╛ рд░реЛрдорд┐рдпреЛ


рдЕрдм рдореИрдВ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреЗ рд╕рд╛рде рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ:
- рдЖрдк рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ!

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


All Articles