ipridham/croppa

通过特定格式的URL为Laravel创建图像缩略图

维护者

详细信息

github.com/ipridham/croppa

来源

4.7.1 2018-02-23 00:34 UTC

README

Packagist Build Status

Croppa 是一个用于Laravel 4.x、5.x和Lumen(仅本地存储)的缩略图生成器包。它与将缩略图尺寸存储在模型中的库不同,例如 Paperclip。相反,调整大小和裁剪指令来自特定格式的URL。例如,假设你有一个图像的路径

/uploads/09/03/screenshot.png

要生成一个 300x200 的缩略图,你需要将路径更改为

/uploads/09/03/screenshot-300x200.png

当然,此文件尚不存在。Croppa 监听特定格式的图像路由并在飞快地生成缩略图,将图像数据(带有正确头部的数据)输出到浏览器,而不是返回404响应。

同时,它将新裁剪的图像保存到磁盘上的相同位置(你请求的 "…-300x200.png" 路径)。因此,**所有未来的请求都直接从磁盘提供服务**,绕过了PHP及其所有开销。换句话说,**你的应用程序**不需要启动就只为服务一个图像。这是与其他类似库的不同之处。

从4.0版本开始,Croppa 通过 Flysystem 集成允许将图像存储在远程磁盘上,如S3、Dropbox、FTP等。

安装

服务器要求

  • gd
  • exif - 如果你希望Croppa根据exif元数据自动旋转来自手机等设备的图像,则需要此模块。

Laravel

  1. 将Croppa添加到你的项目中: composer require bkwld/croppa
  2. 如果使用Laravel < 5.5
    • 将Croppa添加到你的 app 配置的提供者列表中: 'Bkwld\Croppa\ServiceProvider'
    • 将外观添加到你的 app 配置的别名中: 'Croppa' => 'Bkwld\Croppa\Facade'

Lumen

  1. 将Croppa添加到你的项目中: composer require bkwld/croppa
  2. 启用外观并在 bootstrap/app.php 中添加外观: class_alias('Bkwld\Croppa\Facade', 'Croppa');.
  3. 在 bootstrap/app.php 中添加提供者: $app->register('Bkwld\Croppa\ServiceProvider');.
  4. 在项目根目录下创建一个名为 'config' 的目录,并将配置文件复制到那里,然后将其重命名为 croppa.php。
  5. 将一个Laravel辅助文件,如 这个文件 添加到你的 composer.json 中的文件自动加载部分。

Nginx

当使用 Nginx HTTP服务器模板配置 时,在位于文件 h5bp/location/expires.conf 中的媒体位置块中添加 error_page 404 = /index.php?$query_string;

# Media: images, icons, video, audio, HTC
location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
  error_page 404 = /index.php?$query_string;
  expires 1M;
  access_log off;
  add_header Cache-Control "public";
}

配置

