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

рд╣рдо рдХреИрд╕реЗ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВрдЧреЗ?
рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо
QNetworkAccessManager
рдФрд░
QEventLoop
, рд╕рд╛рде рд╣реА рдХреБрдЫ рдореЗрдЯрд╛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╣рдо рд╕рдорд░реНрдерд┐рдд Qt рд╕реЗ рдХрд┐рд╕реА рднреА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ HTTP рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЫрд╡рд┐ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВрдЧреЗред рдЦреИрд░, рд╣рдо рдЕрднреА рднреА рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рд╣рдо рдЗрд╕реЗ рдХреИрд╕реЗ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░реЗрдВрдЧреЗ?
рдЙрдкрд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдорд╣рд╛рди QGraphicsEffect рд╡рд░реНрдЧ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд╕рд╛рдордВрдЬрд╕реНрдп! рдФрд░ рдореИрдВ рдпрд╣ рднреА рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреНрдпреЛрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Qt 4.8.0 рдореЗрдВ, рдпреЗ рдкреНрд░рднрд╛рд╡ Mac OS X 10.7ред + рдореЗрдВ рдПрдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреНрд░реИрд╢ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреЗ рд╣реИрдВ, рдФрд░ Qt 4.7.4 рдореЗрдВ рдЙрд╕реА рдкреНрд░рдгрд╛рд▓реА рдкрд░ рдЬреЛ рд╡реЗ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╣реБрдЖ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдХреНрдпреВрдЯреА рдмрдЧ рдЯреНрд░реИрдХрд░ рдореЗрдВ
рдПрдХ рдмрдЧ
рд╕реЗрдЯ рдХрд┐рдпрд╛ ред
рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрдореЗрдЬ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВрдЧреЗред рд╡рд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░ рд╕рдХреЗрдЧрд╛:
- рдЧреНрд░реЗрд╕реНрдХреЗрд▓ рдЫрд╡рд┐ рдмрджрд▓реЗрдВ
- Colorize (рдореИрдВ рд░реВрд╕реА рдореЗрдВ рдпрд╣ рдХреИрд╕реЗ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ?)
- рдЫрд╛рдпрд╛ рдЬреЛрдбрд╝реЗрдВ
- рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдмрджрд▓реЗрдВ
- рдХреЗрдВрджреНрд░ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреБрдорд╛рдПрдБ
- Kvadratizirovat
- рдХреЛрдиреЗ рдХреА рдЧреЛрд▓рд╛рдИ рд╕реЗ рдЪреМрдХреЛрд░
- рдПрдХ рдмреЛрдирд╕ рдХреЗ рд░реВрдк рдореЗрдВ, #RRGGBBAA рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдХрд╕реНрдЯрдо рд░рдВрдЧ рдкрдврд╝рдирд╛ рд╕реАрдЦреЗрдВ
рдореИрдВ рддреБрд░рдВрдд рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдкреВрд░рд╛ рдХреЛрдб рдЬреАрдердм рдкрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд▓рд┐рдВрдХред
рддреЛ рдЫрд╡рд┐ рд▓реЛрдб рдХрд░ рд░рд╣рд╛ рд╣реИ
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдо рдпрд╣ рдЪрд╛рд╣рддреЗ рд╣реИрдВ: рд╣рдо рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡рд░реНрдЧ рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рддрд░реАрдХреЗ рдХреЛ рдХрд╣рддреЗ рд╣реИрдВ, рдЪрд┐рддреНрд░ рдХрд╛ URL рдЗрд╕рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдкрд░рд┐рдгрд╛рдореА рдЫрд╡рд┐ рдХреЛ рдХрд┐рд╕ рд╡рд┐рдзрд┐ рд╕реЗ рдФрд░ рдХрд┐рд╕ рдкрджреНрдзрддрд┐ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд░реЗрдВред рдФрд░ рдЬрдм рдЫрд╡рд┐ рд▓реЛрдб рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рд╡рд╕реНрддреБ рдХрд╛ рд╡рд╛рдВрдЫрд┐рдд рддрд░реАрдХрд╛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрд╕рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдЫрд╡рд┐ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдпрд╣ рд╕рдм рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИред рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ?
рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП! рд╣рдо
Networking
рдХреНрд▓рд╛рд╕ рдмрдирд╛рддреЗ рд╣реИрдВ (рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдмрдирд╛ рджрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдмрдбрд╝реА рднреВрдорд┐рдХрд╛ рдирд╣реАрдВ рдирд┐рднрд╛рддрд╛ рд╣реИ), рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рдо рдХреЗ рд▓рд┐рдП
NetworkingPrivate
рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВ -ред
рджрд░рдЕрд╕рд▓, рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рд╕рдордХрд╛рд▓рд┐рдХ рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧреАред рддреЛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИред
рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
рдмреАрдорд╛ рдпреЛрдЧреНрдп рдирд┐рдЬреА рд╡рд░реНрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгред рд╣рдореЗрдВ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
QNetworkAccessManager
рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ,
QEventLoop
, рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░
рдпрд╣ рдбрд░рд╛рд╡рдирд╛ QMap<QNetworkReply*, QPair<QObject*, QPair<QUrl, const char *> > > requests
- рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд╛рдирд┐рдП рдХрд┐рд╕ рдЪрд┐рддреНрд░ рдХреЛ рдХрд┐рд╕ рд╡рд╕реНрддреБ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдбрд┐рд▓реАрд╡рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
рдЕрдм рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕рд╛ рдирд┐рдЬреА рд╡рд░реНрдЧ (
Networking
рд╡рд░реНрдЧ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рд╣реЛрдЧрд╛, рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдирд┐рдЬреА рд╡рд░реНрдЧ рдХреЛ рдХреЙрд▓ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ)ред
NetworkingPrivate::NetworkingPrivate() { nam = new QNetworkAccessManager(); loop = new QEventLoop(); connect(nam, SIGNAL(finished(QNetworkReply*)), loop, SLOT(quit())); connect(nam, SIGNAL(finished(QNetworkReply*)), SLOT(onFinished(QNetworkReply*))); } NetworkingPrivate::~NetworkingPrivate() { nam->deleteLater(); loop->deleteLater(); } QImage NetworkingPrivate::httpGetImage(const QUrl& src) const { QNetworkRequest request; request.setUrl(src); QNetworkReply * reply = nam->get(request); loop->exec(); QVariant redirectedUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); QUrl redirectedTo = redirectedUrl.toUrl(); if (redirectedTo.isValid()) {
рдЕрдм рд╣рдо рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рд╣рдо рдПрдХ
QEventLoop
,
QNetworkAccessManager
рдФрд░
QEventLoop::quit()
рд╕рд╛рде рдЕрдиреБрд░реЛрдз рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдЧреНрдирд▓ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ
QEventLoop::quit()
рдФрд░ рд╣рдорд╛рд░реА
onFinished
рд╡рд┐рдзрд┐ред
рдПрдХ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдбрд╛рдЙрдирд▓реЛрдб рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдиреБрд░реЛрдз рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдИрд╡реЗрдВрдЯ рд▓реВрдк рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХреЗ рдЕрдВрдд рдореЗрдВ рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЙрд╕реА рд╕рдордп, рд╣рдо рдЕрднреА рднреА рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдФрд░ рдЗрд╕рдХреА рдлрд┐рдХреНрд╕реЗрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддрд╕реНрд╡реАрд░реЛрдВ рдХреЗ рдХрд┐рд╕реА рднреА рд▓рд┐рдВрдХ рдХреЛ рджрд░реНрдЬ рдХрд░ рд╕рдХреЗ, рдЬрд┐рд╕рдореЗрдВ рд▓рд┐рдВрдХ рд╢реЙрд░реНрдЯрд░реНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рд╣реЛ рдЧрдПред
рдЦреИрд░, рдЬрдм рд╣рдореЗрдВ рдЕрдкрдиреА рддрд╕реНрд╡реАрд░ рдорд┐рд▓реА, рддреЛ
QImageReader
рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рдЕрдВрддрд┐рдо
QImage
рдореЗрдВ рдкрдврд╝реЗрдВ, рдЬрд┐рд╕реЗ рд╣рдо рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рдкреЗрдЪреАрджрд╛ рд╣реИред рд╣рдо рдЕрдкрдиреЗ рдбрд░рд╛рд╡рдиреЗ
QMap
рдореЗрдВ рдЕрдиреБрд░реЛрдз (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд▓рд┐рдВрдХ), рд▓рдХреНрд╖реНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рдЗрд╕рдХреА рд╡рд┐рдзрд┐ рдХреЛ
QMap
рдФрд░ рдлрд┐рд░ рдЕрдиреБрд░реЛрдз рдЪрд▓рд╛рддреЗ рд╣реИрдВред рдФрд░ рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдВрдд рдореЗрдВ, рд╣рдо рд╕рдордХрд╛рд▓рд┐рдХ рдЕрдиреБрд░реЛрдз (рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ, рдЗрд╕рдХреА рдЪрдХреНрд░реАрдпрддрд╛ рдФрд░ рдЪрд┐рддреНрд░ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ) рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд╡реИрд╕рд╛ рд╣реА рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдкреНрд░рд╛рдкреНрдд
QImage
рдХреЛ
QMetaObject::invokeMethod
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рдХреНрд╖реНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ - URL рдФрд░ рдЪрд┐рддреНрд░ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВред
рдареАрдХ рд╣реИ, рдЖрдк рдПрдХ рд╕рд░рд▓ рд░реВрдк рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЖрдк URL рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдЫрд╡рд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдпрд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗред рдФрд░ рдЖрдирдиреНрдж рдордирд╛рдУред
рд▓реЗрдХрд┐рди рд╣рдо рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗ, рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЫрд╡рд┐ рдмрджрд▓ рдЬрд╛рдПрдЧреАред
рдЫрд╡рд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛
рд╣рдо рдПрдХ рдФрд░ рд╡рд░реНрдЧ рдмрдирд╛рддреЗ рд╣реИрдВ (рдореЗрд░реЗ рдкрд╛рд╕ рдлрд┐рд░ рд╕реЗ рд╕реНрдерд┐рд░ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХрд╛рд░рдг рдХреЗ), рдЪрд▓реЛ рдЗрд╕реЗ
ImageManager
рдХрд╣рддреЗ рд╣реИрдВред рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рд╣реЛрдВрдЧреЗ:
class ImageManager { public: static QImage normallyResized(const QImage & image, int maximumSideSize); static QImage grayscaled(const QImage & image); static QImage squared(const QImage & image, int size); static QImage roundSquared(const QImage & image, int size, int radius); static QImage addShadow(const QImage & image, QColor color, QPoint offset, bool canResize = false); static QImage colorized(const QImage & image, QColor color); static QImage opacitized(const QImage & image, double opacity = 0.5); static QImage addSpace(const QImage & image, int left, int top, int right, int bottom); static QImage rotatedImage(const QImage & image, qreal angle); static QColor resolveColor(const QString & name); };
рдпрд╣ рд╣рдореЗрдВ рдРрд╕рд╛ рдХреБрдЫ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ (рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рджреЗрдЦреЗрдВ):

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

рднреВрд░реЗ рд░рдВрдЧред
рдореБрдЭреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рднреА рдорд┐рд▓реЗ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЬрд╣рдордд рдирд╣реАрдВ рдЙрдард╛рдИред рдЗрд╕рд▓рд┐рдП рдореИрдВ рджреЛ рдХреЛ рдЪреБрдирдХрд░ рд▓рд╛рддрд╛ рд╣реВрдВред
рдкрд╣рд▓рд╛ рддрд░реАрдХрд╛ рдЫрд╡рд┐ рдХреЛ QImage :: Format_Indexed8 рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЫрд╡рд┐ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд 8-рдмрд┐рдЯ рд░рдВрдЧ рдореЗрдВ рдмрджрд▓рдирд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдлреЗрдж рд╕реЗ рдХрд╛рд▓реЗ рддрдХ - 256 рддрддреНрд╡реЛрдВ рдХрд╛ рдПрдХ "рд░рдВрдЧ рдорд╛рдирдЪрд┐рддреНрд░" рдмрдирд╛рдПрдВред
QImage gray(image.size(), QImage::Format_ARGB32); gray.fill(Qt::transparent); static QVector<QRgb> monoTable; if (monoTable.isEmpty()) { for (int i = 0; i <= 255; i++) monoTable.append(qRgb(i, i, i)); } QPainter p(&gray); p.drawImage(0, 0, image.convertToFormat(QImage::Format_Indexed8, monoTable)); p.end(); return gray;
рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдЫрд╡рд┐ рдмрд┐рдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдХрд╛рдо рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рд╣рдо рд╕рднреА рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЧреНрд░реЗ рдореЗрдВ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред
QImage img = image; if (!image.isNull()) { int pixels = img.width() * img.height(); if (pixels*(int)sizeof(QRgb) <= img.byteCount()) { QRgb *data = (QRgb *)img.bits(); for (int i = 0; i < pixels; i++) { int val = qGray(data[i]); data[i] = qRgba(val, val, val, qAlpha(data[i])); } } } return img;
рджреВрд╕рд░реА рд╡рд┐рдзрд┐, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдЫрд╡рд┐ рдирд╣реАрдВ рдмрдирд╛рдИ рдЧрдИ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХреЗ рд╕рд╛рде рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдЬреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд╣ рд╣реИ рдЬрд┐рд╕реЗ рдлрд┐рдирд╛рд▓реЗ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЧреЛрд▓ рдХреЛрдиреЛрдВ
рдпрд╣рд╛рдВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛рдлреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рдПрдХ рдореБрдЦреМрдЯрд╛ рдмрдирд╛рдирд╛ рдФрд░ рдЙрд╕ рдкрд░ рдЫрд╡рд┐ рдмрдирд╛рдирд╛ рдерд╛ред рд▓реЗрдХрд┐рди QPainter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдорд╛рд╕реНрдХ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рдЕрд╕рдлрд▓ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рдмрд╛рдж: [Ellipse | Arc |ededRect | Path], рдореИрдВрдиреЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ред рдХрд┐рд╕реА рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗрд╡рд▓ рдХреБрдЫ рдкрдЯреНрдЯрд┐рдХрд╛ рд░реЗрдбреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд░рд┐рдгрд╛рдо рд╡рд┐рднрд┐рдиреНрди рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рд╕рдореНрдорд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣, рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░, рдмрд┐рдЯрдорд╕реНрдХ рдХреЗ рд▓рд┐рдП рдПрдВрдЯреАрдПрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрдерддрд╛ рдХреЗ рдХрд╛рд░рдг рд╣реИ - рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рд░рдВрдЧ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдХрд╛рд▓реЗ рдФрд░ рд╕рдлреЗрджред рдирдИ рд╡рд┐рдзрд┐ рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдкрд░ рд╣рдВрд╕рддреА рд╣реИ, рдФрд░ рдПрдВрдЯреА-рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рдЪрд┐рдХрдиреА рдкрдЯреНрдЯрд┐рдХрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реЛрдЯреА рджреЗрддреА рд╣реИред
QImage shapeImg(QSize(size, size), QImage::Format_ARGB32_Premultiplied); shapeImg.fill(Qt::transparent); QPainter sp(&shapeImg); sp.setRenderHint(QPainter::Antialiasing); sp.setPen(QPen(Qt::color1)); sp.setBrush(QBrush(Qt::color1)); sp.drawRoundedRect(QRect(0, 0, size, size), radius + 1, radius + 1); sp.end(); QImage roundSquaredImage(size, size, QImage::Format_ARGB32_Premultiplied); roundSquaredImage.fill(Qt::transparent); QPainter p(&roundSquaredImage); p.drawImage(0, 0, shapeImg); p.setCompositionMode(QPainter::CompositionMode_SourceIn); p.drawImage(0, 0, squared(image, size)); p.end(); return roundSquaredImage;
рд╕рд╛рд░ рд▓рдЧрднрдЧ рддрд╕реНрд╡реАрд░ рдХреЛ рдорд╛рд╕реНрдХрд┐рдВрдЧ рдХреЗ рд╕рдорд╛рди рд╣реИред рдПрдХ рдЧреЛрд▓ рдХрд╛рд▓рд╛ рд╡рд░реНрдЧ (рдПрдВрдЯреАрдПрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХреЗ рд╕рд╛рде) рдмрдирд╛рдПрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕рдХреЗ рд╢реАрд░реНрд╖ рдкрд░
QPainter::CompositionMode_SourceIn
рдореЛрдб
QPainter::CompositionMode_SourceIn
рд╕рд╛рде рдореВрд▓ рдЫрд╡рд┐ рдмрдирд╛рдПрдВред рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, рд╕рд░рд▓ рдФрд░ рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯред

рдЫрд╛рдпрд╛ рдЬреЛрдбрд╝реЗрдВ
рдЕрдм рдЫрд╡рд┐ рдкрд░ рдПрдХ рдЫрд╛рдпрд╛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдПред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЪрд┐рддреНрд░, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдореВрд▓ рд╕реЗ рднрд┐рдиреНрди рдЖрдпрд╛рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
QSize shadowedSize = image.size(); if (canResize) { shadowedSize += QSize(qAbs(offset.x()), qAbs(offset.y())); } QImage shadowed(shadowedSize, QImage::Format_ARGB32_Premultiplied); shadowed.fill(Qt::transparent); QPainter p(&shadowed); QImage shadowImage(image.size(), QImage::Format_ARGB32_Premultiplied); shadowImage.fill(Qt::transparent); QPainter tmpPainter(&shadowImage); tmpPainter.setCompositionMode(QPainter::CompositionMode_Source); tmpPainter.drawPixmap(QPoint(0, 0), QPixmap::fromImage(image)); tmpPainter.setCompositionMode(QPainter::CompositionMode_SourceIn); tmpPainter.fillRect(shadowImage.rect(), color); tmpPainter.end(); QPoint shadowOffset = offset; if (canResize) { if (offset.x() < 0) shadowOffset.setX(0); if (offset.y() < 0) shadowOffset.setY(0); } p.drawImage(shadowOffset, shadowImage); QPoint originalOffset(0, 0); if (canResize) { if (offset.x() < 0) originalOffset.setX(qAbs(offset.x())); if (offset.y() < 0) originalOffset.setY(qAbs(offset.y())); } p.drawPixmap(originalOffset, QPixmap::fromImage(image)); p.end(); return shadowed;
рдпрд╣рд╛рдВ рд╣рдо рдкрд╣рд▓реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрдВрдкреЛрдЬрд╝рд┐рд╢рди рдореЛрдбреНрд╕ рдХреЗ рд╕рд╛рде рдЖрд░реНрдЯрд┐рдлрд╝рд┐рд╢ рдбреНрд░рд╛рдЗрдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╢реИрдбреЛ рдЗрдореЗрдЬ рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдФрд░ рдКрдкрд░ рдХреА рдУрд░рд┐рдЬрд┐рдирд▓ рдЗрдореЗрдЬ рдХреЛ рдбреНрд░рд╛ рдХрд░рддреЗ рд╣реИрдВред рдЖрд╡рд╢реНрдпрдХ рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде, рдмрд┐рд▓реНрдХреБрд▓ред

colorization
рд░рдВрдЧреАрдХрд░рдг рдкреНрд░рднрд╛рд╡ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдПрдХ рдХреЛ рдЪреБрдирд╛, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╕рдмрд╕реЗ рд╕рдлрд▓ред
QImage resultImage(image.size(), QImage::Format_ARGB32_Premultiplied); resultImage.fill(Qt::transparent); QPainter painter(&resultImage); painter.drawImage(0, 0, grayscaled(image)); painter.setCompositionMode(QPainter::CompositionMode_Screen); painter.fillRect(resultImage.rect(), color); painter.end(); resultImage.setAlphaChannel(image.alphaChannel()); return resultImage;
рдпрд╣рд╛рдВ, рд╣рдо рдореВрд▓ рдЫрд╡рд┐ рдХреЛ рдЧреНрд░реЗ рдХреЗ рд░рдВрдЧреЛрдВ рдореЗрдВ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ (рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ), рдФрд░ рдлрд┐рд░ рд╕реНрдХреНрд░реАрди рд░рдЪрдирд╛ рдореЛрдб рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рд░рдВрдЧ рдХреА рдЖрдпрдд рдХреЛ рдУрд╡рд░рд▓реЗ рдХрд░реЗрдВред рдФрд░ рдЕрд▓реНрдлрд╛ рдЪреИрдирд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛ред

рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдореЗрдВ рдмрджрд▓рд╛рд╡
рдЕрдм рд╣рдо рдЕрдкрдиреА рддрд╕реНрд╡реАрд░ рдХреЛ рдкрд╛рд░рджрд░реНрд╢реА рдмрдирд╛рддреЗ рд╣реИрдВред рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ -
QPainter::setOpacity
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
QImage resultImage(image.size(), QImage::Format_ARGB32); resultImage.fill(Qt::transparent); QPainter painter(&resultImage); painter.setOpacity(opacity); painter.drawImage(0, 0, image); painter.end(); resultImage.setAlphaChannel(image.alphaChannel()); return resultImage;

рдЪрд┐рддреНрд░ рдХреЛ рдШреБрдорд╛рдПрдВ
рд╣рдо рдХреЗрдВрджреНрд░ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдореЗрдВрдЧреЗред рдореИрдВ рд╣реЛрдорд╡рд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рдардХреЛрдВ рдХреЛ рдПрдХ рдордирдорд╛рдирд╛ рдмрд┐рдВрджреБ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд░реЛрдЯреЗрд╢рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рднреА рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ - рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЪрд┐рдХрдиреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓рдирд╛ рдирд╣реАрдВ рд╣реИред
QImage rotated(image.size(), QImage::Format_ARGB32_Premultiplied); rotated.fill(Qt::transparent); QPainter p(&rotated); p.setRenderHint(QPainter::Antialiasing); p.setRenderHint(QPainter::SmoothPixmapTransform); qreal dx = image.size().width() / 2.0, dy = image.size().height() / 2.0; p.translate(dx, dy); p.rotate(angle); p.translate(-dx, -dy); p.drawImage(0, 0, image); p.end(); return rotated;
рдЧреНрд░реИрдВрдб рдлрд╛рдЗрдирд▓
рдпрд╣реА рд╣реИ, рдЕрдм рдЖрдк рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╛
GitHub 'рд╕реЗ рдореЗрд░рд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ) рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдЖрдирдВрдж рд▓реЗрдВ!
рдПрдХ рдмреЛрдирд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди рд╕реЗ рд░рдВрдЧ рдХреЗ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдХрд╛рд░реНрдп рдХрд░реВрдБрдЧрд╛ред рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ, Qt рдХреЛ
#RRGGBBAA
рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд░рдВрдЧ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдерд╛:
QColor ImageManager::resolveColor(const QString & name) { QColor color; if (QColor::isValidColor(name)) color.setNamedColor(name); else {
рдЗрд╕реА рд╕рдордп, рд╕рднреА рдорд╛рдирдХ рд░рдВрдЧ (рдЬреИрд╕реЗ
white
,
transparent
,
#ffa0ee
) рднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рдореЗрдВ рдЖрддреЗ рд╣реИрдВред
рдкреБрдирд╢реНрдЪ: рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╕рдВрджреЗрд╣ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЬреАрдердм рдкрд░ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИ, рдореИрдВ рдпрд╣рд╛рдВ рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпрд╛рдВ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд▓реЗрдЦ рдореЗрдВ рдХреЛрдб рдереЛрдбрд╝рд╛ рд╕рд░рд▓реАрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рдЪреЗрдХ рдФрд░ рд╕рд╛рдорд╛рди рд╣рдЯрд╛ рджрд┐рдП рдЧрдП рд╣реИрдВред рджреВрд╕рд░реЗ, рдЬрдм рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг рдХреБрдХреАрдЬрд╝ рдХреА рдкреНрд░рд╛рдкреНрддрд┐ рдФрд░ рднрдВрдбрд╛рд░рдг / рдЙрдкрдпреЛрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рддреАрд╕рд░рд╛, рдиреМ рднрд╛рдЧреЛрдВ (рдиреМ-рднрд╛рдЧ рд╡рд╛рд▓реА рдЫрд╡рд┐) рд╕реЗ рдпреБрдХреНрдд рдПрдХ рдЪрд┐рддреНрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдп рд╣реИрдВ, рдЬреЛ рдмрдЯрди, рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рдФрд░ рдЕрдиреНрдп рд╕рдорд╛рди рдЪреАрдЬреЛрдВ рдХреЗ рдореИрдиреБрдЕрд▓ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЛ рд╕рд░рд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рддреЛ рдмрдиреНрд╕ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рддреА рд╣реИрдВ!
PPS: рдпрджрд┐ рдХреЛрдИ рдорд╛рдирд╛ рдЧрдпрд╛ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рдлрд▓ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЬрд╛рдирддрд╛ рд╣реИ, рддреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ! рдЫрд╡рд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдкрд░ рднреА рдпрд╣реА рдмрд╛рдд рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИ - рдореИрдВ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдирдВрдж рд╕реЗ рдкрдврд╝рддрд╛ рд╣реВрдВред