рдиреЗрдЯ рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рд╕реА # рдХреЛрдб

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



рдЗрд╕ рд▓реЗрдЦ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, 2013 рд╕реЗ 6 рд╕рд╛рд▓ рдмреАрдд рдЪреБрдХреЗ рд╣реИрдВ, рдФрд░ рдХрдИ рддрдХрдиреАрдХреЛрдВ рдиреЗ рдЕрдкрдиреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рдЦреЛ рджреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдХреНрд░рд┐рдкреНрдЯ # ред рджреВрд╕рд░реА рдУрд░, рдирдП рд▓реЛрдЧ рджрд┐рдЦрд╛рдИ рджрд┐рдП рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Bridge.NET рдпрд╛ Blazor рдлреИрдВрд╕реА WebAssembly рдХреЗ рдЖрдзрд╛рд░ рдкрд░ред


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


рдЕрдВрддрд░реНрд╡рд╕реНрддреБ





рд▓рдХреНрд╖реНрдп


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


рдлрд┐рд▓реНрдЯрд░ рдХрд╛ рд╡рд┐рд╡рд░рдг


рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдПрдХ рдлрд╝рд┐рд▓реНрдЯрд░ рдлрд╝реЛрдЯреЛрд╢реЙрдк рдореЗрдВ рдХреА рдЧрдИ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИ рдФрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдлрд╝реЛрдЯреЛ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИред рдиреАрдЪреЗ рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВ:


  • рдЪрдордХ рд╕рдорд╛рдпреЛрдЬрди
  • рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рд╕рдорд╛рдпреЛрдЬрди
  • рд╕рдВрддреГрдкреНрддрд┐ рд╕рдорд╛рдпреЛрдЬрди
  • рд░рдВрдЧ рдШрдЯрддрд╛ рд╕рдорд╛рдпреЛрдЬрди
  • рд╡рд┐рднрд┐рдиреНрди рдореЛрдб рдореЗрдВ рдорд╛рд╕реНрдХрд┐рдВрдЧ
  • рдлреНрд░реЗрдорд┐рдВрдЧ
  • ...

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


  • рдХреЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╕реНрд╡рддрдВрддреНрд░ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ (.NET, JavaScript, WinPhone, рдЖрджрд┐)
  • рдлрд┐рд▓реНрдЯрд░ рдХреЗ рдПрдХ рд╕рд░рд▓ рдЧреИрд░-рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рдкреНрд░рд╛рд░реВрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдкрд╛рд░реНрд╕рд░ рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ
  • XML рдФрд░ JSON рдбреЗрдЯрд╛ рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рдЦрдкрдд (рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ) рд╣реИ

рдпрд╣рд╛рдБ XPro рдлрд┐рд▓реНрдо рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рд▓рд┐рдП рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдХреНрд░рдо рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:



рдПрдХ рдлрд┐рд▓реНрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рддрд╕реНрд╡реАрд░ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдЫрд╡рд┐ рдХреЛ рдХреНрд░реЙрдк рдФрд░ рдШреБрдорд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рд╣рд╛рдВ, рдореБрдЭреЗ рдкрддрд╛ рдерд╛ рдХрд┐ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдХреНрд░реЙрдк рдФрд░ рд░реЛрдЯреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП jQuery рдкреНрд▓рдЧрдЗрдиреНрд╕ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╕реЗ рдЕрддрд┐рднрд╛рд░рд┐рдд рдФрд░ рд╡рд┐рдЪрд▓рд┐рдд рд╣реЛ рд░рд╣реЗ рдереЗред


рдХреЛрд▓рд╛рдЬ рдХрд╛ рд╡рд┐рд╡рд░рдг


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



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


рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рд╣рдореЗрдВ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдЪреБрдирдирд╛ рдерд╛ рдЬрд┐рд╕рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдФрд░ рдХреЛрд▓рд╛рдЬ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХреЗрдВ


рдлреЛрдЯреЛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдЪреБрдирдирд╛


рдХрдИ рд░рд┐рдЪ рдЗрдВрдЯрд░рдиреЗрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди ( RIA ) рддрдХрдиреАрдХреЗрдВ рд╣реИрдВ рдЬреИрд╕реЗ:


  • рдПрдбреЛрдм рдлреНрд▓реИрд╢
  • Microsoft рдЪрд╛рдВрджреА
  • HTML 5 + рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ
  • рдореВрд▓ рдирд┐рд╡рд╛рд╕реА рдЧреНрд░рд╛рд╣рдХ

рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдлреНрд▓реИрд╢ рдФрд░ HTML рдХреЗрд╡рд▓ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпрд╛рдВ рд╣реИрдВ рдЬреЛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдмрд╛рдХреА рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рдорд░рдиреЗ рд▓рдЧрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдкрд╕рдВрдж рд╣реИ рдирдордХ NaCl, рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, рдпрд╣ рддрдХрдиреАрдХ рдХреЗрд╡рд▓ рдХреНрд░реЛрдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИ рдФрд░ рдпрд╣ рдЕрднреА рддрдХ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЕрдиреНрдп рд▓реЛрдХрдкреНрд░рд┐рдп рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрдм рд╕рдорд░реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдФрд░ рдХреНрдпрд╛ рдпрд╣ рдХрднреА рднреА рд╕рдорд░реНрдерд┐рдд рд╣реЛрдЧрд╛)ред 2019 рд╕реЗ рдиреЛрдЯ: рдпрд╣ рд╣реЛрдЧрд╛ рдФрд░ рдирд╛рдо WebAssembly рд╣реИ ред


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


рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ C # рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛


HTML 5 + рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдПрдХ рдордВрдЪ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реИред рддреЛ рдпрд╣ рд╣рдореЗрдВ рдПрдХ рдкреНрд░рд╢реНрди рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ, рдХреНрдпрд╛ рдпрд╣ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ C # рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИ рдЬреЛ .NET рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд╛рдП рдЧрдП:


  • JSIL
  • SharpKit
  • рд╕реНрдХреНрд░рд┐рдкреНрдЯ #
  • рдФрд░ рдХреБрдЫ рдЕрдиреНрдп GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред

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


рдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, ScriptSharp рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рдпрдо рдФрд░ рд╡рд┐рдкрдХреНрд╖ рд╣реИрдВ:


рд▓рд╛рдн


  • рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ C # рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдЬреЛ .NET рдФрд░ рдЕрдиреНрдп рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ (WinPhone, рдореЛрдиреЛ) рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдХреА рдЬрд╛ рд╕рдХреЗ
  • рдУрдУрдкреА рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЬреЛрд░рджрд╛рд░ рдЯрд╛рдЗрдк рд╕реА # рднрд╛рд╖рд╛ рдореЗрдВ рд╡рд┐рдХрд╛рд╕
  • рдЖрдИрдбреАрдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди (рд╕реНрд╡рдд: рдкреВрд░реНрдгрддрд╛ рдФрд░ рд░реАрдлреИрдХреНрдЯрд░рд┐рдВрдЧ)
  • рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛

рдиреБрдХрд╕рд╛рди


  • рдЕрддрд┐рд░реЗрдХ рдФрд░ рдЙрддреНрдкрдиреНрди рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдХреА рдЕрдирд┐рдпрдорд┐рддрддрд╛ (mscorlib рдХреЗ рдХрд╛рд░рдг)ред
  • рдХреЗрд╡рд▓ рдЖрдИрдПрд╕рдУ -2 рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди (рдХреЛрдИ рдХрд╛рд░реНрдп рдЕрддрд┐рднрд╛рд░рд┐рдд рдпрд╛ рдкреНрд░рдХрд╛рд░, рд╡рд┐рд╕реНрддрд╛рд░, рдФрд░ рдЬреЗрдиреЗрд░рд┐рдХ рдЗрдВрдЬреЗрдХреНрд╢рди рдирд╣реАрдВ)

рд╕рдВрд░рдЪрдирд╛


рдирд┐рдореНрди рдпреЛрдЬрдирд╛ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╣реА C # рдХреЛрдб рдХреЛ .NET рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


.NET рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП # рдЕрдиреБрд╡рд╛рдж

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


рд╕рд╛рдорд╛рдиреНрдп .NET рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЧреНрд░рд╛рдлрд╝рд┐рдХреНрд╕рдХрдиреЗрдХреНрдЯ

рдмреЗрд╢рдХ, рдпрд╣ рджреЛ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИред рдлреЙрд▓реЛрдЕрдк рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ WinPhone рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ, рдФрд░ рдлрд┐рд░, рд╢рд╛рдпрдж, рдПрдВрдбреНрд░реЙрдЗрдб рдФрд░ рдЖрдИрдУрдПрд╕ред


рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧреНрд░рд╛рдлрд┐рдХ рдСрдкрд░реЗрд╢рди рд╣реИрдВ:


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

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


рдЙрдкрдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


 #if SCRIPTSHARP using System.Html; using System.Html.Media.Graphics; using System.Runtime.CompilerServices; using Bitmap = System.Html.CanvasElement; using Graphics = System.Html.Media.Graphics.CanvasContext2D; using ImageData = System.Html.Media.Graphics.ImageData; using Image = System.Html.ImageElement; #elif DOTNET using System.Drawing; using System.Drawing.Imaging; using System.Drawing.Drawing2D; using Bitmap = System.Drawing.Bitmap; using Graphics = System.Drawing.Graphics; using ImageData = System.Drawing.Imaging.BitmapData; using Image = System.Drawing.Bitmap; #endif 

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


 using PixelArray = byte*, using PixelArray = byte[] 

рдЕрдкреНрд░рдмрдВрдзрд┐рдд C # рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд┐рдХреНрд╕реЗрд▓ рдХрд╛ рддреЗрдЬреА рд╕реЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрдмрдХрд┐ рдЙрд╕реА рд╕рдордп рдЗрд╕реЗ Script # рдкрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рд╣рдордиреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рдорджрдж рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдпреЛрдЬрдирд╛ рдкреЗрд╢ рдХреА:


 #if SCRIPTSHARP PixelArray data = context.GetPixelArray(); #elif DOTNET byte* data = context.GetPixelArray(); #endif 

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



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


