Nginx āĻāĻŦāĻ‚ LuaJIT (OpenResty) āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻĢā§āĻ˛āĻžāĻ‡āĻ¤ā§‡ āĻšāĻŋāĻ¤ā§āĻ°āĻ—ā§āĻ˛āĻŋāĻ° āĻ†āĻ•āĻžāĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°ā§āĻ¨

āĻŦā§‡āĻļ āĻ•āĻŋāĻ›ā§āĻĻāĻŋāĻ¨ āĻ§āĻ°ā§‡āĻ‡ āĻ˛ā§‡āĻ–āĻžāĻŸāĻŋ āĻĻā§‡āĻ–ā§‡ āĻ…āĻ¨ā§āĻĒā§āĻ°āĻžāĻŖāĻŋāĻ¤ āĻĢā§āĻ˛āĻžāĻ‡āĻ¤ā§‡ āĻšāĻŋāĻ¤ā§āĻ°ā§‡āĻ° āĻ†āĻ•āĻžāĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡ āĻ‡āĻŽā§‡āĻœ āĻ°āĻŋāĻ¸āĻžāĻ‡āĻœ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ ngx_http_image_filter_module āĻāĻŦāĻ‚ āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻ¯ā§‡āĻŽāĻ¨ āĻ‰āĻšāĻŋāĻ¤ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡āĻ›ā§‡āĨ¤ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻāĻ•āĻŸāĻŋ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻĻā§‡āĻ–āĻž āĻĻā§‡āĻ¯āĻŧ āĻ¯āĻ–āĻ¨ āĻŽā§āĻ¯āĻžāĻ¨ā§‡āĻœāĻžāĻ°āĻ•ā§‡ āĻ•āĻŋāĻ›ā§ āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻžāĻ¤ā§‡ āĻ†āĻĒāĻ˛ā§‹āĻĄ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻ āĻŋāĻ• āĻŽāĻžāĻ¤ā§āĻ°āĻž āĻ¸āĻš āĻšāĻŋāĻ¤ā§āĻ°āĻ—ā§āĻ˛āĻŋ āĻ—ā§āĻ°āĻšāĻŖ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻ¯āĻŧ, āĻ•āĻžāĻ°āĻŖ... āĻāĻ‡ āĻ›āĻŋāĻ˛ āĻ¤āĻžāĻĻā§‡āĻ° āĻĒā§āĻ°āĻ¯ā§āĻ•ā§āĻ¤āĻŋāĻ—āĻ¤ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧāĻ¤āĻž. āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻ¯āĻĻāĻŋ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ†āĻ•āĻžāĻ°ā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ†āĻ¸āĻ˛ āĻšāĻŋāĻ¤ā§āĻ° āĻĨāĻžāĻ•ā§‡ 1200 × 1200, āĻāĻŦāĻ‚ āĻ†āĻ•āĻžāĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ†āĻŽāĻ°āĻž āĻāĻ°āĻ•āĻŽ āĻ•āĻŋāĻ›ā§ āĻ˛āĻŋāĻ–āĻŋ ?resize=600×400, āĻ¤āĻžāĻ°āĻĒāĻ° āĻ†āĻŽāĻ°āĻž āĻ•ā§āĻˇā§āĻĻā§āĻ°āĻ¤āĻŽ āĻĒā§āĻ°āĻžāĻ¨ā§āĻ¤, āĻ†āĻ•āĻžāĻ° āĻŦāĻ°āĻžāĻŦāĻ° āĻāĻ•āĻŸāĻŋ āĻ†āĻ¨ā§āĻĒāĻžāĻ¤āĻŋāĻ•āĻ­āĻžāĻŦā§‡ āĻšā§āĻ°āĻžāĻ¸ āĻ•āĻ°āĻž āĻšāĻŋāĻ¤ā§āĻ° āĻĒāĻžāĻ‡ 400 × 400. āĻ‰āĻšā§āĻšāĻ¤āĻ° āĻ°ā§‡āĻœā§‹āĻ˛āĻŋāĻ‰āĻļāĻ¨ (āĻ‰āĻ¨ā§āĻ¨āĻ¤) āĻ¸āĻš āĻāĻ•āĻŸāĻŋ āĻšāĻŋāĻ¤ā§āĻ° āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻ•āĻ°āĻžāĻ“ āĻ…āĻ¸āĻŽā§āĻ­āĻŦāĨ¤ āĻ¸ā§‡āĻ—ā§āĻ˛ā§‹. ?resize=1500×1500 āĻāĻ•āĻ‡ āĻšāĻŋāĻ¤ā§āĻ° āĻĢāĻŋāĻ°āĻŋāĻ¯āĻŧā§‡ āĻĻā§‡āĻŦā§‡ 1200 × 1200

āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŸāĻŋ āĻ°ā§‡āĻ¸āĻ•āĻŋāĻ‰ āĻāĻ¸ā§‡āĻ›āĻŋāĻ˛ OpenResty: NGINX āĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻĒā§‚āĻ°ā§āĻŖāĻžāĻ™ā§āĻ— āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡ āĻĒāĻ°āĻŋāĻŖāĻ¤ āĻ•āĻ°āĻž Nginx āĻ•āĻŋāĻ­āĻžāĻŦā§‡ Lua āĻāĻŦāĻ‚ Lua āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ āĻ¨āĻŋāĻœā§‡āĻ‡ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡ āĻ¤āĻž āĻŦā§āĻāĻ¤ā§‡ isage/lua-imagick - āĻ˛ā§āĻ¯āĻŧāĻž āĻĒāĻŋāĻ“āĻ°-āĻ¸āĻŋ āĻ‡āĻŽā§‡āĻœ āĻŽā§āĻ¯āĻžāĻœāĻŋāĻ•ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻŦāĻžāĻ‡āĻ¨ā§āĻĄāĻŋāĻ‚āĨ¤ āĻ•ā§‡āĻ¨ āĻāĻ‡ āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨āĻŸāĻŋ āĻŦā§‡āĻ›ā§‡ āĻ¨ā§‡āĻ“āĻ¯āĻŧāĻž āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛, āĻāĻŦāĻ‚ āĻŦāĻ˛ā§āĻ¨ āĻ¨āĻž, āĻĒāĻžāĻ‡āĻĨāĻ¨ā§‡ āĻ•āĻŋāĻ›ā§ - āĻ•āĻžāĻ°āĻŖ āĻāĻŸāĻŋ āĻĻā§āĻ°ā§āĻ¤ āĻāĻŦāĻ‚ āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻœāĻ¨āĻ•āĨ¤ āĻāĻŽāĻ¨āĻ•āĻŋ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ•ā§‹āĻ¨ā§‹ āĻĢāĻžāĻ‡āĻ˛ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ āĻ¨āĻž, Nginx āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ā§‡ āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻ āĻŋāĻ• āĻ†āĻ›ā§‡ (āĻāĻšā§āĻ›āĻŋāĻ•)āĨ¤

āĻ¤āĻžāĻ‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•āĻŋ āĻĻāĻ°āĻ•āĻžāĻ°

āĻĄā§‡āĻŦāĻŋāĻ¯āĻŧāĻžāĻ¨ā§‡āĻ° āĻ‰āĻĒāĻ° āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋ āĻ•āĻ°ā§‡ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻĻā§‡āĻ“āĻ¯āĻŧāĻž āĻšāĻŦā§‡āĨ¤

nginx āĻāĻŦāĻ‚ nginx-āĻ…āĻ¤āĻŋāĻ°āĻŋāĻ•ā§āĻ¤ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

apt-get update
apt-get install nginx-extras

LuaJIT āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

apt-get -y install lua5.1 luajit-5.1 libluajit-5.1-dev

