Tengine+Lua+GraphicsMagick实现图片自动裁剪缩放

使用Tengine+Lua+GraphicsMagick实现图片自动裁剪缩放 关于使用Tengine+Lua+GraphicsMagick实现图片自动裁剪缩放的开发文档。 立即下载

图片处理需求

  • 问题
    • 互联网电商网站(PC端,移动端)
    • 大量不同需求的图片(同一个图片需要不同尺寸的缩略图)
  • 解决方案
    • 两种策略生成缩略图
      • 在上传图片时,就生成所需缩略图
    • 根据请求指定尺寸的图片自动生成响应的缩略图片
      • Tengine+Lua+GraphicsMagick

技术介绍

  • Tengine
    • 淘宝优化改良的nginx,并集成了lua模块
    • 负责展示图片和调度Lua脚本
  1. gine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。它的目的是打造一个高效、安全的Web平台。
  • Lua
    • 脚本语言,嵌入到应用程序中,提供灵活的扩展和定制功能
    • Tengine通过lua实现对GM的操作
    • 控制裁剪,缩放规格
  1. [1] 是一个小巧的脚本语言。是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所组成并于1993年开发。 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。并没有提供强大的库,这是由它的定位决定的。所以不适合作为开发独立应用程序的语言。 有一个同时进行的JIT项目,提供在特定平台上的即时编译功能。
  2. 脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,ini等文件格式,并且更容易理解和维护。 [2] 由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。 [2] 一个完整的解释器不过200k,在目前所有脚本引擎中,的速度是最快的。这一切都决定了是作为嵌入式脚本的最佳选择。 [2]
  • GraphicsMagick
    • 强大的图片处理工具,没有UI的PS,动态的生成图片,特别适用于互联网的应用
    • 负责图片处理
  1. 号称图像处理领域的瑞士军刀。 短小精悍的代码却提供了一个鲁棒、高效的工具和库集合,来处理图像的读取、写入和操作,支持超过88种图像格式,包括重要的DPX、GIF、JPEG、JPEG-2000、PNG、PDF、PNM和TIFF。
  • 原理图

 

安装配置

  • 软件列表
    • Tengine
      • 安装包:tengine-master.zip
      • 下载地址
        • https://github.com/alibaba/tengine
    • Lua
      • lua-5.3.1.tar.gzLuaJIT-2.0.4.tar.gz(Lua依赖包)
      • 下载地址
        • http://www.lua.org/ftp/
        • http://luajit.org/download.html
    • GraphicsMagick
      • GraphicsMagick-1.3.18.tar.gz
      • 下载地址
        • https://sourceforge.net/projects/graphicsmagick/files/graphicsmagick/
    • 依赖包和类库,可以使用yum安装
      • libjpeg、libjpeg-devel
      • libpng、libpng-devel
      • giflib、giflib-devel
      • freetype、freetype-devel

安装

  • Lua
    • 安装依赖(readline&readline-devel)
      • yum install readline
      • yum install readline-devel
    • 安装Lua(源码编译安装)
      • cd lua-5.3.1
      • make linux(需要指定操作系统否则会报错)
      • make install
    • 安装LuaJIT (源码编译安装)
      • cd LuaJIT-2.0.4
      • make && make install
    • 检测是否安装成功
      • lua -v

 

  • Tengine
    • 进入Tengine源码目录,使用configure配置安装路径以及需要安装的模块
      • unzip tengine-master.zip
      • cd tengine-master
      • yum -y install openssl openssl-devel
    1. --prefix=/usr/local/Tengine --dso-path=/usr/local/Tengine/modules --with-http_realip_module --with-http_gzip_static_module --with-http_stub_status_module --with-http_concat_module --with-http_lua_module  --http-proxy-temp-path=/var/tmp/Tengine/proxy_temp --http-fastcgi-temp-path=/var/tmp/Tengine/fastcgi_temp --http-uwsgi-temp-path=/var/tmp/Tengine/uwsgi_temp --http-scgi-temp-path=/var/tmp/Tengine/cgi_temp --http-client-body-temp-path=/var/tmp/Tengine/client_body_temp --http-log-path=/var/log/Tengine/access.log --error-log-path=/var/log/Tengine/error.log
    • 安装Tengine (源码编译安装)
      • make && make install
    • 启动
      • /usr/local/Tengine/sbin/nginx
      • 启动报错

      • ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2
      • 文件夹找不到

      • mkdir -p /var/tmp/Tengine/clientbodytemp
    • 成功页面

  • GraphicsMagick
    • 安装依赖(通过yum命令在线安装)
      • llibjpeg & libjpeg-devel
      • libpng & libpng-devel
      • giflib & giflib-devel
      • freetype & freetype-devel
      • yum命令
        • yum -y install llibjpeg libjpeg-devel libpng libpng-devel giflib giflib-devel freetype freetype-devel
    • 进入GM源码目录,使用configure配置安装路径以及需要安装的模块
      • cd GraphicsMagick-1.3.18
      • ./configure --prefix=/usr/local/GraphicsMagick --enable-shared
    • 安装GM(源码编译安装)
      • make && make install
    • 验证是否安装成功
      • /usr/local/GraphicsMagick/bin/gm version