рдХрдВрдкрд╛рдЗрд▓рд░ рдирд┐рд░реНрджреЗрд╢ ( SCRIPTSHARP , SCRIPTSHARP ) рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╕рд╢рд░реНрдд рд╕рдВрдХрд▓рди рдкреНрд░рддреАрдХреЛрдВ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред


.NET рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдиреЛрдЯреНрд╕


рдЙрдкрд░реЛрдХреНрдд рд╕рд╛рд░ рдФрд░ рдЙрдкрдирд╛рдореЛрдВ рдиреЗ рд╣рдореЗрдВ рдХрдо рдЕрддрд┐рд░реЗрдХ рдХреЗ рд╕рд╛рде C # рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХреАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ .NET рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рд╣рдордиреЗ рд╕рдорд╛рдзрд╛рди рдХреЛрдб рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рдерд╛ред


рдбрд┐рд╕реНрдкреЛрдЬрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ C # рд╡рд░реНрдЧ рдХреЗ рдХрд┐рд╕реА рднреА рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛, рдЬреЛ рдХрд┐ IDisposable рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдХреЛ Dispose рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдпрд╛ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдпреЗ рдХрдХреНрд╖рд╛рдПрдВ рдмрд┐рдЯрдореИрдк рдФрд░ рд╕рдВрджрд░реНрдн рд╣реИрдВред рдореИрдВрдиреЗ рдЬреЛ рдКрдкрд░ рдХрд╣рд╛ рд╣реИ рд╡рд╣ рд╕рд┐рд░реНрдл рд╕рд┐рджреНрдзрд╛рдВрдд рдирд╣реАрдВ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХрд╛ рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИ: ASP.NET рдбреЗрд╡рд▓рдкрд░ рд╕рд░реНрд╡рд░ x86 рдкрд░ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдмрдбрд╝реЗ рдЖрдХрд╛рд░ рдХреЗ рдлреЛрдЯреЛ (2400 x 2400 рдбреАрдкреАрдЖрдИ рддрдХ) рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╕реНрдореГрддрд┐ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рдХрд╛рд░рдг рд╣реБрдЖред рд╕рд╣реА рд╕реНрдерд╛рдиреЛрдВ рдкрд░ Dispose рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ рдереАред рдЫрд╡рд┐ рд╣реЗрд░рдлреЗрд░ рдкрд░ рдХреБрдЫ рдЕрдиреНрдп рд╕рд╣рд╛рдпрдХ рд╕рд▓рд╛рд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦ рдореЗрдВ рджрд┐рдП рдЧрдП рд╣реИрдВ 20 рдЫрд╡рд┐ рдЖрдХрд╛рд░ рдмрджрд▓рдирд╛ рдиреБрдХрд╕рд╛рди рдФрд░ .NET рдореЗрдореЛрд░реА рд▓реАрдХ: рдирд┐рдкрдЯрд╛рди рдХрд░рдиреЗ рдпрд╛ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ 1 рдЬреАрдмреА рдкреНрд░рд╢реНрди рд╣реИ ред


