#图像处理 #代理服务器 #Web服务器 #缓存 #imageflow-tool #libimageflow #imageflow-server

imazen/imageflow

为Web服务器提供高性能的图像处理。包括 imageflow_server、imageflow_tool 和 libimageflow

30 个版本

2.0.0-preview82023年9月26日
2.0.0-preview52023年4月3日
2.0.0-preview42023年1月6日
2.0.0-preview32022年12月23日
1.4.10-rc502020年7月5日

126 in 图像

4,151 星 & 67 关注者

1KB

imageflow 以惊人的速度优化图像

tests state: release candidate

Docker Pulls view releases license: Choose AGPLv3 or Commercial

下载 极快且 更安全 的工具,以实现现代图像工作流程。

  • imageflow_tool 是一个命令行工具,用于实验、运行批处理作业、JSON作业或在需要进程隔离时使用。比 ImageMagick 快 17 倍。还能以更高的质量生成更小的文件。
  • libimageflow 适用于从您的编程语言直接(进程内)使用。请参阅我们的 Node 绑定Go 绑定Scala 绑定Elixir 绑定.NET 绑定。如果我们还没有为您的高级语言提供绑定,请考虑花费一天时间添加它们。Imageflow 有一个简单的与 C 兼容的 ABI,只需实现绑定所需的 4 个方法。
  • Imageflow.Server 是一个跨平台的软件,能够在图像传输过程中(例如:/bucket/img.jpg?w=200)直接从 HTML 中使用。源图像可以存储在 Blob 存储中、另一个服务器上或文件系统中。它是一个可用于生产的服务器,具有出色的混合磁盘缓存、支持 Azure 和 Amazon Blob 存储,并且可以轻松定制。您可以通过 Docker、虚拟机或任何云主机轻松部署它。它还与 ImageResizer API 兼容,这对于过去十年中集成到超过一千个不同的 CMS 和应用程序中的 ImageResizer 来说是很有用的。

打开问题 以分享想法、反馈或提出问题。我们相信以反馈为导向的设计,并使现实世界的使用流程更加顺畅是制作出优秀产品的最快方式。

查询字符串 API 文档

JSON API 文档

libimageflow 和 imageflow_tool 作为 自包含的二进制文件 可用于 Windows、Ubuntu 和 Mac。我们还提供 Docker 镜像 用于 Linux(需要 glibc 和 OpenSSL)。

我们感谢在 Kickstarter 上支持我们的赞助商许多 ImageResizer 的支持者 使这个项目成为现实。如果您需要 AGPLv3 许可证用于商业用途,请访问 Imageresizing.net

imageflow_tool examples --generate - 创建一个包含 JSON 作业和调用脚本的 examples 目录。

您可以使用与 ImageResizer 4 查询字符串 兼容的命令字符串。

imageflow_tool v1/查询字符串--输入来源.JPG--输出缩略图.JPG--命令"宽度=50&高度=50&模式=裁剪&格式=jpg"

或者提交一个 JSON 作业文件。JSON 作业可以有多个输入和输出,并且可以表示任何类型的操作图。

以下是从示例作业文件生成图像多个大小的示例

imageflow_tool v1/build --json examples/export_4_sizes/export_4_sizes.json
        --in waterhouse.jpg
        --out 1 waterhouse_w1600.jpg
              2 waterhouse_w1200.jpg
              3 waterhouse_w800.jpg
              4 waterhouse_w400.jpg
        --response operation_result.json

默认情况下,imageflow_tool 将 JSON 响应打印到 stdout。您可以使用 --response 将其写入磁盘。

--debug-package 将创建一个 .zip 文件,用于重现具有 v1/buildv1/querystring 的有问题的行为。请提交错误报告;我们尽力让它变得简单。

使用 Imageflow.Server 进行动态图像处理

注意:由于底层 Web 框架(iron)已被弃用且不再安全,因此已删除 imageflow_server。在过去几年中,我们建议迁移到可用于生产的 Imageflow.Server 产品,它还提供 Docker 部署(但我们建议您自己的 Dockerfile 以允许配置)

现在您可以从 HTML 中编辑图像...并且使用 srcset 而无忧。

