рд╣рдо рдЪрд┐рдВрд░рд╛рдЯ рдХреЛ рдФрд░ рднреА рдЙрдкрдпреЛрдЧреА рдмрдирд╛рддреЗ рд╣реИрдВ: рдЫрд╡рд┐ рдХреЛ рдЕрдиреНрдп рдкреНрд░рд╛рд░реВрдкреЛрдВ рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдХреЛрдбрд┐рдВрдЧ рдХрд░рддреЗ рд╣реИрдВ



2017 рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ, рд╣рдорд╛рд░реА рдЫреЛрдЯреА рдЯреАрдо C ++ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ HTTP рд╕рд░реНрд╡рд░ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Restinio OpenSource рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реА рд╣реИред рд╣рдорд╛рд░реЗ рдорд╣рд╛рди рдЖрд╢реНрдЪрд░реНрдп рдХреЗ рд▓рд┐рдП, рд╕рдордп-рд╕рдордп рдкрд░ рд╣рдореЗрдВ рд╢реНрд░реЗрдгреА рд╕реЗ рдкреНрд░рд╢реНрди рдорд┐рд▓рддреЗ рд╣реИрдВ "рдФрд░ рдПрдХ рдПрдореНрдмреЗрдбреЗрдб рд╕реА ++ HTTP рд╕рд░реНрд╡рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ?" рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╕рд░рд▓ рдкреНрд░рд╢реНрди рдЙрддреНрддрд░ рджреЗрдиреЗ рдореЗрдВ рд╕рдмрд╕реЗ рдХрдард┐рди рд╣реИрдВред рдХрднреА-рдХрднреА рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЬрд╡рд╛рдм рдирдореВрдирд╛ рдХреЛрдб рд╣реЛрддрд╛ рд╣реИред

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

рдпрд╣ рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЙрд╕ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕реЗ C рдпрд╛ C ++ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, ImageMagick) рдореЗрдВ рд╕рд╣реА рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдПрдХреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ C ++ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ HTTP рд╕рд░реНрд╡рд░ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреНрдпреЛрдВ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рддрд╛рдХрд┐ HTTP рд╕рд░реНрд╡рд░ рдЕрд╡рд░реБрджреНрдз рди рд╣реЛ, рдЬрдмрдХрд┐ рдЫрд╡рд┐ рдХреЛ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ (рдФрд░ рдпрд╣ рд╕реИрдХрдбрд╝реЛрдВ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдпрд╛ рд╕реЗрдХрдВрдб рднреА рд▓реЗ рд╕рдХрддрд╛ рд╣реИ)ред рдФрд░ рд╣рдордиреЗ Restinio рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдареАрдХ рд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рд╕рдордЭрджрд╛рд░ C ++ рдПрдореНрдмреЗрдбреЗрдб рд╕рд░реНрд╡рд░ рдирд╣реАрдВ рдкрд╛ рд╕рдХреЗред

рд╣рдордиреЗ рд╢реНрд░рд┐рдореНрдк рдкрд░ рдХрд╛рд░реНрдп рдХреЛ рдЪрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рд╣реИ: рдкрд╣рд▓реЗ, рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдиреЗ рдХреЗрд╡рд▓ рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдмрдврд╝рд╛рдпрд╛ред рдлрд┐рд░ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдХрдИ рдХрдорд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ рдФрд░ рджреВрд╕рд░реЗ рд▓реЗрдЦ рдореЗрдВ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ ред рдЕрдВрдд рдореЗрдВ, рд╣рдо рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдЭреАрдВрдЧрд╛ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд╛рд░реЛрдВ рдУрд░ рд╣реЛ рдЧрдП: рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдПрдХ рдкреНрд░рд╛рд░реВрдк рд╕реЗ рджреВрд╕рд░реЗ рд╕реНрд╡рд░реВрдк рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред

рд▓рдХреНрд╖реНрдп-рдкреНрд░рд╛рд░реВрдк рдХрд╛ рд╕рдорд░реНрдерди


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

curl "http://localhost:8080/my_picture.jpg?op=resize&max=1920" 