配置

  • Lua脚本文件(ImageResizer.lua)
    • 位置:/usr/local/Tengine/lua/ImageResizer.lua
    • 权限:可执行
    • chmod a+x /usr/local/Tengine/lua/ImageResizer.lua
  1. command = "/usr/local/GraphicsMagick/bin/gm convert " .. ngx.var.request_filepath .. " -resize " .. ngx.var.width .. "x" .. ngx.var.height .. " +profile \"*\" " .. ngx.var.request_filepath .. "_" .. ngx.var.width .. "x" .. ngx.var.height .. "." .. ngx.var.ext;
    os.execute(command);
    ngx.exec(ngx.var.request_uri);
  • Tengine配置(nginx.conf)
  1.   nobody;
    user  root;  # 裁剪图片需要root权限
    worker_processes  1;
     
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
     
    #pid        logs/nginx.pid;
     
     
    events {
        worker_connections  1024;
    }
     
    # load modules compiled as Dynamic Shared Object (DSO)
    #
    #dso {
    #    load ngx_http_fastcgi_module.so;
    #    load ngx_http_rewrite_module.so;
    #}
     
    http {
        include       mime.types;
        default_type  application/octet-stream;
     
        #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
        #                  '$status $body_bytes_sent "$http_referer" '
        #                  '"$http_user_agent" "$http_x_forwarded_for"';
     
        #access_log  logs/access.log  main;
     
        sendfile        on;
        #tcp_nopush     on;
     
        #keepalive_timeout  0;
        keepalive_timeout  65;
     
        #gzip  on;
     
        server {
            listen       80;
            server_name  img.itrip.project.bdqn.cn;
            root /data/itrip/uploadimg;
     
            location / {
                 root /data/itrip/uploadimg; # 站点根目录
                 expires 1h;    # 缓存时间
                 add_header Cache-Control max-age=3600; # 缓存时间
                 access_log   /var/log/Tengine/host_access.log;
            }
     
            # 如果 url 格式如:xxxx.gif_数字x数字.gif
            location ~* ^(.+\.(jpg|jpeg|gif|png))_(\d+)x(\d+)\.(jpg|jpeg|gif|png)$ {
            # 这里必须设置,否则根目录,即 $document_root 会是 Nginx 默认的 Nginx Root/html,在Lua中会得不到期望的值   
                root /data/itrip/uploadimg;
     
                if (!-f $request_filename) { # 如果文件不存在时才需要裁剪
                    add_header X-Powered-By 'Lua GraphicsMagick';  # 此HTTP Header无实际意义,用于测试
                    add_header file-path $request_filename;  #此HTTP Header无实际意义,用于测试
                    lua_code_cache on;  # 在编写外部 Lua脚本时,设置为off Nginx不会缓存 Lua,方便调试
                    set $request_filepath /data/itrip/uploadimg$1;  #设置原始图片路径,如:/document_root/1.gif
                    set $width $3;     # 设置裁剪/缩放的宽度
                    set $height $4;    # 设置裁剪/缩放的高度
                    set $ext $5;      # 图片文件格式后缀
                    content_by_lua_file /usr/local/Tengine/lua/ImageResizer.lua;  # 加载外部 Lua 文件
                }
            }
     
     
            #charset koi8-r;
     
            #access_log  logs/host.access.log  main;
     
            #location / {
            #    root   html;
            #    index  index.html index.htm;
            #}
     
     
     
            #error_page  404              /404.html;
     
            # redirect server error pages to the static page /50x.html
            #
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
     
            # proxy the PHP scripts to Apache listening on 127.0.0.1:80
            #
            #location ~ \.php$ {
            #    proxy_pass   http://127.0.0.1;
            #}
     
            # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
            #
            #location ~ \.php$ {
            #    root           html;
            #    fastcgi_pass   127.0.0.1:9000;
            #    fastcgi_index  index.php;
            #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            #    include        fastcgi_params;
            #}
     
            # deny access to .htaccess files, if Apache's document root
            # concurs with nginx's one
            #
            #location ~ /\.ht {
            #    deny  all;
            #}
        }
     
     
        # another virtual host using mix of IP-, name-, and port-based configuration
        #
        #server {
        #    listen       8000;
        #    listen       somename:8080;
        #    server_name  somename  alias  another.alias;
     
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
     
     
        # HTTPS server
        #
        #server {
        #    listen       443 ssl;
        #    server_name  localhost;
     
        #    ssl_certificate      cert.pem;
        #    ssl_certificate_key  cert.key;
     
        #    ssl_session_cache    shared:SSL:1m;
        #    ssl_session_timeout  5m;
     
        #    ssl_ciphers  HIGH:!aNULL:!MD5;
        #    ssl_prefer_server_ciphers  on;
     
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
     
    }