рд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ, рдЯреИрдЧ img рд╕рд╛рде рдкрд╣рд▓реЗ рд╕реЗ рдЕрдкрд▓реЛрдб рдХреА рдЧрдИ рдЫрд╡рд┐ рдХреЗ рдмреАрдЪ рдПрдХ рдЕрдВрддрд░ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖрдк рд╕реНрд░реЛрдд рдФрд░ рд▓реЛрдбрд┐рдВрдЧ рдШрдЯрдирд╛ рдФрд░ рдХреИрдирд╡рд╛рд╕ рдЯреИрдЧ рдХрд┐рдП рдЧрдП canvas рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рдкрд░ рдЖрдк рдХреБрдЫ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред .NET рдореЗрдВ рдЗрди рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ рд╣реА Bitmap рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЙрдкрдирд╛рдо рдмрд┐рдЯрдореИрдк рдФрд░ рдЫрд╡рд┐ .NET рдореЗрдВ рдПрдХ рд╣реА рдХреНрд▓рд╛рд╕ System.Drawing.Bitmap рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдлрд┐рд░ рднреА, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ img рдФрд░ canvas рдореЗрдВ рдпрд╣ рд╡рд┐рднрд╛рдЬрди .NET рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рднреА рдмрд╣реБрдд рд╕рд╣рд╛рдпрдХ рдерд╛ред рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдлрд┐рд▓реНрдЯрд░ рд╡рд┐рднрд┐рдиреНрди рдереНрд░реЗрдбреНрд╕ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдорд╛рд╕реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ; рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдЕрдкрд╡рд╛рдж рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдХ рдкреИрдЯрд░реНрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдЫрд╡рд┐ рдХреЛ рд▓реЙрдХ рдХреЗ рд╕рд╛рде рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд▓реЙрдХрд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ):


 internal static Bitmap CloneImage(Image image) { #if SCRIPTSHARP Bitmap result = (Bitmap)Document.CreateElement("canvas"); result.Width = image.Width; result.Height = image.Height; Graphics context = (Graphics)result.GetContext(Rendering.Render2D); context.DrawImage(image, 0, 0); return result; #else Bitmap result; lock (image) result = new Bitmap(image); return result; #endif } 

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


рд╕реНрдореГрддрд┐ рдореЗрдВ рднрдВрдбрд╛рд░рдг рдорд╛рд╕реНрдХ


рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рддреЗрдЬреА рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд░реНрд╡рд░ рдХреЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рдлрд┐рд▓реНрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдорд╛рд╕реНрдХ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдореБрдЦреМрдЯрд╛ рдХреНрдпрд╛ рдкреНрд░рд╛рд░реВрдк рд╣реИ, рд╕рд░реНрд╡рд░ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдмрд┐рдЯрдореИрдк 4 * 2400 * 2400 рдпрд╛ тЙИ24 MB рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдЕрдзрд┐рдХрддрдо рдЫрд╡рд┐ рдЖрдХрд╛рд░ 2400 * 2400 ; рдкреНрд░рддрд┐ рдкрд┐рдХреНрд╕реЗрд▓ рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ 4 рд╣реИ)ред рдлрд┐рд▓реНрдЯрд░ ()30) рдФрд░ рдХреЛрд▓рд╛рдЬ (40) рдХреЗ рд▓рд┐рдП рд╕рднреА рдорд╛рд╕реНрдХ 1.5 рдЬреАрдмреА рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░реЗрдВрдЧреЗ - рдпрд╣ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ; рд╣рд╛рд▓рд╛рдБрдХрд┐, рдорд╛рд╕реНрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рдиреЗ рдкрд░ рдпрд╣ рд░рд╛рд╢рд┐ рдХрд╛рдлреА рдмрдврд╝ рд╕рдХрддреА рд╣реИред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд╣рдо рд╕рдВрднрд╡рддрдГ рд╕реНрдореГрддрд┐ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдорд╛рд╕реНрдХ (.jpg рдФрд░ .png рдкреНрд░рд╛рд░реВрдкреЛрдВ) рдХреЗ рд▓рд┐рдП рд╕рдВрдкреАрдбрд╝рди рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЬрдм рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рд╡рд┐рдШрдЯрди рдХреЗ рдмрд╛рджред рджрд░рдЕрд╕рд▓, рдЖрдХрд╛рд░ рдХреЛ 300 рдЧреБрдирд╛ рддрдХ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдкреАрдбрд╝рд┐рдд рдЪрд┐рддреНрд░реЛрдВ рдХреА рдирдХрд▓ рдмрдбрд╝реЗ рд▓реЛрдЧреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рд╣реЛрддреА рд╣реИ; рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд▓реЙрдХ рдСрдкрд░реЗрд╢рди рдореЗрдВ рдХрдо рд╕рдордп рд▓рдЧреЗрдЧрд╛ рдФрд░ рдереНрд░реЗрдбреНрд╕ рдХреЛ рдХрдо рдмрд╛рд░ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдиреЛрдЯреНрд╕


minification


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


рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдиреНрдпреВрдирддрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИрдВ:


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

рдореИрдиреБрдЕрд▓ minification рд╣реИ

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


 #if SCRIPTSHARP && !DEBUG [ScriptName("a0")] #endif 

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


рдПрдХ рдФрд░ рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдРрд╕реЗ рдЫреЛрдЯреЗ рдирд╛рдореЛрдВ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдпрджрд┐ рд╡реЗ рд╡рд┐рдзрд┐ рдФрд░ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдирд╛рдо (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдмрдЪреНрдЪреЗ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдУрд╡рд░рд░рд╛рдЗрдб рдирд╛рдо) рдХрд╛ рдирд╛рдо рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ # рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдирд╛рдореЛрдВ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░реЗрдЧреАред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдбреБрдкреНрд▓рд┐рдХреЗрдЯреЗрдб рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛ред


рд╡реИрд╕реЗ, рдирд┐рдЬреА рдФрд░ рдЖрдВрддрд░рд┐рдХ рддрд░реАрдХреЛрдВ рдФрд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ # рдХреЗ рд╡рд┐рдХрд╕рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЬреЛрдбрд╝ рджреА рдЧрдИ рдереАред


рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЦрдирди

рдпрджреНрдпрдкрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЦрдирди рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЙрдкрдХрд░рдг рд╣реИрдВ, рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмреНрд░рд╛рдВрдб рдФрд░ рд╕рдВрдкреАрдбрд╝рди рдХреА рдЕрдЪреНрдЫреА рдЧреБрдгрд╡рддреНрддрд╛ рдХреЗ рд▓рд┐рдП Google рдХреНрд▓реЛрдЬрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред Google рдХреЗ рдЦрдирди рдЙрдкрдХрд░рдг рдХрд╛ рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ CSS рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ; рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, YUI рдЗрд╕ рдЪреБрдиреМрддреА рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ # рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЫреЛрдЯрд╛ рднреА рдХрд░ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдЪреБрдиреМрддреА рдХреЛ Google рдХреНрд▓реЛрдЬрд░ рд╕реЗ рднреА рдмрджрддрд░ рдмрдирд╛ рджреЗрддреА рд╣реИред


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


