Біраз уақыттан бері мақаладан шабыт алған
Бұл мақала көмекке келді
Сонымен бізге не керек
Мысалдар Debian негізінде беріледі.
Nginx және nginx-қосымшаларын орнату
apt-get update
apt-get install nginx-extras
LuaJIT орнатылуда
apt-get -y install lua5.1 luajit-5.1 libluajit-5.1-dev
imagemagick орнатылуда
apt-get -y install imagemagick
және кітапханалар сиқырлы таяқша оған, менің жағдайда 6 нұсқасы үшін
apt-cache search libmagickwand
apt-get -y install libmagickwand-6.q16-3 libmagickwand-6.q16-dev
Lua-imagick құру
Біз репозиторийді клондаймыз (немесе ZIP файлын алып, оны ораудан шығарамыз)
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+ (Пікір арақатынасын сақтаңыз, бүйірлік жиектерді қосыңыз)
Өлшемді өзгерту нәтижелері бар жиынтық кесте
uri параметрін сұрау
Шығарылатын кескін өлшемі
?өлшемі=400×200
200 × 200
?өлшемі=400×200^
400 × 400
?өлшемі=400×200!
400×200 (пропорционал емес)
?өлшемі=400×200+
400×200 (пропорционалды)
Нәтиже
Бұл тәсілдің күші мен қарапайымдылығын ескере отырып, сіз өте күрделі логикасы бар нәрселерді жүзеге асыра аласыз, мысалы, су таңбаларын қосу немесе шектеулі рұқсатпен авторизацияны енгізу. Суреттермен жұмыс істеуге арналған API мүмкіндіктерін білу үшін кітапхана құжаттамасына жүгінуге болады
Ақпарат көзі: www.habr.com