请参阅 配置文件的源代码 了解配置选项的文档。以下是常见设置的示例(更多信息可以在 这里找到

您可以通过运行以下命令将配置文件发布到应用程序的配置目录中

php artisan vendor:publish --tag=croppa

本地src和裁剪目录

最常见的情况,src图像及其裁剪是在doc_root的 "uploads" 目录中创建的。

return [
	'src_dir' => public_path().'/uploads',
	'crops_dir' => public_path().'/uploads',
	'path' => 'uploads/(.*)$',
];

因此,如果您有 <img src="<?=Croppa::url('/uploads/file.jpg', 200)?>">,返回的URL将是 /uploads/file-200x_.jpg,源图像将在 public_path().'/uploads/file.jpg' 中查找,新的裁剪将在 public_path().'/uploads/file-200x_.jpg' 中创建。由于由 Croppa::url() 生成的URL指向裁剪创建的位置,因此Web服务器(Apache等)将在下一个请求中直接提供服务(您的应用程序不需要启动即可提供图像)。

这里还有一个例子

return [
	'src_dir' => '/www/public/images',
	'crops_dir' => '/www/public/images/crops',
	'path' => 'images/(?:crops/)?(.*)$',
	'url_prefix' => '/images/crops/',
];

如果您有 <img src="<?=Croppa::url('http://domain.com/images/crops/file.jpg', 200, 100)?>">,返回的URL将是 http://domain.com/images/crops/file-200x100.jpg,源图像将在 /www/public/images/file.jpg 中查找,新的裁剪将在 /www/public/images/crops/file-200x100.jpg 中创建。

S3上的源图像,本地裁剪

这对于负载均衡环境是一个很好的解决方案。每个应用程序服务器最终都会有它自己的裁剪图像缓存,因此会有一些空间浪费。但是Web服务器(Apache等)仍然可以直接在后续的裁剪请求中提供服务。

// Early in App bootstrapping, bind a Flysystem instance.  This example assumes
// you are using the `graham-campbell/flysystem` Laravel adapter package
// https://github.com/GrahamCampbell/Laravel-Flysystem
App::singleton('s3', function($app) {
	return $app['flysystem']->connection();
});

// Or alternatively, without the Laravel-Flysystem package
App::singleton('s3', function () {
    return Storage::disk('s3')->getDriver();
});

// Croppa config.php
return [
	'src_dir' => 's3',
	'crops_dir' => public_path().'/uploads',
	'path' => 'uploads/(.*)$',
];

因此,如果您有 <img src="<?=Croppa::url('/uploads/file.jpg', 200, 100)?>">,返回的URL将是 /uploads/file-200x100.jpg,源图像将在作为Flysystem实例配置部分的S3存储桶中立即查找,新的裁剪将在 /uploads/file-200x100.jpg 中创建。

用法

Croppa使用的URL模式是

/path/to/image-widthxheight-option1-option2(arg1,arg2).ext

所以这些都是有效的

/uploads/image-300x200.png             // Crop to fit in 300x200
/uploads/image-_x200.png               // Resize to height of 200px
/uploads/image-300x_.png               // Resize to width of 300px
/uploads/image-300x200-resize.png      // Resize to fit within 300x200
/uploads/image-300x200-quadrant(T).png // See the quadrant description below

Croppa::url($url, $width, $height, array($options))

为了使准备Croppa期望的URL变得更加容易,您可以使用以下视图辅助函数

<img src="<?=Croppa::url($url, $width, $height, $options)?>" />
<!-- Examples (that would produce the URLs above) -->
<img src="<?=Croppa::url('/uploads/image.png', 300, 200)?>" />
<img src="<?=Croppa::url('/uploads/image.png', null, 200)?>" />
<img src="<?=Croppa::url('/uploads/image.png', 300)?>" />
<img src="<?=Croppa::url('/uploads/image.png', 300, 200, array('resize'))?>" />
<img src="<?=Croppa::url('/uploads/image.png', 300, 200, array('pad'))?>" />
<img src="<?=Croppa::url('/uploads/image.png', 300, 200, array('pad' => array(45,168,147)))?>" />
<img src="<?=Croppa::url('/uploads/image.png', 300, 200, array('quadrant' => 'T'))?>" />
<!-- Or, if there were multiple arguments for the last example -->
<img src="<?=Croppa::url('/uploads/image.png', 300, 200, array('quadrant' => array('T')))?>" />

Croppa::url()接受的参数如下

  • $url : 源图像的URL。使用path配置正则表达式提取相对于src_dir的图像路径。
  • $width : 一个数字或null作为通配符
  • $height : 一个数字或null作为通配符
  • $options - 键值对数组,其中值是选项的可选参数数组。支持选项有
    • resize - 通过调整大小使图像适合提供的宽度和高度。省略时,默认为裁剪以适应边界(除非一边是通配符)。
    • pad - 将图像填充到所需的尺寸。将图像移动到中心,并用给定的颜色填充其余部分。如果没有指定颜色,则使用白色[255,255,255]
    • quadrant($quadrant) - 使用传递的四分之一方向裁剪图像的剩余溢出。支持的$quadrant值是:T - 顶部(适用于头像),B - 底部,L - 左侧,R - 右侧,C - 中心(默认)。有关更多信息,请参阅PHPThumb文档
    • trim($x1, $y1, $x2, $y2) - 在应用$width和$height参数之前,裁剪源图像到由两组坐标($x1, $y1, ...)定义的大小。这是用于与前端裁剪UI(如jcrop)一起使用的设计,以便您尊重用户定义的裁剪选择,然后用Croppa输出缩略图或尺寸减小的版本。
    • trim_perc($x1_perc, $y1_perc, $x2_perc, $y2_perc) - 与trim()具有相同的效果,但接受坐标作为百分比。因此,图像的左上角是"0",图像的右下角是"1"。因此,如果您想裁剪图像到中心周围的一半大小,您将添加一个选项trim_perc(0.25,0.25,0.75,0.75)
    • quality($int) - 将jpeg压缩质量设置为0到100。
    • interlace($bool) - 设置为10以打开或关闭交织
    • upscale($bool) - 将其设置为 10 以允许图像被放大。如果为假且请求比源图像更大的尺寸,它将 创建与原始源图像一样大的图像。

Croppa::render($cropurl)

如果您想通过程序创建图像,可以将Croppa::url生成的URL传递给此函数。这将只创建缩略图并退出。

Croppa::render('/uploads/image-300x200.png');

或者

Croppa::render(Croppa::url('/uploads/image.png', 300, 200));

Croppa::delete($url)

您可以通过运行以下命令来删除源图像及其所有裁剪(例如,如果删除了相关的数据库行)

Croppa::delete('/path/to/src.png');

Croppa::reset($url)

Croppa::delete() 类似,但保留源图像,仅删除裁剪。

Croppa::reset('/path/to/src.png');

控制台命令

croppa:purge

删除 所有 裁剪。它通过递归扫描 crops_dir 并匹配所有具有Croppa命名约定的文件(其中可以找到相应的 src 文件)来实现。接受以下选项

  • --filter - 将白名单正则表达式过滤器应用于裁剪。例如:--filter=^01/ 匹配 "./public/uploads/01/" 目录中的所有裁剪
  • --dry-run - 将要删除的文件输出到控制台,但实际上并不删除

croppa.js

包含一个模块,用于从JS准备格式化的URL。当您从AJAX请求的JSON响应创建视图时,这可能很有用;您不需要在服务器上格式化URL。它可以通过Require.js、CJS或作为浏览器全局变量加载。

croppa.url(url, width, height, options)

与PHP中的 Croppa::url 类似,但选项的格式化方式不同(因为JS没有关联数组)。

croppa.url('/path/to/img.jpg', 300, 200, ['resize']);
croppa.url('/path/to/img.jpg', 300, 200, ['resize', {quadrant: 'T'}]);
croppa.url('/path/to/img.jpg', 300, 200, ['resize', {quadrant: ['T']}]);

运行 php artisan asset:publish bkwld/croppa 将使Laravel将JS复制到您的公共目录。它默认将放在 /public/packages/bkwld/croppa/js。

历史记录

请阅读Github上的 项目发布 以获取发布说明。

此捆绑包使用 PHPThumb 来执行所有的 图像缩放。 "Crop" 等同于它的 adaptiveResize(),而 "resize" 则是 ... 调整大小。通过 Flysystem 提供了对非本地磁盘的交互支持。