рдбреАрдмрдЧ рдФрд░ рд░рд┐рд▓реАрдЬрд╝ рдореЛрдб


рдбреАрдмрдЧ рдФрд░ рд░рд┐рд▓реАрдЬрд╝ рд▓рд╛рдЗрдмреНрд░реЗрд░реА ASP.NET рдкреГрд╖реНрдареЛрдВ рдореЗрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЬреЛрдбрд╝реЗ рдЧрдП рдереЗ:


 <% if (Gfranq.JavaScriptFilters.HtmlHelper.IsDebug) { %> <script src="Scripts/mscorlib.debug.js" ></script> <script src="Scripts/imgProcLib.debug.js" ></script> <% } else { %> <script src="Scripts/mscorlib.js" ></script> <script src="Scripts/imgProcLib.js" ></script> <% } %> 

рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рд╣рдордиреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рд╡рд┐рд╡рд░рдг рдлрд╝рд╛рдЗрд▓реЛрдВ рджреЛрдиреЛрдВ рдХреЛ рдЫреЛрдЯрд╛ рдХрд░ рджрд┐рдпрд╛ред


crossOrigin рд╕рдВрдкрддреНрддрд┐


рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдЫрд╡рд┐ рдХреЗ рдкрд┐рдХреНрд╕рд▓ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдХреИрдирд╡рд╛рд╕ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдХреНрд░реЙрд╕ рдУрд░рд┐рдЬрд┐рди рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА (рдХреЛрд░) рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдерд╛:


  • рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдкрд░ crossOrigin = '' рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗрдЯ рдХрд░рдирд╛ред
  • рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдкрд░ HTTP рдкреИрдХреЗрдЬ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЗрдбрд░ рдЬреЛрдбрд╝рдирд╛ред

рдЪреВрдВрдХрд┐ ScriptSharp img рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдирд┐рдореНрди рдХреЛрдб рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛:


 [Imported] internal class AdvImage { [IntrinsicProperty] internal string CrossOrigin { get { return string.Empty; } set { } } } 

рдлрд┐рд░, рд╣рдо рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:


 ((AdvImage)(object)result).CrossOrigin = ""; 

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


рдРрд╕реА рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд╕рд░реНрд╡рд░ рдХреЛ рдЕрдкрдиреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реЗрдбрд░ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЗрдбрд░ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (Global.asax рдореЗрдВ):


 Response.AppendHeader("Access-Control-Allow-Origin", "\*"); 

рдХреНрд░реЙрд╕ рдУрд░рд┐рдЬрд┐рдирд▓ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП http://enable-cors.org/ рдкрд░ рдЬрд╛рдПрдБред


рдЕрдиреБрдХреВрд▓рди


Precalculated рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


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


рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдореА рд░рдВрдЧ рдШрдЯрдХреЛрдВ рдХреА рдЧрдгрдирд╛:


 for (int i = 0; i < 256; i++) { r[i] = ActionFuncR(i); g[i] = ActionFuncG(i); b[i] = ActionFuncB(i); } 

рдкреВрд░реНрд╡рдирд┐рд░реНрдорд┐рдд рд░рдВрдЧ рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ:


 for (int i = 0; i < data.Length; i += 4) { data[i] = r[data[i]]; data[i + 1] = g[data[i + 1]]; data[i + 2] = b[data[i + 2]]; } 

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


рдореВрд▓ рдХреЛрдбрдЕрдиреБрдХреВрд▓рд┐рдд рдХреЛрдб
`` `рд╕реАрдПрд╕
// рдкрд╣рд▓реА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдпреЛрдВ рдХреА рдЧрдгрдирд╛ред
for (int i = 0; рдореИрдВ <256; i ++)
{
r [i] = ActionFunc1R (i);
g [i] = ActionFunc1G (i);
b [i] = ActionFunc1B (i);
}
// ...

// рдкрд░рд┐рдгрд╛рдореА рдордзреНрдпрд╡рд░реНрддреА рдЫрд╡рд┐ рдХреА рдЧрдгрдирд╛ред
for (int i = 0; рдореИрдВ <data.Length; i + = 4)
{
data [i] = r [data [i]];
data [i + 1] = g [data [i + 1]];
data [i + 2] = b [data [i + 2]];
}
// ...

// рджреВрд╕рд░реА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдпреЛрдВ рдХреА рдЧрдгрдирд╛ред
for (int i = 0; рдореИрдВ <256; i ++)
{
r [i] = ActionFunc2R (i);
g [i] = ActionFunc2G (i);
b [i] = ActionFunc2B (i);
}
// ...

// рдкрд░рд┐рдгрд╛рдореА рдЫрд╡рд┐ рдХреА рдЧрдгрдирд╛ред
for (int i = 0; рдореИрдВ <data.Length; i + = 4)
{
data [i] = r [data [i]];
data [i + 1] = g [data [i + 1]];
data [i + 2] = b [data [i + 2]];
}
`` ``

`` `рд╕реАрдПрд╕
// рдкрд╣рд▓реА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдпреЛрдВ рдХреА рдЧрдгрдирд╛ред
for (int i = 0; рдореИрдВ <256; i ++)
{
r [i] = ActionFunc1R (i);
g [i] = ActionFunc1G (i);
b [i] = ActionFunc1B (i);
}
// ...