āĻ‡āĻŽā§‡āĻœ āĻŽā§āĻ¯āĻžāĻœāĻŋāĻ• āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

apt-get -y install imagemagick

āĻāĻŦāĻ‚ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ āĻŽā§āĻ¯āĻžāĻœāĻŋāĻ•āĻ“āĻ¯āĻŧāĻžāĻ¨ā§āĻĄ āĻāĻŸāĻž, āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ 6 āĻœāĻ¨ā§āĻ¯ āĻ†āĻŽāĻžāĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡

apt-cache search libmagickwand
apt-get -y install libmagickwand-6.q16-3 libmagickwand-6.q16-dev

āĻŦāĻŋāĻ˛ā§āĻĄāĻŋāĻ‚ lua-imagick

āĻ†āĻŽāĻ°āĻž āĻ¸āĻ‚āĻ—ā§āĻ°āĻšāĻ¸ā§āĻĨāĻ˛āĻŸāĻŋ āĻ•ā§āĻ˛ā§‹āĻ¨ āĻ•āĻ°āĻŋ (āĻŦāĻž āĻœāĻŋāĻĒāĻŸāĻŋ āĻ¨āĻŋāĻ¯āĻŧā§‡ āĻāĻŸāĻŋ āĻ†āĻ¨āĻĒā§āĻ¯āĻžāĻ• āĻ•āĻ°āĻŋ)

cd ~
git clone https://github.com/isage/lua-imagick.git
cd lua-imagick
mkdir build
cd build
cmake ..
make
make install

āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻ āĻŋāĻ•āĻ āĻžāĻ• āĻĨāĻžāĻ•āĻ˛ā§‡, āĻ†āĻĒāĻ¨āĻŋ Nginx āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤

āĻ†āĻŽāĻŋ āĻŦā§āĻ¯āĻžāĻ•āĻāĻ¨ā§āĻĄ āĻšā§‹āĻ¸ā§āĻŸā§‡āĻ° āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻĻā§‡āĻŦ, āĻ¯āĻž āĻĒā§āĻ°āĻ•ā§ƒāĻ¤āĻĒāĻ•ā§āĻˇā§‡ āĻ†āĻ•āĻžāĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻĻāĻžāĻ¯āĻŧā§€āĨ¤ āĻāĻŸāĻŋ āĻ¸āĻžāĻŽāĻ¨ā§‡āĻ° āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻĒā§āĻ°āĻ•ā§āĻ¸āĻŋ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ, āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“ Nginx āĻāĻ° āĻ¸āĻžāĻĨā§‡, āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ•ā§āĻ¯āĻžāĻļāĻŋāĻ‚ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ¸āĻŽāĻ¯āĻŧ (āĻĻāĻŋāĻ¨) āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻœāĻŋāĻ¨āĻŋāĻ¸āĻ—ā§āĻ˛āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻ˜āĻŸā§‡āĨ¤

nginx āĻŦā§āĻ¯āĻžāĻ•āĻāĻ¨ā§āĻĄ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨

# Backend image server
server {
    listen       8082;
    listen [::]:8082;
    set $files_root /var/www/example.lh/frontend/web;
    root $files_root;
    access_log off;
    expires 1d;

    location /files {
        # Đ´ĐĩŅ„ĐžĐģŅ‚ĐŊŅ‹Đĩ СĐŊĐ°Ņ‡ĐĩĐŊиŅ Ņ€ĐĩŅĐ°ĐšĐˇĐ°
        set $w 700;
        set $h 700;
        set $q 89;

        #1-89 allowed
        if ($arg_q ~ "^([1-9]|[1-8][0-9])$") {
            set $q $arg_q;
        }

        if ($arg_resize ~ "([d-]+)x([d+!^]+)") {  
            set $w $1;
            set $h $2;
            rewrite  ^(.*)$   /resize/$w/$h/$q$uri     last;
        }

        rewrite  ^(.*)$   /resize/$w/$h/$q$uri     last;
    }

    location ~* ^/resize/([d]+)/([d+!^]+)/([d]+)/files/(.+)$ {
        default_type 'text/plain';

        set $w $1;
        set $h $2;
        set $q $3;
        set $fname $4;

        # ЕŅŅ‚ŅŒ вОСĐŧĐžĐļĐŊĐžŅŅ‚ŅŒ вŅ‹ĐŊĐĩŅŅ‚и вĐĩŅŅŒ Lua ĐēОд в ĐžŅ‚Đ´ĐĩĐģŅŒĐŊŅ‹Đš Ņ„Đ°ĐšĐģ
        # content_by_lua_file /var/www/some.lua;
        # lua_code_cache off; #dev
        content_by_lua '
        local magick = require "imagick"
        local img = magick.open(ngx.var.files_root .. "/files/" .. ngx.var.fname)
        if not img then ngx.exit(ngx.HTTP_NOT_FOUND) end
        img:set_gravity(magick.gravity["CenterGravity"])

        if string.match(ngx.var.h, "%d+%+") then
            local h = string.gsub(ngx.var.h, "(%+)", "")
            resize = ngx.var.w .. "x" .. h
            -- Đ´ĐģŅ png Ņ Đ°ĐģŅŒŅ„Đ° ĐēĐ°ĐŊĐ°ĐģĐžĐŧ
            img:set_bg_color(img:has_alphachannel() and "none" or img:get_bg_color())
            img:smart_resize(resize)
            img:extent(ngx.var.w, h)
        else
                img:smart_resize(ngx.var.w .. "x" .. ngx.var.h)
        end

        if ngx.var.arg_q then img:set_quality(ngx.var.q) end

        ngx.say(img:blob())
        ';
    }
}

# Upstream
upstream imageserver {
    server localhost:8082;
}

server {
    listen 80;
    server_name examaple.lh;

    # ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģŅĐĩĐŧ вŅĐĩ jpg и png ĐēĐ°Ņ€Ņ‚иĐŊĐēи ĐŊĐ° imageserver
    location ~* ^/files/.+.(jpg|png) {
        proxy_buffers 8 2m;
        proxy_buffer_size 10m;
        proxy_busy_buffers_size 10m;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_pass     http://imageserver;  # Backend image server
    }
}

āĻ¯āĻž āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻ›āĻŋāĻ˛ (āĻĒā§āĻ°āĻžāĻ¨ā§āĻ¤ā§‡āĻ° āĻšāĻžāĻ°āĻĒāĻžāĻļā§‡ āĻšāĻŋāĻ¤ā§āĻ°āĻŸāĻŋ āĻĒā§āĻ°āĻ¸āĻžāĻ°āĻŋāĻ¤ āĻ•āĻ°āĻž) āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ˜āĻŸā§‡ img:extent() āĻāĻŦāĻ‚ āĻĒā§āĻ¯āĻžāĻ°āĻžāĻŽāĻŋāĻŸāĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ¸āĻ‚āĻœā§āĻžāĻžāĻ¯āĻŧāĻŋāĻ¤ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ resize āĻāĻ•āĻŸāĻŋ āĻšāĻŋāĻšā§āĻ¨ āĻ¸āĻš + āĻļā§‡āĻˇā§‡āĨ¤

āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāĻ—ā§āĻ˛āĻŋ āĻ‰āĻĒāĻ˛āĻŦā§āĻ§:

  • WxH (āĻ†āĻĻāĻ°ā§āĻļ-āĻ…āĻ¨ā§āĻĒāĻžāĻ¤ āĻ°āĻžāĻ–ā§āĻ¨, āĻ‰āĻšā§āĻš āĻŽāĻžāĻ¤ā§āĻ°āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§āĻ¨)
  • WxH^ (āĻ†āĻĻāĻ°ā§āĻļ-āĻ…āĻ¨ā§āĻĒāĻžāĻ¤ āĻ°āĻžāĻ–ā§āĻ¨, āĻ¨āĻŋāĻŽā§āĻ¨ āĻŽāĻžāĻ¤ā§āĻ°āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§āĻ¨ (āĻĢāĻ¸āĻ˛))
  • WxH! (āĻ†āĻ•ā§ƒāĻ¤āĻŋ-āĻ…āĻ¨ā§āĻĒāĻžāĻ¤ āĻ‰āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°ā§āĻ¨)
  • WxH+ (āĻ†āĻĻāĻ°ā§āĻļ-āĻ…āĻ¨ā§āĻĒāĻžāĻ¤ āĻ°āĻžāĻ–ā§āĻ¨, āĻĒāĻžāĻļā§‡āĻ° āĻ¸ā§€āĻŽāĻžāĻ¨āĻž āĻ¯ā§‹āĻ— āĻ•āĻ°ā§āĻ¨)

āĻ†āĻ•āĻžāĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ā§‡āĻ° āĻĢāĻ˛āĻžāĻĢāĻ˛ āĻ¸āĻš āĻ¸āĻžāĻ°āĻžāĻ‚āĻļ āĻŸā§‡āĻŦāĻŋāĻ˛

āĻ‡āĻ‰āĻ°āĻŋ āĻĒā§āĻ¯āĻžāĻ°āĻžāĻŽāĻŋāĻŸāĻžāĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻ•āĻ°ā§āĻ¨
āĻ†āĻ‰āĻŸāĻĒā§āĻŸ āĻ‡āĻŽā§‡āĻœ āĻ¸āĻžāĻ‡āĻœ

?resize=400×200
200 × 200

?resize=400×200^
400 × 400

?resize=400×200!
400×200 (āĻ†āĻ¨ā§āĻĒāĻžāĻ¤āĻŋāĻ• āĻ¨āĻ¯āĻŧ)

?resize=400×200+
400×200 (āĻ†āĻ¨ā§āĻĒāĻžāĻ¤āĻŋāĻ•)

Nginx āĻāĻŦāĻ‚ LuaJIT (OpenResty) āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻĢā§āĻ˛āĻžāĻ‡āĻ¤ā§‡ āĻšāĻŋāĻ¤ā§āĻ°āĻ—ā§āĻ˛āĻŋāĻ° āĻ†āĻ•āĻžāĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°ā§āĻ¨

āĻĢāĻ˛āĻžāĻĢāĻ˛

āĻāĻ‡ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ° āĻļāĻ•ā§āĻ¤āĻŋ āĻāĻŦāĻ‚ āĻ¸āĻ°āĻ˛āĻ¤āĻž āĻŦāĻŋāĻŦā§‡āĻšāĻ¨āĻž āĻ•āĻ°ā§‡, āĻ†āĻĒāĻ¨āĻŋ āĻŦā§‡āĻļ āĻœāĻŸāĻŋāĻ˛ āĻ¯ā§āĻ•ā§āĻ¤āĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻœāĻŋāĻ¨āĻŋāĻ¸āĻ—ā§āĻ˛āĻŋ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨, āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻ“āĻ¯āĻŧāĻžāĻŸāĻžāĻ°āĻŽāĻžāĻ°ā§āĻ• āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž āĻŦāĻž āĻ¸ā§€āĻŽāĻŋāĻ¤ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ…āĻ¨ā§āĻŽā§‹āĻĻāĻ¨ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ— āĻ•āĻ°āĻžāĨ¤ āĻ›āĻŦāĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ API āĻāĻ° āĻ•ā§āĻˇāĻŽāĻ¤āĻž āĻ–ā§āĻāĻœā§‡ āĻŦā§‡āĻ° āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻĒāĻ¨āĻŋ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ āĻĄāĻ•ā§āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāĻ¨ āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ– āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ isage/lua-imagick

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