<img src="http://localhost:39876/demo_images/u3.jpg?w=300" />

<img src="" srcset="    http://localhost:39876/demo_images/u3.jpg?w=300 300w
                        http://localhost:39876/demo_images/u3.jpg?w=800 800w
                        http://localhost:39876/demo_images/u3.jpg?w=1600 1600w" />

超越演示

您可能希望将各种图像源位置挂载到前缀。`--mount` 命令解析冒号(`:`)分隔的参数列表。第一个是您将在 URL 中使用的前缀(例如 `http://localhost:39876/prefix/`。第二个是引擎名称。其余参数将发送到引擎。

示例

  • `--mount`"`/img/:ir4_local:C:\inetpub\wwwroot\images"
  • `--mount "/proxyimg/:ir4_http:https:://myotherserver.com/imagefolder/"`(注意冒号的转义)
  • `--mount`"`/cachedstaticproxy/:permacache_proxy:https:://othersite.com"
  • `--mount`"/githubproxy/:permacache_proxy_guess_content_types:https://raw.github.com/because/it/doesnt/support/content/types"
  • `--mount`"/static/":static:./assets"

使用您语言的libimageflow

您可能会发现imageflow_tool对于您的需求来说已经足够快了。

本项目内的Crates

  • imageflow_abi - libimageflow/imageflow.dll的稳定API。libimageflow的头文件位于bindings/headers
  • imageflow_tool - 命令行工具
  • imageflow_server - HTTP服务器
  • c_components - 包含C源代码的rust crate
  • c_components/tests - C组件的测试
  • imageflow_types - 大多数crate使用的共享类型,具有JSON序列化
  • imageflow_helpers - 常用辅助函数和工具
  • imageflow_riapi - RIAPI和ImageResizer4兼容性解析/布局
  • imageflow_core - 主要库和执行引擎

已知缺陷和缺少功能(截至2020年5月)

缺陷

  • imageflow_server尚未公开JSON API。
  • 尚未进行模糊测试或第三方审计。

缺少的功能

  • 模糊处理。

延迟的功能

  • 作业成本预测(延迟 - 社区没有兴趣)

在没有Docker的情况下从源码构建

您需要更多的东西来编译Imageflow,因为它有几个C依赖项。

  1. 安装平台特定的先决条件(请找到下面的正确部分)。
  2. 克隆并进入此存储库,例如:git clone git@github.com:imazen/imageflow.git && cd imageflow)

如果您在任一平台上使用bash,则应该能够使用build.sh

  • ./build.sh clean - 清理
  • ./build.sh test - 运行所有测试
  • ./build.sh debug - 生成慢速调试二进制文件
  • ./build.sh release - 生成发布二进制文件
  • ./build.sh install - 将发布二进制文件安装到/usr/local(必须先运行`./build.sh release`)
  • ./build.sh uninstall - 卸载发布二进制文件

build.sh 将二进制文件放置在 ./artifacts/ 目录 中。

如果您使用的是 Windows 系统,请在由 win_enter_env.bat 创建的窗口中运行 build 命令。

您还可以直接使用 cargo 进行构建,尽管这样会将二进制文件放置在 ./target/release 中。* 使用 cargo test --all 在调试(慢速)模式下测试 Imageflow * 使用 cargo build --package imageflow_abi --release 编译 libimageflow/imageflow.dll * 使用 cargo build --package imageflow_tool --release 编译 imageflow_tool(.exe) * 使用 cargo build --all --release 在发布模式下编译所有内容 * 使用 cargo doc --no-deps --all --release 生成文档。

使用 Docker 从源代码构建

注意,我们不再使用 Docker 容器进行 CI,因此此方法已过时。

  1. 安装 Docker
  2. 在 bash 会话中运行(Docker + Windows WSL、macOS 或 Linux)
  3. git clone git@github.com:imazen/imageflow.git
    cd imageflow
    ./build_via_docker.sh debug
    

这将创建特定于使用的 Docker 图像的缓存,位于 ~/.docker_imageflow_caches 中。实例将是临时的;唯一的状态将存储在缓存中。

