Skip to main content

动态图像修改代理

项目描述

Dirpy 是一个 Python 守护程序,可以在开发人员(或用户)请求任意宽度和/或高度的图像的任何地方使用。这对于让响应式页面适应不同的视口大小(即适应新发布的移动设备的显示大小)以及允许快速开发新的图形元素很有用。

通过这样做,它可以替换从单个源图像(例如缩略图)静态派生的所有图像。当与面向用户的代理网络服务器结合使用时,这可以通过减少需要手动生成的衍生图像的数量以及减少存储它们所需的磁盘空间来极大地减轻开发人员和系统管理员的负担。

Dirpy 的一些更有趣的功能包括:

  • 通过应用一个或多个修改命令即时修改源图像,包括:

    • 使用多个不同的大小/纵横比控件调整大小/缩小/放大

    • 填充图像,支持透明度

    • 裁剪图像,智能边界检测

    • 图像转置(即旋转、水平和垂直翻转)

  • 不同输入和输出图像格式之间的无缝转换

  • 从磁盘、远程 HTTP 代理和用户 POST 数据加载源图像

  • 将输出图像保存到磁盘(在充当 LRU 图像缓存时很有用)

  • JPEG ICC 配置文件支持

  • 以独立配置或通过 UWSGI 运行

  • 能够向 StatsD 守护程序报告统计信息

  • 在 redis 后端或 redis 集群中缓存结果

Dirpy API 指南中提供了 Dirpy 命令及其选项的完整列表 。

要求

Dirpy 需要 Python 的半新版本(至少 Python 2.6 或更高版本),并支持 Python 3。

它还需要 PIL 库,由Pillow fork提供。在编译安装 Pillow 之前,你应该确保宿主机已经安装了你想要支持的镜像格式的标准包和开发包,即:

  • JPG 库和开发文件(在 RedHat/Centos 中称为 libjpeg-turbo)

  • PNG 库和开发文件(在 RedHat/Centos 中称为 libpng)

  • GIF 库和开发文件(在 RedHat/Centos 中称为 giflib)

Pillow 使用的所有库都必须在 Pillow 本身之前安装,因为 PIL 在其安装过程中针对这些库进行编译和链接。有关 Pillow(以及随后的 Dirpy)支持的图像文件的完整列表,请参见 此处

安装

由于 Dirpy 可以作为 PyPI 模块使用,如果你有 pip可用,安装应该很简单:

pip install dirpy

这应该安装 Dirpy 及其所有必需的 Python 模块。如果您 必须拥有绝对最新和最好的,您可以直接从此 repo 安装:

pip install https://github.com/redfin/dirpy/zipball/master

配置

Dirpy 的配置文件相当简洁;您可以在此处找到文档化的配置文件 。

跑步

Dirpy 可以作为独立的守护进程运行,也可以作为 uWSGI vassal 运行(推荐;请参阅此处 了解更多信息)。

在 uWSGI 下运行时,可以使用 extras 目录中的 .ini 来启动 Dirpy。否则,请考虑通过 systemd(为此在 extras 目录中还有一个文件)或 sysV init 将 Dirpy 作为守护程序运行。

从命令行运行时,Dirpy 支持以下选项:

-h, –help 显示此帮助消息并退出 -c CONFIG_FILE, –config-file CONFIG_FILE Dirpy 配置文件的路径 -d, –debug 发出调试输出 -f, –foreground 不要守护进程;在前台运行程序

用法

直接脏访问

当直接访问 Dirpy(即不通过 Web 代理)时,远程客户端可以使用 Dirpy 的全部功能(这可能是福也可能是祸,因为精明和恶意的远程用户可能会使用它来造成严重破坏)。

下面是一些 Dirpy URL 示例,以及它们如何导致 Dirpy 行为的解释:

https://127.0.0.1:3000/path/to/my/file.jpg?resize=300x200,shrink