// рджреВрд╕рд░реА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдпреЛрдВ рдХреА рдЧрдгрдирд╛ред
tr = r.Clone ();
tg = g.Clone ();
tb = b.Clone ();
for (int i = 0; рдореИрдВ <256; i ++)
{
r [i] = tr [ActionFunc2R (i)];
g [i] = tg [ActionFunc2G (i)];
b [i] = tb [ActionFunc2B (i)];
}
// ...

// рдкрд░рд┐рдгрд╛рдореА рдЫрд╡рд┐ рдХреА рдЧрдгрдирд╛ред
for (int i = 0; рдореИрдВ <data.Length; i + = 4)
{
data [i] = r [data [i]];
data [i + 1] = g [data [i + 1]];
data [i + 2] = b [data [i + 2]];
}
`` ``


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


рдПрдХ рдЫрд╡рд┐ рдХреЛ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛


Google Chrome рдореЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдиреЗ рдЦреБрд▓рд╛рд╕рд╛ рдХрд┐рдпрд╛ рдХрд┐ GetImageData рдлрд╝рдВрдХреНрд╢рди (рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрдирд╡рд╛рд╕ рдХреЛ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд╕рд░рдгреА рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рддрд╛ рд╣реИред рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХреИрдирд╡рд╕ рдЕрдиреБрдХреВрд▓рди рдкрд░ рд╡рд┐рднрд┐рдиреНрди рд▓реЗрдЦреЛрдВ рдореЗрдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИред


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


рдХреЛрдб рдЙрджрд╛рд╣рд░рдг


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


рд╕рд╛рдорд╛рдиреНрдп


рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИ


 internal static bool IsNumeric(string n) { #if !SCRIPTSHARP return ((Number)int.Parse(n)).ToString() != "NaN"; #else double number; return double.TryParse(n, out number); #endif } 

рдкреВрд░реНрдгрд╛рдВрдХ рд╡рд┐рднрд╛рдЬрди


 internal static int Div(int n, int k) { int result = n / k; #if SCRIPTSHARP result = Math.Floor(n / k); #endif return result; } 

рдХреИрдирд╡рд╕ рдФрд░ рдмрд┐рдЯрдореИрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЗрдореЗрдЬ рдХреЛ рдШреБрдорд╛ рдФрд░ рдлрд╝реНрд▓рд┐рдк рдХрд░рдирд╛


рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдПрдЪрдЯреАрдПрдордПрд▓ 5 рдореЗрдВ рдХреИрдирд╡рд╕ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 90 рдФрд░ 180 рдбрд┐рдЧреНрд░реА рдШреБрдорд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ .NET рдмрдврд╝рд╛рдпрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреБрдХреНрдд рд╕рдЯреАрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред


рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ .NET рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХреЛрдИ рднреА рдкрдХреНрд╖ 90-рдбрд┐рдЧреНрд░реА рд░реЛрдЯреЗрд╢рди рдЧрд▓рдд рдкрд░рд┐рдгрд╛рдо рджреЗ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ RotateFlip рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдПрдХ рдирдпрд╛ Bitmap рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рд╕реНрд░реЛрдд рдХреЛрдб
 public static Bitmap RotateFlip(Bitmap bitmap, RotFlipType rotFlipType) { #if SCRIPTSHARP int t, i4, j4, w, h, c; if (rotFlipType == RotFlipType.RotateNoneFlipNone) return bitmap; GraphicsContext context; PixelArray data; if (rotFlipType == RotFlipType.RotateNoneFlipX) { context = GraphicsContext.GetContext(bitmap); data = context.GetPixelArray(); w = bitmap.Width; h = bitmap.Height; for (int i = 0; i < h; i++) { c = (i + 1) * w * 4 - 4; for (int j = 0; j < w / 2; j++) { i4 = (i * w + j) * 4; j4 = j * 4; t = (int)data[i4]; data[i4] = data[c - j4]; data[c - j4] = t; t = (int)data[i4 + 1]; data[i4 + 1] = data[c - j4 + 1]; data[c - j4 + 1] = t; t = (int)data[i4 + 2]; data[i4 + 2] = data[c - j4 + 2]; data[c - j4 + 2] = t; t = (int)data[i4 + 3]; data[i4 + 3] = data[c - j4 + 3]; data[c - j4 + 3] = t; } } context.PutImageData(); } else if (rotFlipType == RotFlipType.Rotate180FlipNone || rotFlipType == RotFlipType.Rotate180FlipX) { context = GraphicsContext.GetContext(bitmap); data = context.GetPixelArray(); w = bitmap.Width; h = bitmap.Height; c = w * 4 - 4; int dlength4 = data.Length - 4; for (int i = 0; i < data.Length / 4 / 2; i++) { i4 = i * 4; if (rotFlipType == RotFlipType.Rotate180FlipNone) j4 = i4; else j4 = (Math.Truncate((double)i / w) * w + (w - i % w)) * 4; t = (int)data[j4]; data[j4] = data[dlength4 - i4]; data[dlength4 - i4] = t; t = (int)data[j4 + 1]; data[j4 + 1] = data[dlength4 - i4 + 1]; data[dlength4 - i4 + 1] = t; t = (int)data[j4 + 2]; data[j4 + 2] = data[dlength4 - i4 + 2]; data[dlength4 - i4 + 2] = t; t = (int)data[j4 + 3]; data[j4 + 3] = data[dlength4 - i4 + 3]; data[dlength4 - i4 + 3] = t; } context.PutImageData(); } else { Bitmap tempBitmap = PrivateUtils.CreateCloneBitmap(bitmap); GraphicsContext tempContext = GraphicsContext.GetContext(tempBitmap); PixelArray temp = tempContext.GetPixelArray(); t = bitmap.Width; bitmap.Width = bitmap.Height; bitmap.Height = t; context = GraphicsContext.GetContext(bitmap); data = context.GetPixelArray(); w = tempBitmap.Width; h = tempBitmap.Height; if (rotFlipType == RotFlipType.Rotate90FlipNone || rotFlipType == RotFlipType.Rotate90FlipX) { c = w * h - w; for (int i = 0; i < temp.Length / 4; i++) { t = Math.Truncate((double)i / h); if (rotFlipType == RotFlipType.Rotate90FlipNone) i4 = i * 4; else i4 = (t * h + (h - i % h)) * 4; j4 = (c - w * (i % h) + t) * 4; //j4 = (w * (h - 1 - i4 % h) + i4 / h) * 4; data[i4] = temp[j4]; data[i4 + 1] = temp[j4 + 1]; data[i4 + 2] = temp[j4 + 2]; data[i4 + 3] = temp[j4 + 3]; } } else if (rotFlipType == RotFlipType.Rotate270FlipNone || rotFlipType == RotFlipType.Rotate270FlipX) { c = w - 1; for (int i = 0; i < temp.Length / 4; i++) { t = Math.Truncate((double)i / h); if (rotFlipType == RotFlipType.Rotate270FlipNone) i4 = i * 4; else i4 = (t * h + (h - i % h)) * 4; j4 = (c + w * (i % h) - t) * 4; // j4 = w * (1 + i4 % h) - i4 / h - 1; data[i4] = temp[j4]; data[i4 + 1] = temp[j4 + 1]; data[i4 + 2] = temp[j4 + 2]; data[i4 + 3] = temp[j4 + 3]; } } context.PutImageData(); } return bitmap; #elif DOTNET Bitmap result = null; switch (rotFlipType) { case RotFlipType.RotateNoneFlipNone: result = bitmap; break; case RotFlipType.Rotate90FlipNone: bitmap.RotateFlip(RotateFlipType.Rotate90FlipNone); result = new Image(bitmap); bitmap.Dispose(); break; case RotFlipType.Rotate270FlipNone: bitmap.RotateFlip(RotateFlipType.Rotate270FlipNone); result = new Image(bitmap); bitmap.Dispose(); break; case RotFlipType.Rotate180FlipNone: bitmap.RotateFlip(RotateFlipType.Rotate180FlipNone); result = bitmap; break; case RotFlipType.RotateNoneFlipX: bitmap.RotateFlip(RotateFlipType.RotateNoneFlipX); result = bitmap; break; case RotFlipType.Rotate90FlipX: bitmap.RotateFlip(RotateFlipType.Rotate90FlipX); result = new Image(bitmap); bitmap.Dispose(); break; case RotFlipType.Rotate180FlipX: bitmap.RotateFlip(RotateFlipType.Rotate180FlipX); result = bitmap; break; case RotFlipType.Rotate270FlipX: bitmap.RotateFlip(RotateFlipType.Rotate270FlipX); result = new Image(bitmap); bitmap.Dispose(); break; } return result; #endif } 

рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЫрд╡рд┐ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ


рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ # рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╣рдо рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди CollageImageLoad рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдПрдХ рдЫрд╡рд┐ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ .NET рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдпреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдПрдХ рд╕рд╛рде (рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдпрд╛ рдЗрдВрдЯрд░рдиреЗрдЯ рд╕реЗ) рд╣реЛрддреА рд╣реИрдВред


рд╕реНрд░реЛрдд рдХреЛрдб
 public CollageData(string smallMaskPath, string bigMaskPath, List<CollageDataPart> dataParts) { SmallMaskImagePath = smallMaskPath; BigMaskImagePath = bigMaskPath; #if SCRIPTSHARP CurrentMask = PrivateUtils.CreateEmptyImage(); CurrentMask.AddEventListener("load", CollageImageLoad, false); CurrentMask.Src = CurrentMaskImagePath; #else CurrentMask = PrivateUtils.LoadBitmap(CurrentMaskImagePath); if (!CurrentMaskImagePath.Contains("http://") && !CurrentMaskImagePath.Contains("https://")) CurrentMask = Bitmap(CurrentMaskImagePath); else { var request = WebRequest.Create(CurrentMaskImagePath); using (var response = request.GetResponse()) using (var stream = response.GetResponseStream()) CurrentMask = (Bitmap)Bitmap.FromStream(stream); } #endif DataParts = dataParts; } 

рд▓рд┐рдкрд┐ # рдХреЗрд╡рд▓


рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛


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


рд╕реНрд░реЛрдд рдХреЛрдб
 internal static string BrowserVersion { get { DetectBrowserTypeAndVersion(); return _browserVersion; } } private static void DetectBrowserTypeAndVersion() { if (!_browserDetected) { string userAgent = Window.Navigator.UserAgent.ToLowerCase(); if (userAgent.IndexOf("opera") != -1) _browser = BrowserType.Opera; else if (userAgent.IndexOf("chrome") != -1) _browser = BrowserType.Chrome; else if (userAgent.IndexOf("safari") != -1) _browser = BrowserType.Safari; else if (userAgent.IndexOf("firefox") != -1) _browser = BrowserType.Firefox; else if (userAgent.IndexOf("msie") != -1) { int numberIndex = userAgent.IndexOf("msie") + 5; _browser = BrowserType.IE; _browserVersion = userAgent.Substring(numberIndex, userAgent.IndexOf(';', numberIndex)); } else _browser = BrowserType.Unknown; _browserDetected = true; } } 

рдПрдХ рдбреИрд╢-рдбреЙрдЯ рд▓рд╛рдЗрди рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди


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


рд╕реНрд░реЛрдд рдХреЛрдб
 internal static void DrawDahsedLine(GraphicsContext context, double x1, double y1, double x2, double y2, int[] dashArray) { if (dashArray == null) dashArray = new int[2] { 10, 5 }; int dashCount = dashArray.Length; double dx = x2 - x1; double dy = y2 - y1; bool xSlope = Math.Abs(dx) > Math.Abs(dy); double slope = xSlope ? dy / dx : dx / dy; context.MoveTo(x1, y1); double distRemaining = Math.Sqrt(dx * dx + dy * dy); int dashIndex = 0; while (distRemaining >= 0.1) { int dashLength = (int)Math.Min(distRemaining, dashArray[dashIndex % dashCount]); double step = Math.Sqrt(dashLength * dashLength / (1 + slope * slope)); if (xSlope) { if (dx < 0) step = -step; x1 += step; y1 += slope * step; } else { if (dy < 0) step = -step; x1 += slope * step; y1 += step; } if (dashIndex % 2 == 0) context.LineTo(x1, y1); else context.MoveTo(x1, y1); distRemaining -= dashLength; dashIndex++; } } 

рд░реЛрдЯреЗрд╢рди рдПрдиреАрдореЗрд╢рди


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


рд╕реНрд░реЛрдд рдХреЛрдб
 public void Rotate(bool cw) { if (!_rotating && !_flipping) { _rotating = true; _cw = cw; RotFlipType oldRotFlipType = _curRotFlipType; _curRotFlipType = RotateRotFlipValue(_curRotFlipType, _cw); int currentStep = 0; int stepCount = (int)(RotateFlipTimeSeconds * 1000 / StepTimeTicks); Bitmap result = null; _interval = Window.SetInterval(delegate() { if (currentStep < stepCount) { double absAngle = GetAngle(oldRotFlipType) + currentStep / stepCount * Math.PI / 2 * (_cw ? -1 : 1); DrawRotated(absAngle); currentStep++; } else { Window.ClearInterval(_interval); if (result != null) Draw(result); _rotating = false; } }, StepTimeTicks); result = GetCurrentTransformResult(); if (!_rotating) Draw(result); } } private void DrawRotated(double rotAngle) { _resultContext.FillColor = FillColor; _resultContext.FillRect(0, 0, _result.Width, _result.Height); _resultContext.Save(); _resultContext._graphics.Translate(_result.Width / 2, _result.Height / 2); _resultContext._graphics.Rotate(-rotAngle); _resultContext._graphics.Translate(-_origin.Width / 2, -_origin.Height / 2); _resultContext._graphics.DrawImage(_origin, 0, 0); _resultContext.Restore(); } private void Draw(Bitmap bitmap) { _resultContext.FillColor = FillColor; _resultContext.FillRect(0, 0, _result.Width, _result.Height); _resultContext.Draw2(bitmap, (int)((_result.Width - bitmap.Width) / 2), (int)((_result.Height - bitmap.Height) / 2)); } 

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


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

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


All Articles