рддрдм рдЪрд┐рдВрд░рд╛рдЯ рдЫрд╡рд┐ рдХреЛ рдЙрд╕реА JPG рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдореВрд▓ рдЫрд╡рд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдЧрд╛ред

рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк URL рдореЗрдВ рд▓рдХреНрд╖реНрдп-рдкреНрд░рд╛рд░реВрдк рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдЪрд┐рдВрд░рд╛рдЯ рдЫрд╡рд┐ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд▓рдХреНрд╖реНрдп рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 curl "http://localhost:8080/my_picture.jpg?op=resize&max=1920&target-format=webp" 

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЪрд┐рдВрд░рд╛рдЯ рд╡реЗрдм рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЫрд╡рд┐ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдЧрд╛ред

рдЕрдкрдбреЗрдЯ рдХреА рдЧрдИ рдЪрд┐рдВрд░рд╛рдЯ рдкрд╛рдБрдЪ рдЫрд╡рд┐ рд╕реНрд╡рд░реВрдкреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИ: jpg, png, gif, webp рдФрд░ heic (HEIF рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдЖрдк рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡реЗрдм рдкреЗрдЬ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:



(рдЗрд╕ рдкреГрд╖реНрда рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд╛рдзрд╛рд░рдг рдбреЗрд╕реНрдХрдЯреЙрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ)ред

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

ImageMagick рдХреЛ рд╡рд┐рднрд┐рдиреНрди рд╕реНрд╡рд░реВрдкреЛрдВ рдХреЛ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдП


ImageMagick рдЗрдирдХреЛрдбрд┐рдВрдЧ / рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдЗрдореЗрдЬ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ: libjpeg, libpng, libgif, рдЖрджрд┐ред ImageMagick рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдФрд░ рдирд┐рд░реНрдорд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

WebM рдФрд░ heic рд╕реНрд╡рд░реВрдкреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ImageMagick рдХреЗ рд▓рд┐рдП рднреА рдпрд╣реА рдмрд╛рдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ libwebp рдФрд░ libheif рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдлрд┐рд░ ImageMagick рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдФрд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВред рдФрд░ рдЕрдЧрд░ рд╕рдм рдХреБрдЫ libwebp рдХреЗ рд╕рд╛рде рд╕рд░рд▓ рд╣реИ, рддреЛ libheif рдХреЗ рдЖрд╕рдкрд╛рд╕ рдореБрдЭреЗ рдПрдХ рдирдЦрд░реЗ рдХреЗ рд╕рд╛рде рдиреГрддреНрдп рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдпрджреНрдпрдкрд┐ рдХреБрдЫ рд╕рдордп рдХреЗ рдмрд╛рдж, рдЖрдЦрд┐рд░рдХрд╛рд░ рд╕рдм рдХреБрдЫ рдЗрдХрдЯреНрдард╛ рд╣реЛ рдЧрдпрд╛ рдФрд░ рдХрд╛рдо рдХрд┐рдпрд╛, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛: рдЖрдкрдХреЛ рдПрдХ рдирдЦрд░реЗ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рдХреНрдпреЛрдВ рд▓реЗрдирд╛ рдкрдбрд╝рд╛, рд╕рдм рдХреБрдЫ рддреБрдЪреНрдЫ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ? ;)

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


рдпрд╣ рдЗрд╕ рдХреНрд░рдо рдореЗрдВ рд╣реИ (рдЖрдкрдХреЛ nasm рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ x265 рдЕрдзрд┐рдХрддрдо рдЧрддрд┐ рд╕реЗ рдХрд╛рдо рдХрд░реЗ)ред рдлрд┐рд░, ./configure рдХрдорд╛рдВрдб рдЬрд╛рд░реА рдХрд░рддреЗ рд╕рдордп, ImageMagick рдХреЛ .he рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдЪреАрдЬрд╝реЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред

рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдХреНрд╡реЗрд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рд▓рдХреНрд╖реНрдп-рдкреНрд░рд╛рд░реВрдк рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди


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