大疆机场及无人机上云(航线规划、指令飞行...) 最近基于大疆上云api进行二次开发,后面将按照开发步骤对其进行说明! 阅读详情

相关推荐

基于单片机智能家居控制系统设计

*单片机设计介绍,基于单片机智能家居控制系统设计。

QQ2193276455的博客 1715

Tengine+Lua插件编译安装

由来 Nginx 整体采用模块化设计,有丰富的模块库和第三方模块库,配置灵活。其中模块化设计是Nginx的一大卖点,甚至http服务器核心功能也是一个模块。要注意的是:nginx的模块是静态的,添加和删除模块都要对nginx进行重新编译。 所以淘宝对Nginx做了二次开发,也就是Tengine。 Tengine 支持官方所有的 HTTP 模块动态加载而不必重新编译 Nginx,除非是第三方模块才需...

weixin_43865893的博客 2617

Android PackageManagerService 总结(一)应用市场下载安装apk流程

前言: 本篇文章是对系统包安装流程的总结,基于Android12 上 com.android.packageinstaller 源码的分析,第三方应用商城(华为商城,小米商城,应用宝,豌豆荚,酷安等)下载安装应 用,在普通安装和静默安装app两种方式下,对代码流程的梳理和讲解。 触发安装: 当你在商城界面中点击安装按钮,应用会自动下载,下载完成后就会调起系统安装应用的界面,此种触发方式一般是通过Intent 隐式调用的,我们先阅读如下代码: ......

u012514113的专栏 1万+

TENGINE+LUA配置

【代码】TENGINE+LUA配置。

weixin_43842574的博客 341

IFRS 9与CECL对比解析:跨国企业财务必须掌握的两种信用损失模型

本文深度解析IFRS 9与CECL两种信用损失模型的差异,帮助跨国企业应对财务合规挑战。从基础架构、数据治理到监管策略,详细对比三阶段模型与单一阶段模型的核心区别,并提供实施双轨制的实务建议,助力企业优化资本管理和税务筹划。

3c4x5z6v7b的博客 668

基于Arduino 的 FM 调频收音机

这是一个基于 Arduino 的开源的收音机项目,它具备一台标准收音机的全部功能,从控制部分到外壳都可以自己 DIY。在项目中,我们将介绍让 FM 收音机调谐器的 RDA5807 模块与 I2C 协议进行通信的方法,整个过程只需要两根线就可以与 IC 通信,接线非常简单。3D 打印的外壳也非常简洁。总之,是个非常简单和实用的项目,来试试吧!

ByteBox的博客 1642

使用tengine作为基础,在nginx中加入lua模块

首先,为什么要这么做呢,使用openresty不就可以支持lua了吗,没错。 那这篇文章结束吧。 不过…openresty不能支持会话保持和主动健康检测,我想拥有tengine的功能,又想支持lua,只有两种办法,第一种 下载地址: https://codeload.github.com/openresty/lua-nginx-module/tar.gz/refs/tags/v0.10.9rc7 https://codeload.github.com/vision5/ngx_devel_kit/tar.gz

草,卷起来了。 2689

【2025年华为秋招(AI)-11月19日-第二题(200分)- 终端款型聚类识别】(题目+思路+Java&C++&Python解析+在线测试)

该摘要总结了题目要求、输入输出格式、KMeans算法的实现步骤以及关键点。以下是150字内的摘要: 本文提出基于KMeans算法对终端型号进行聚类的方法。通过包间隔时长、连接持续时长、漫游前后信号强度4个特征,使用欧氏距离度量相似度。算法采用固定初始化策略(前k个样本作为初始质心),经过分配-更新迭代,直至质心移动小于1e-8或达到最大迭代次数。最终输出各簇样本数并按升序排列,解决了终端型号自动分类问题。示例显示该方法能有效识别3-4类终端,并准确统计每类数量。

m0_73659489的博客 141

tengine定制加上lua tengine-2.3.3 版本 cjson使用

因为需要tengine的特定功能,也需要lua进行一些定制开发,结合两个功能,需要编译支持lua的版本的tengine ,nginx 特定版带lua的tengine 相当于openrestry