官方 Dockerfile(官方 Dockerfile)也是获取更详细的设置步骤的好地方,因为我们没有列出设置

  • Valgrind(常见版本会破坏 openssl;您可能需要从源代码构建)
  • 代码覆盖率
  • 绑定。

Linux 前提条件

(在 Ubuntu 20.04 和 22.04 上进行测试。)

#Install Rust by running
`curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain stable`
#Ensure build tools are installed (git, curl, wget, gcc, g++, nasm, pkg-config, openssl, ca-certificates)
`sudo apt-get install git wget curl build-essential pkg-config libssl-dev libpng-dev nasm `

Mac OS 前提条件

  1. 如果您还没有安装,请安装 XCode 命令行工具
  2. 如果您还没有安装,请安装 Homebrew
  3. 安装 nasm、pkg-config 和 wget brew install nasm pkg-config wget
  4. 安装 Rust

Windows WSL (Ubuntu) 前提条件

  1. 从 Windows 商店安装 Ubuntu
  2. 运行 Ubuntu 22.04 并创建您的用户名/密码
  3. sudo apt-get update 更新可用的软件包。
  4. 通过运行以下命令安装 Rust:curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain stable
  5. 确保已安装构建工具(git、curl、wget、gcc、g++、nasm、pkg-config、openssl、ca-certificates)sudo apt-get install git wget curl build-essential pkg-config libssl-dev libpng-dev nasm
  6. (可选)若要使用图形文本编辑器,请将imageflow下载到“Windows”目录,然后在Ubuntu中将其映射到位置。例如,如果您将imageflow克隆到Documents/imageflow,则运行:ln -s /mnt/c/Users/[YourWindowsUserName]/Documents/imageflow ~/win_imageflow
  7. 关闭并重新打开Ubuntu

Windows 10 先决条件

  1. 安装Visual Studio 2017 Build Tools(单独或作为VS组件)
  2. 安装Git 64位
  3. 以管理员身份运行NASM 64位安装程序 - 它不会提示。
  4. 如果您想使用64位Imageflow,请安装Rust 64位;如果您不需要64位,请安装Rust 32位。将工具链stable作为默认,并确认将其添加到PATH
  5. 打开命令行并切换到该存储库的根目录
  6. 编辑ci/wintools/SETUP_PATH.bat以确保rust/cargo、nasm、git和Git/mingw64/bin都包含在%PATH%中。
  7. 运行win_enter_env.bat以启动一个子shell(如果您想进行32位构建,请编辑它)
  8. 所有构建命令都应该在子shell中运行。运行cmd.exe /c "ci\wintools\win_verify_tools.bat"以检查工具是否存在。

如何学习网络图像处理?

首先,阅读高性能图像以了解背景。

关于这个主题的优秀教科书并不多。以下是我在个人书架上的一些书籍。在这之间(以及维基百科)我能够整理出大约60%所需的知识;其余的都是通过阅读许多流行的图像处理库的源代码获得的。

我会从头到尾阅读数字图像处理原理:核心算法,然后是数字图像扭曲。维基百科也是一个有用的参考,尽管相关页面没有链接或分类在一起 - 使用特定的搜索词,如"双线性插值""Lab颜色空间"

我找到了OpenCV、LibGD、FreeImage、Libvips、Pixman、Cairo、ImageMagick、stb_image、Skia和FrameWave的源代码,这些源代码对于理解现实世界的实现和考虑非常有用。大多数教科书假设无限平面,忽略了偏移量错误、浮点数限制、色彩空间精度和有限区域内的操作对称性。我无法推荐任何教科书作为准确的参考,只能作为概念性起点。 我在创建图像库时做了关于需要注意的问题的一些笔记

此外,请记住,计算机视觉与图像创建非常不同。在计算机视觉中,重采样精度几乎无关紧要,例如。但在图像创建中,你将图像提供给摄影师,他们的视觉感知能力比普通开发者强得多。产生的图像将与CSS和其他图像并排放置,最不重要的位的不准确度非常明显。你在与Lightroom竞争;与产生视觉完美结果的离线工具竞争。如果摄影师觉得这正在破坏他们的作品,他们将丢弃最终用户软件。

依赖项