关于安装GraphicsMagic与配置环境变量参见 服务器搭建:3.1、openresty图片压缩之GraphicsMagick
1、如何在linux中直接使用压缩呢,看下面的命令:
#gm convert ./abd.jpg -thumbnail 100x100 .abd.100x100.jpg
注意,在一张图是原图,第二张图是压缩后的图,另外 中间部分的 100x100是压缩的尺寸。
2、用lua怎么做呢,下面是我的test.lua。
local source="/opt/local/test/adb.jpg"
local arae="300x300"
local target="/opt/local/test/dick."..arae..".png"
local pok=io.open('pok.txt','w')
print(pok)
local af=assert(pok)
print(af)
local mdx="gm convert "..source.." -thumbnail "..arae.." "..target
pok:write(mdx)
pok:close()
os.execute(mdx)
将文件名改成自己的文件路径 可以跑一下。
3、怎么在nginx中整合使用?
3.1 在nginx的 ./conf/nginx.conf 文件最后添加 include vhost/*.conf 意思是引入conf文件夹下的所有vhost中的.conf所有文件。
3.2 在vhost中创建一个 img.chimywin.com.conf 文件,并在其中插入代码如下:
server {
listen 80;
server_name img.hdxw.com;
root /data/htdocs/source;
index index.html index.htm index.php;
location / {
# 这里是把所有不存在的文件和目录,全都转到 index.php 处理
#try_files $uri $uri/ /index.php?__q=$uri&$args;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico)$ {
root /data/htdocs/source;
set $image_root /data/htdocs/source;
set $file "$image_root$uri";
if (!-f $file)
{
content_by_lua_file lua/image.lua; # 请注意这里,直接去调用lua文件处理见后面
}
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_cache_valid 200 304 12h;
proxy_cache_key $uri$is_args$args;
index index.html index.htm;
expires 7d;
}
}
# 日志输出格式
log_format access.img '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
access_log /data/management/logs/img.access.log access.img;
/opt/openresty/nginx/conf/vhost/img.chimywin.com.conf
3.3 在nginx目录下创建一个lua/image.lua
local file_exists = function(name)
local f=io.open(name,"r")
if f~=nil then
io.close(f)
return true
else
return false
end
end
-- 访问图片的Uri,是一个相对路径
local newFileUri = ngx.var.uri;
-- 访问图片的绝对路径
local target = ngx.var.file;
-- 是不是有符合要求的图片请求路径
local index = string.find(target, "([0-9]+)x([0-9]+)");
-- local pok=io.open('/var/html/pok.txt','w')
-- 支持的size格式 这里没有使用
local image_sizes = {"40x40", "60x60", "80x80", "100x100","120x120","140x140", "160x160", "180x180", "200x200",
"220x220","240x240", "260x260", "280x280", "300x300","320x320","340x340", "360x360", "380x380", "400x400", "640x640", "600x600"};
-- 记录Lua压缩图日志
-- pok:write("newFileUri="..newFileUri..";");
-- pok:write("target="..target..";");
-- pok:write("index="..index..";");
-- 如果有
if index then
-- local af=assert(pok)
-- pok:write("开始分析 ;");
-- pok:write("newFileUri="..newFileUri..";");
-- pok:write("target="..target..";");
-- 截取 字符串 xxx/xxx/kl.jpg.100x100.jpg中 100x100以前的位置 : xxx/xxx/kl.jpg
local source = string.sub(target, 0, index-2);
-- pok:write("source="..source..";");
-- 二次截取获得 图片的规格
local area = string.sub(target, index);
-- pok:write("area="..area..";");
index = string.find(area, "([.])");
if(index ~= nil )
then
area = string.sub(area, 0, index-1);
end
-- pok:write("area="..area..";");
-- 拼接压缩图命令 # 注意这里的命令,后面解释
local cmdexec="/usr/local/GraphicsMagick/bin/gm convert "..source.." -thumbnail "..area.." "..target
os.execute(cmdexec);
-- pok:write("cmdexec="..cmdexec..";");
-- pok:write("end")
-- pok:close()
ngx.exec(ngx.var.uri)
-- end
-- if file_exists(ngx.var.file) then
-- ngx.exec(ngx.var.uri)
else
ngx.exit(404)
end
说明一下:
i、--注释掉的部分是我为了测试写的日志文件。
ii、 local cmdexec="/usr/local/GraphicsMagick/bin/gm convert "..source.." -thumbnail "..area.." "..target 这里因为我安装后通过nginx无法调用 gm命令,暂时没有找到原因 ,所以这里直接用了绝对路径 来执行它。