weixin_42145354的博客 1558

基于 STM32 与压电薄膜的婴儿睡眠呼吸暂停监测床垫设计

本设计以 STM32F103C8T6 为主控,结合 PVDF 压电薄膜传感器,通过模拟信号调理与数字峰值检测算法,实现了对婴儿睡眠呼吸状态的实时监测。系统结构简单、成本低廉、无接触无束缚,当检测到 20 秒以上无呼吸信号时自动触发声光报警,可有效降低婴儿睡眠呼吸暂停带来的安全风险。后续可扩展蓝牙 / WiFi 模块,将报警信息推送至家长手机端,实现远程监护。

weixin_42300449的博客 149

YOLO11涨点优化:训练技巧 | 使用标签平滑(Label Smoothing)配合余弦退火学习率,防止过拟合,稳步提点

摘要: YOLO11凭借动态卷积核调度、自适应特征融合等创新成为2026年目标检测主流,但面临训练集过拟合问题。文章聚焦两种零推理开销的正则化技巧:标签平滑(Label Smoothing)和余弦退火学习率(Cosine Annealing LR)。标签平滑通过软化硬标签(如将[1,0]改为[0.9,0.1])防止模型过度自信,代码中通过label_smoothing=0.1一键启用;余弦退火则以平滑的余弦曲线调整学习率(cos_lr=True),避免阶梯衰减的震荡。两者组合可显著缩小YOLO11训练与验证

2601_95807009的博客 45

【镜像制作】tengine+lua的镜像制作

本章节主要讲解tengine-2.4.1+lua的镜像制作,本文列举出该镜像所用到的一些模块或安装包,以及一些nginx的配置,像nginx.conf主配置,以及日志格式的配置。便于一些网友们在制作类似镜像时可以下载相关的包来参考制作docker镜像,后续将整个包压缩上传到资源。

weixin_56364253的博客 964

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

学习使用Tengine+Lua+GraphicsMagick 实现图片自动裁剪缩放

学习使用Tengine+Lua+GraphicsMagick 实现图片自动裁剪缩放 使用Tengine+Lua+GraphicsMagick 实现图片自动裁剪缩放,在互联网电商网站( PC、移动)中,根据请求指定尺寸的图片自动生成相应的缩略图 简单介绍 Tengine (1)淘宝优化改良的Nginx,并集成了Lua模块 (2)负责展示图片和调度Lua脚本、同时带有...

丨Anna丨的博客 679

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Tengine + Lua + GraphicsMagick 实现图片自动裁剪/缩放

1.产生的背景随着互联网的快速发展、需求频繁变更、内容数量的俱增、时间的持续增长,图片数量也会越来越多。在实际需求中,会出现在若干个页面或同一个页面不同位置,展示同一条信息以及其缩略图。在这时,如果使用 CSS 控制图片显示的大小,对于那些与该位置不成比例的图片,缩小后就会出现图片变形。也不可能让编辑人员,对所有的图片进行 PS,这时候就产生了强烈的自动化裁剪、缩放图片的需求,来适应不同规格的缩略图

qq_38799155的博客 891

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Tengine+Lua+GraphicsMagick实现图片的自动裁剪缩放

目的:根据请求指定尺寸的图片自动生成相应的缩略图片 eg:https://gma.alicdn.com/bao/uploaded/i4/47838996/O1CN01MvnLA62GKDWbMykB4_!!0-saturn_solar.jpg_500x500.jpg_.webp eg:https://gma.alicdn.com/bao/uploaded/i4/47838996/O1CN01Mvn...

qq_35273686的博客 486

linux环境下使用Tengine+Lua+GraphicsMagick实现图片自动裁剪缩放

linux环境下使用Tengine+Lua+GraphicsMagick实现图片自动裁剪缩放 本文由个人总结,如需转载使用请标明原著及原文地址 有人说简单的图片缩放,使用css样式就行了,但是css进行设置有几个明显的缺点 1.图片大的话,加载速度慢,浪费空间 2.如果设置的比例不对,图片会变形 使用Tengine+Lua+GraphicsMagick实现图片自动裁剪缩放的好处在于,这种...

Devil的博客 1172

Tengine + Lua + GraphicsMagick 实现图片自动裁剪/缩放 - 腾勇的个人页面 - 开源中国社区...

Tengine + Lua + GraphicsMagick 实现图片自动裁剪/缩放 - 腾勇的个人页面 - 开源中国社区 Tengine + Lua + GraphicsMagick 实现图片自动裁剪/缩放 - 腾勇的个人页面 - 开源中国社区 ...

108
上一篇: swagger的介绍使用
下一篇: nexus搭建私服
GoldWashing
博客等级 码龄8年 18粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值