Restinio рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдЦреИрд░, рдПрдХ рдФрд░ рддрд░реНрдХ рдХреНрд╡реЗрд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рддреЛ рдХреНрдпрд╛? рд▓реЗрдХрд┐рди рдЭреАрдВрдЧрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рд╕реНрдерд┐рддрд┐ рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЧрдИ, рдЗрд╕рд▓рд┐рдП HTTP рдЕрдиреБрд░реЛрдз рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХреЛрдб рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЧрдпрд╛ред

рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдХреЗрд╡рд▓ рджреЛ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЕрдВрддрд░ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛:

  • рдХрд┐рд╕реА рдЕрдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдмрд┐рдирд╛ "/filename.ext" рдлреЙрд░реНрдо рдХрд╛ рдЕрдиреБрд░реЛрдз рдЖрдпрд╛ред рддреЛ рдЖрдкрдХреЛ рдмрд╕ рдлрд╝рд╛рдЗрд▓ "filename.ext" рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╣реИ;
  • рдПрдХ рдЕрдиреБрд░реЛрдз "/filename.ext?op=resize & ..." рдлрд╝реЙрд░реНрдо рдореЗрдВ рдЖрдпрд╛ рдерд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓ "filename.ext" рд╕реЗ рдЫрд╡рд┐ рдХреЛ рд╕реНрдХреЗрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рд▓рдХреНрд╖реНрдп-рдкреНрд░рд╛рд░реВрдк рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдЪрд╛рд░ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЕрдВрддрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

  • рдХрд┐рд╕реА рдЕрдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдмрд┐рдирд╛ "/filename.ext" рдлреЙрд░реНрдо рдХрд╛ рдЕрдиреБрд░реЛрдз рдЖрдпрд╛ред рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓ рдХреЛ "рдлрд╝рд╛рдЗрд▓рдирд╛рдоред рдЯреЗрдХреНрд╕реНрдЯ" рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛ рдФрд░ рджреВрд╕рд░реЗ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдХреЛрдбрд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛ рд╣реИ;
  • рдХрд┐рд╕реА рдЕрдиреНрдп рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд┐рдирд╛ "/filename.ext?target-format=fmt" рдлреЙрд░реНрдо рдХрд╛ рдЕрдиреБрд░реЛрдз рдЖрдпрд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдПрдХ рдЫрд╡рд┐ "рдлрд╝рд╛рдЗрд▓рдирд╛рдоред рдХрд╕реНрдЯрдо" рдФрд░ рдЗрд╕реЗ рдореВрд▓ рдЖрдХрд╛рд░реЛрдВ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реБрдП рдкреНрд░рд╛рд░реВрдк "рдПрдлрдЯреАрдПрдо" рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдХреЛрдб рдХрд░реЗрдВ;
  • рдПрдХ рдЕрдиреБрд░реЛрдз "/filename.ext?op=resize & ..." рдлрд╝реЙрд░реНрдо рдХрд╛ рдЖрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд▓рдХреНрд╖реНрдп-рд╕реНрд╡рд░реВрдк рдХреЗ рдмрд┐рдирд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рд╕реНрдХреЗрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдФрд░ рдЗрд╕реЗ рдореВрд▓ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рджреЗрдВ;
  • рдПрдХ рдЕрдиреБрд░реЛрдз "/filename.ext?op=resize&...&target-format=fmm" рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдпрд╛ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдкрдХреЛ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ "fmt" рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдХреЛрдб рдХрд░реЗрдВред

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдХреНрд╡реЗрд░реА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдиреЗ рдирд┐рдореНрди рд░реВрдк рд▓рд┐рдпрд╛:

 void add_transform_op_handler( const app_params_t & app_params, http_req_router_t & router, so_5::mbox_t req_handler_mbox ) { router.http_get( R"(/:path(.*)\.:ext(.{3,4}))", restinio::path2regex::options_t{}.strict( true ), [req_handler_mbox, &app_params]( auto req, auto params ) { if( has_illegal_path_components( req->header().path() ) ) { //     . return do_400_response( std::move( req ) ); } //   . const auto qp = restinio::parse_query( req->header().query() ); const auto target_format = qp.get_param( "target-format"sv ); //        // .   target-format,    //   .   target-format  // ,    ,  //    . const auto image_format = try_detect_target_image_format( params[ "ext" ], target_format ); if( !image_format ) { //     .   . return do_400_response( std::move( req ) ); } if( !qp.size() ) { //    ,    . return serve_as_regular_file( app_params.m_storage.m_root_dir, std::move( req ), *image_format ); } const auto operation = qp.get_param( "op"sv ); if( operation && "resize"sv != *operation ) { //    ,     resize. return do_400_response( std::move( req ) ); } if( !operation && !target_format ) { //      op=resize, //   target-format=something. return do_400_response( std::move( req ) ); } handle_resize_op_request( req_handler_mbox, *image_format, qp, std::move( req ) ); return restinio::request_accepted(); } ); } 

рдЭреАрдВрдЧрд╛ рдХреЗ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рдЫрд╡рд┐ рдХреЛ рдЯреНрд░рд╛рдВрд╕рдХреЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереА, рдЕрдиреБрд░реЛрдз рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдЖрд╕рд╛рди рдерд╛ ред

рд▓рдХреНрд╖реНрдп-рд╕реНрд╡рд░реВрдк рдХреЗ рдЕрдиреБрд░реВрдк рдХрддрд╛рд░ рдФрд░ рдЫрд╡рд┐ рдХреИрд╢ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ


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

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

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

  • рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд▓рдХреНрд╖реНрдп рдЫрд╡рд┐ рдкреНрд░рд╛рд░реВрдк (рдпрд╛рдиреА, рдореВрд▓ рдЫрд╡рд┐ jpg рдореЗрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдореА рдЫрд╡рд┐ png рдореЗрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ);
  • рджреВрд╕рд░реЗ, рдпрд╣ рддрдереНрдп рдХрд┐ рддрд╕реНрд╡реАрд░ рдХреЛ рд╕реНрдХреЗрд▓ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЧреНрд░рд╛рд╣рдХ рдХреЗрд╡рд▓ рдЫрд╡рд┐ рдХреЛ рдПрдХ рдкреНрд░рд╛рд░реВрдк рд╕реЗ рджреВрд╕рд░реЗ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдмрджрд▓рдиреЗ рдХрд╛ рдЖрджреЗрд╢ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЫрд╡рд┐ рдХреЗ рдореВрд▓ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рдеред

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

рдРрд╕реЗ рджреЛрд╣рд░реЗ рдХреИрд╢рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реЛрдЧреА? рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдордп рдореЗрдВ рджреЛ рд╕рдмрд╕реЗ рдорд╣рдВрдЧреЗ рдСрдкрд░реЗрд╢рди рдЖрдХрд╛рд░ рдмрджрд▓ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЪрд┐рддреНрд░ рдХреЛ рд▓рдХреНрд╖реНрдп рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдХреНрд░рдордмрджреНрдз рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рд╣рдореЗрдВ example.jpg рдЪрд┐рддреНрд░ рдХреЛ рдЪреМрдбрд╝рд╛рдИ рдореЗрдВ 1920 рдХреЗ рдЖрдХрд╛рд░ рдореЗрдВ рдмрджрд▓рдиреЗ рдФрд░ рдЗрд╕реЗ рд╡реЗрдм рд╕реНрд╡рд░реВрдк рдореЗрдВ рдмрджрд▓рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ, рддреЛ рд╣рдо рдЕрдкрдиреА рдореЗрдореЛрд░реА рдореЗрдВ рджреЛ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: example_1920px_width.jpg рдФрд░ example_1920px_width.webpред рдЬрдм рд╣рдо рджреВрд╕рд░рд╛ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдПрдХ example_1920px_width.webp рддрд╕реНрд╡реАрд░ рджреЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдЙрджрд╛рд╣рд░рдг_1920px_width.jpg рдЪрд┐рддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЪреМрдбрд╝рд╛рдИ рдореЗрдВ 1920 рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдФрд░ рдЗрд╕реЗ рд╡рд┐рд╖рдо рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдмрджрд▓ рджреЗрдВред рд╣рдо рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рд╡рд╛рд▓реЗ рдСрдкрд░реЗрд╢рди рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдкреНрд░рд╛рд░реВрдк рд░реВрдкрд╛рдВрддрд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╛рдиреА, рд╕рдорд╛рдкреНрдд рдЫрд╡рд┐ рдЙрджрд╛рд╣рд░рдг_1920px_width.jpg рдХреЛ рд╡рд┐рд╖рдо рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдХреЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред

рдПрдХ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрд╡рд╕рд░: рдЬрдм рдХреЛрдИ рдЖрдХрд╛рд░ рдХрд┐рд╕реА рдЪрд┐рддреНрд░ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдмрд┐рдирд╛ рдЖрдХрд╛рд░ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдЯреНрд░рд╛рдВрд╕рдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЫрд╡рд┐ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрдХрд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдордЧреНрд░ рдХреБрдВрдЬреА рдХреЗ рдЕрдВрджрд░ рдЗрд╕ рдЖрдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, example.jpg рдХрд╛ рдЖрдХрд╛рд░ 3000x2000 рдкрд┐рдХреНрд╕реЗрд▓ рд╣реИред рдпрджрд┐ рд╣рдо рдЕрдЧрд▓реА рдмрд╛рд░ рдКрдБрдЪрд╛рдИ рдкрд░ 2000px рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рддреБрд░рдВрдд рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдЖрдХрд╛рд░ рдореЗрдВ рдПрдХ рдЪрд┐рддреНрд░ рд╣реИред

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

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

 class resize_request_key_t { std::string m_path; image_format_t m_format; resize_params_t m_params; public: resize_request_key_t( std::string path, image_format_t format, resize_params_t params ) : m_path{ std::move(path) } , m_format{ format } , m_params{ params } {} [[nodiscard]] bool operator<(const resize_request_key_t & o ) const noexcept { return std::tie( m_path, m_format, m_params ) < std::tie( o.m_path, o.m_format, o.m_params ); } [[nodiscard]] const std::string & path() const noexcept { return m_path; } [[nodiscard]] image_format_t format() const noexcept { return m_format; } [[nodiscard]] resize_params_t params() const noexcept { return m_params; } }; 

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

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

рд▓реЗрдХрд┐рди рдирдИ рдЭреАрдВрдЧрд╛ рдореЗрдВ, рдПрдХ рдФрд░ рдореЛрдб рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ - Keep_original, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЪрд┐рддреНрд░ рдЕрдкрдиреЗ рдореВрд▓ рдЖрдХрд╛рд░ рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдореЛрдб рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, resize_params_t рдХреЛ рдХреБрдЫ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдереЗред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЕрдм resize_params_t :: make () рд╡рд┐рдзрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ Keep_original рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдЖрд╡рдХ рдЕрдиреБрд░реЛрдз рдХреЗ рдХреНрд╡реЗрд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдХреЛрдИ рднреА рдЪреМрдбрд╝рд╛рдИ, рдКрдВрдЪрд╛рдИ рдФрд░ рдЕрдзрд┐рдХрддрдо рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реИ)ред рдЗрд╕рдиреЗ рд╣рдореЗрдВ handle_resize_op_request () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА, рдЬреЛ рддрд╕реНрд╡реАрд░ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рддрд╛ рд╣реИред

рджреВрд╕рд░реЗ, resize_params_t :: value () рд╡рд┐рдзрд┐ рдХреЛ рдЕрдм рд╣рдореЗрд╢рд╛ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЬрдм рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдореЛрдб Keep_original рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ resize_params_t :: рдСрдкрд░реЗрдЯрд░ <() рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрд╛ рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдЗрд░рд╛рджрд╛ рдерд╛ред

A_transform_manager рдореЗрдВ рдЗрди рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╕реНрдХреЗрд▓ рдХреА рдЧрдИ рдЫрд╡рд┐ рдХреИрд╢ рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдХрддрд╛рд░ рд╕рдорд╛рди рдмрдиреА рд╣реБрдИ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдм, рдЗрди рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рддреЛ, рдХреБрдВрдЬреА {"example.jpg", "jpg", Keep_original} рджреЛрдиреЛрдВ рдХреБрдВрдЬреА {"example.jpg", "png", keep_original} рдФрд░ рдХреБрдВрдЬреА {"example .jpg", "jpg", рдЪреМрдбрд╝рд╛рдИ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрдВрдЧреЗред = 1920px}ред

рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ resize_params_t рдФрд░ resize_params_key_t рдЬреИрд╕реЗ рд╕рд░рд▓ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдЦрд░рд╛рдм рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд╣рдо рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЫрд╡рд┐рдпреЛрдВ рдХреА рдХреИрд╢ рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдХрддрд╛рд░ред

A_transformer рдореЗрдВ рд▓рдХреНрд╖реНрдп-рд╕реНрд╡рд░реВрдк рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди


рдЦреИрд░, рд▓рдХреНрд╖реНрдп-рдкреНрд░рд╛рд░реВрдк рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдореЗрдВ рдЕрдВрддрд┐рдо рдЪрд░рдг a_transformer рдПрдЬреЗрдВрдЯ рдХреЗ рддрд░реНрдХ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рд╣реИ рддрд╛рдХрд┐ рдЪрд┐рддреНрд░, рд╕рдВрднрд╡рддрдГ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдХреЗрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ, рдлрд┐рд░ рд▓рдХреНрд╖реНрдп рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рдПред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реЛ рдЧрдпрд╛, рдЬрд┐рд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рд╡рд╣ рдерд╛ рдХрд┐ a_transform_t :: handle_resize_request () рд╡рд┐рдзрд┐ рдХреЗ рдХреЛрдб рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛:

 [[nodiscard]] a_transform_manager_t::resize_result_t::result_t a_transformer_t::handle_resize_request( const transform::resize_request_key_t & key ) { try { m_logger->trace( "transformation started; request_key={}", key ); auto image = load_image( key.path() ); const auto resize_duration = measure_duration( [&]{ //       //    keep_original. if( transform::resize_params_t::mode_t::keep_original != key.params().mode() ) { transform::resize( key.params(), total_pixel_count, image ); } } ); m_logger->debug( "resize finished; request_key={}, time={}ms", key, std::chrono::duration_cast<std::chrono::milliseconds>( resize_duration).count() ); image.magick( magick_from_image_format( key.format() ) ); datasizable_blob_shared_ptr_t blob; const auto serialize_duration = measure_duration( [&] { blob = make_blob( image ); } ); m_logger->debug( "serialization finished; request_key={}, time={}ms", key, std::chrono::duration_cast<std::chrono::milliseconds>( serialize_duration).count() ); return a_transform_manager_t::successful_resize_t{ std::move(blob), std::chrono::duration_cast<std::chrono::microseconds>( resize_duration), std::chrono::duration_cast<std::chrono::microseconds>( serialize_duration) }; } catch( const std::exception & x ) { return a_transform_manager_t::failed_resize_t{ x.what() }; } } 

рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ , рджреЛ рдореМрд▓рд┐рдХ рдЬреЛрдбрд╝ рд╣реИрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд╛рджреВ image.magick () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ред рдпрд╣ рд╡рд┐рдзрд┐ ImageMagick рдкрд░рд┐рдгрд╛рдореА рдЫрд╡рд┐ рдкреНрд░рд╛рд░реВрдк рдХреЛ рдмрддрд╛рддреА рд╣реИред рдЙрд╕реА рд╕рдордп, рдореЗрдореЛрд░реА рдореЗрдВ рдЫрд╡рд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ - рдЗрдореЗрдЬрдореИрдЬрд┐рдХ рдЗрд╕реЗ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрд╕реЗ рд╕реВрдЯ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореИрдЬрд┐рдХ () рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдореВрд▓реНрдп рдХреЛ рдЗрдореЗрдЬ :: рд░рд╛рдЗрдЯ () рдХреЗ рдмрд╛рдж рдХреЗ рдХреЙрд▓ рдХреЗ рджреМрд░рд╛рди рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред

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

рдмрд╛рдХреА рдПрдЬреЗрдВрдЯ a_transformer_t рдиреЗ рдХреЛрдИ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред

ImageMagick рд╕рдорд╛рдирд╛рдВрддрд░рдХрд░рдг


рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, ImageMagic OpenMP рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╛рдиреА ImageMagick рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЫрд╡рд┐рдпреЛрдВ рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдЖрдк рдкрд░рд┐рд╡реЗрд╢ рдЪрд░ MAGICK_THREAD_LIMIT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ ImageMagick рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдг рдорд╢реАрди рдкрд░ MAGICK_THREAD_LIMIT = 1 рдХреЗ рд╕рд╛рде (рдпрд╛рдиреА, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╛рдирд╛рдВрддрд░ рдХреЗ рдмрд┐рдирд╛), рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддреЗ рд╣реИрдВ:

 curl "http://localhost:8080/DSC08084.jpg?op=resize&max=2400" -v > /dev/null > GET /DSC08084.jpg?op=resize&max=2400 HTTP/1.1 > Host: localhost:8080 > User-Agent: curl/7.47.0 > Accept: */* > < HTTP/1.1 200 OK < Connection: keep-alive < Content-Length: 2043917 < Server: Shrimp draft server < Date: Wed, 15 Aug 2018 11:51:24 GMT < Last-Modified: Wed, 15 Aug 2018 11:51:24 GMT < Access-Control-Allow-Origin: * < Access-Control-Expose-Headers: Shrimp-Processing-Time, Shrimp-Resize-Time, Shrimp-Encoding-Time, Shrimp-Image-Src < Content-Type: image/jpeg < Shrimp-Image-Src: transform < Shrimp-Processing-Time: 1323 < Shrimp-Resize-Time: 1086.72 < Shrimp-Encoding-Time: 236.276 

рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рддрд╛рдпрд╛ рдЧрдпрд╛ рд╕рдордп рдЪрд┐рдВрд░рд╛рдЯ-рдЖрдХрд╛рд░-рд╕рдордп рд╢реАрд░реНрд╖рдХ рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ 1086.72ms рд╣реИред

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдПрдХ рд╣реА рдорд╢реАрди рдкрд░ MAGICK_THREAD_LIMIT = 3 рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЭреАрдВрдЧрд╛ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореВрд▓реНрдп рдорд┐рд▓рддреЗ рд╣реИрдВ:

 curl "http://localhost:8080/DSC08084.jpg?op=resize&max=2400" -v > /dev/null > GET /DSC08084.jpg?op=resize&max=2400 HTTP/1.1 > Host: localhost:8080 > User-Agent: curl/7.47.0 > Accept: */* > < HTTP/1.1 200 OK < Connection: keep-alive < Content-Length: 2043917 < Server: Shrimp draft server < Date: Wed, 15 Aug 2018 11:53:49 GMT < Last-Modified: Wed, 15 Aug 2018 11:53:49 GMT < Access-Control-Allow-Origin: * < Access-Control-Expose-Headers: Shrimp-Processing-Time, Shrimp-Resize-Time, Shrimp-Encoding-Time, Shrimp-Image-Src < Content-Type: image/jpeg < Shrimp-Image-Src: transform < Shrimp-Processing-Time: 779.901 < Shrimp-Resize-Time: 558.246 < Shrimp-Encoding-Time: 221.655 

рдпрд╛рдиреА рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдХрд╛ рд╕рдордп рдШрдЯрд╛рдХрд░ 558.25ms рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ред

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

 SHRIMP_IO_THREADS=1 \ SHRIMP_WORKER_THREADS=3 \ MAGICK_THREAD_LIMIT=4 \ shrimp.app -p 8080 -i ... 

рдпрд╛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рддрд░реНрдХреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ:

 MAGICK_THREAD_LIMIT=4 \ shrimp.app -p 8080 -i ... --io-threads 1 --worker-threads 4 

рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИред

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

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


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

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

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

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


All Articles