此 url 将使用文件“/path/to/my/file.jpg”作为源文件。该文件应位于 Dirpy HTTP 根目录内的本地计算机上,默认为“/var/www/html”,因此完全限定路径(假设为默认配置)将是“/var/www/html/path /to/my/file.jpg”。该文件将被调整为 300 像素的宽度和 200 像素的高度,保留纵横比,但不强制严格遵守请求的图像大小(由于缺少扭曲、填充或裁剪选项)。因此,如果此示例中的“file.jpg”是 1000x1000 的图像,它将被调整为 200x200,而不是 300x200。

https://127.0.0.1:3000/this/photo.jpg?resize=200x,grow&save=fmt:png

此 url 将使用一个源文件,其完全限定路径(如上)将为“/var/www/html/this/photo.jpg”,并且将放大到 300 像素的宽度,并以纵横比缩放高度。因此,一个 150x100 像素的源文件将被调整为 300x200。但是,由于此 url 指定了增长选项,宽度大于或等于 300 像素的源文件将通过未调整大小(尽管仍将遵循质量和输出格式等选项)。生成的图像将作为 PNG 返回。

https://127.0.0.1:3000/a/b.jpg?resize=200x400,fill&crop&save=fmt:jpg,optimize,qual:93

此 url 将使用 photo.jpg 源文件,将其调整为 200x400,填充(重叠)边界框。然后它将图像裁剪为 200x400(因为裁剪命令将继承先前调整大小命令的尺寸),然后将图像输出为压缩质量为 93% 的优化 JPEG。因此,对于 1000x1000 的源图像,首先将其大小调整为 400x400(保留纵横比,填充边界框),然后将其中心裁剪为 200x400。

https://127.0.0.1:3000/this/photo.jpg?crop=border ,symmetric&resize=150%

移除 photo.jpg 源文件周围的所有边框,然后将其大小增加 50%。

https://127.0.0.1:3000/?load=post&resize=200x&save=todisk:myfile.jpg,noshow

从 POST 加载图像(因此不需要磁盘路径),将大小调整为 200 像素宽,将其保存到 /myfilename.jpg,并且不将图像数据发送回请求者。

通过 Web 服务器代理

如果您将 Dirpy 的功能暴露给更大的 Internet, 强烈建议您通过代理网络服务器测量用户对 Dirpy 的访问。这是 Dirpy 最初设计的用例,它将防止远程用户执行任何类型的恶作剧(如果不使用代理 Web 服务器,这肯定会发生)。

使用 Nginx 将用户请求代理到 Dirpy 的示例:

location ~ ^/thumbnail/(.+\.jpg)$
{
    add_header Cache-Control "public";
    proxy_pass http://127.0.0.1:3000/src_photo/$1?resize=64x64,fill&crop;
}

这将导致对匹配/thumbnail/*.jpg的传入 url 的任何请求 被代理到后端 Dirpy 服务器(您已通过本地防火墙或其他方式限制访问,对吗?),然后生成一个使用位于<http_root>/src_photo中的相应文件的 64x64 缩略图。

性能调整

Dirpy 可以随着主机上的处理器数量线性扩展,而 CPU 是迄今为止它最重要的资源(更快/更多 CPU = 更多 Dirpy 请求/秒)。玩弄配置的 Dirpy 工作者的数量,直到找到 Dirpy 请求/秒和服务器响应之间的快乐媒介)。

此外,考虑使用 Pillow-SIMD前叉,因为它比标准 Pillow 模块提供了一些令人印象深刻的速度优势(特别是如果您有一个支持 AVX2 扩展的处理器)。要使用 Pillow-SIMD,请先安装 Pillow-SIMD,然后安装不依赖项的 Dirpy:

pip install Pillow-SIMD
pip install --no-deps dirpy

如果您已经安装了 Dirpy,并希望切换到 Pillow-SIMD,只需卸载 Pillow 并在其位置安装 Pillow-SIMD:

pip uninstall Pillow
pip install Pillow-SIMD

Dirpy 还支持通过redis Python 模块在 redis 后端或 redis 集群中缓存结果,您需要先安装它才能使用此功能:

pip install redis

在 Dirpy 中启用 redis 支持很简单;有关详细信息,请参阅配置。但是请注意,不会从(或写入)redis 服务器提供 POST 请求。

下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

dirpy-1.3.0.tar.gz (24.7 kB 查看哈希)

已上传 source