ipridham / croppa
通过特定格式的URL为Laravel创建图像缩略图
Requires
- php: >=5.5.0
- illuminate/console: 4 - 5
- illuminate/routing: 4 - 5
- illuminate/support: 4 - 5
- league/flysystem: ~1.0
- symfony/http-foundation: 2 - 4
- symfony/http-kernel: 2 - 4
- weotch/phpthumb: ^1.0.5
Requires (Dev)
- mockery/mockery: ~0.9
- phpunit/phpunit: 4 - 5
Conflicts
- league/flysystem-cached-adapter: <1.0.2
This package is auto-updated.
Last update: 2024-09-04 15:28:24 UTC
README
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等。
安装
服务器要求
Laravel
- 将Croppa添加到你的项目中:
composer require bkwld/croppa - 如果使用Laravel < 5.5
- 将Croppa添加到你的
app配置的提供者列表中:'Bkwld\Croppa\ServiceProvider' - 将外观添加到你的
app配置的别名中:'Croppa' => 'Bkwld\Croppa\Facade'
- 将Croppa添加到你的
Lumen
- 将Croppa添加到你的项目中:
composer require bkwld/croppa - 启用外观并在 bootstrap/app.php 中添加外观:
class_alias('Bkwld\Croppa\Facade', 'Croppa');. - 在 bootstrap/app.php 中添加提供者:
$app->register('Bkwld\Croppa\ServiceProvider');. - 在项目根目录下创建一个名为 'config' 的目录,并将配置文件复制到那里,然后将其重命名为 croppa.php。
- 将一个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)- 设置为1或0以打开或关闭交织upscale($bool)- 将其设置为1或0以允许图像被放大。如果为假且请求比源图像更大的尺寸,它将 仅 创建与原始源图像一样大的图像。
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 提供了对非本地磁盘的交互支持。