mohamed7sameer / laravel-tinify
Laravel Facade for tinify API
Requires
- php: >=7.4
- illuminate/support: >=6.0
- tinify/tinify: >=1.5
README
此软件包提供了与Tinify(即TinyPNG)API的集成。
该软件包提供了一个Tinify外观,它作为对tinify/tinify-php的包装器。
安装
使用Composer安装此包
composer require mohamed7sameer/laravel-tinify
Laravel 5.5+
如果您不使用自动发现,请将ServiceProvider添加到config/app.php
中的providers数组中
... mohamed7sameer\LaravelTinify\LaravelTinifyServiceProvider::class ...
在config/app.php
中添加别名
... 'Tinify' => mohamed7sameer\LaravelTinify\Facades\Tinify::class ...
配置
发布软件包的配置,这将创建config目录中的tinify.php配置文件
php artisan vendor:publish --provider="mohamed7sameer\LaravelTinify\LaravelTinifyServiceProvider"
设置环境变量“TINIFY_APIKEY”以使用您的API密钥或设置config/tinify.php中的api_key
此软件包适用于MIT许可。
压缩图像
您可以将任何WebP、JPEG或PNG图像上传到Tinify API进行压缩。我们将自动检测图像类型,并根据TinyPNG或TinyJPG引擎进行优化。上传文件或提供图像的URL后,将自动开始压缩。
您可以选择本地文件作为源,并将其写入另一个文件。
$source = Tinify::fromFile("unoptimized.webp")->->toFile("optimized.webp");
您还可以从缓冲区(二进制字符串)上传图像并获取压缩图像数据。
$sourceData = file_get_contents("unoptimized.jpg"); $resultData = Tinify::fromBuffer($sourceData)->toBuffer();
您也可以提供图像的URL而不是上传它。
$source = Tinify::fromUrl("https://tinypng.com/images/panda-happy.png")->toFile("optimized.png");
调整图像大小
使用API创建上传图像的调整大小版本。通过让API处理调整大小,您可以避免自己编写此类代码,并且只需上传一次图像。调整大小的图像将得到最佳压缩,并且外观清晰。
您还可以利用智能裁剪来创建关注图像中最视觉重要的区域的缩略图。
调整大小算作额外的压缩。例如,如果您上传单个图像并检索优化版本以及2个调整大小版本,这总计算作3次压缩。
要调整图像大小,请在一个图像源上调用resize方法
$source = Tinify::fromFile("large.jpg"); $resized = $source->resize(array( "method" => "fit", "width" => 150, "height" => 100 )); $resized->toFile("thumbnail.jpg");
如果目标尺寸大于原始尺寸,则不会对图像进行缩放。为了保护图像质量,阻止缩放。
转换图像
您可以使用API将您的图像转换为所需的图像类型。Tinify目前支持在WebP、JPEG和PNG之间进行转换。当您在转换请求中提供多个图像类型时,将返回给您最小的版本。
图像转换算作额外的压缩。
$source = Tinify::fromFile("panda-sticker.jpg"); $converted = $source->convert(array("type" => ["image/webp","image/png"])); $extension = $converted->result()->extension(); $converted->toFile("panda-sticker." . $extension);
具有透明度的图像具有透明背景的图像将仅转换为支持透明度的格式。如果您想包括不支持透明度的格式(如JPEG),可以使用transform对象指定背景颜色来替换透明度。
如果您希望将具有透明背景的图像转换为具有实色背景的图像,请指定transform对象中的background属性。如果提供此属性,透明图像的背景将被填充。
$source = Tinify::fromFile("panda-sticker.png"); $converted = $source->convert(array("type" => "image/jpeg"))->transform(array("background" => "#000000")); $converted->toFile("panda-sticker.jpg");
laravel backpack仪表板
如果您正在使用Laravel Backpack仪表板,请按照以下步骤操作
php artisan make:job TinifyFileJob php artisan make:job TinifyImageJob
<?php namespace App\Jobs; use Exception; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldBeUnique; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Storage; use mohamed7sameer\LaravelTinify\Facades\Tinify; use PhpParser\Node\Stmt\Return_; class TinifyFileJob implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; /** * Create a new job instance. */ public $filename; public $filepath; public $extension; public $disk; public function __construct($main,$file,$filename) { $this->filename = $filename; $this->extension = $file->getClientOriginalExtension(); $this->disk = $main->getDisk(); } /** * Execute the job. */ public function handle(): void { $extensions = ['JPEG','PNG','WebP','JPG']; $filename= $this->filename; $extension= $this->extension; $disk= $this->disk; try{ if (in_array(strtoupper($extension), $extensions)) { $image = Storage::disk($disk)->get($filename); $resultData = Tinify::fromBuffer($image)->toBuffer(); if($resultData){ Storage::disk($disk)->delete($filename); Storage::disk($disk)->put($filename, $resultData); } } }catch( Exception $e){ } } }
<?php namespace App\Jobs; use Exception; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldBeUnique; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Storage; use mohamed7sameer\LaravelTinify\Facades\Tinify; class TinifyImageJob implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; /** * Create a new job instance. */ public $finalPath ; public $disk ; public function __construct($finalPath,$disk) { $this->finalPath = $finalPath; $this->disk = $disk; } /** * Execute the job. */ public function handle(): void { try{ $image = Storage::disk($this->disk)->get($this->finalPath); $resultData = Tinify::fromBuffer($image)->toBuffer(); if($resultData){ Storage::disk($this->disk)->delete($this->finalPath); Storage::disk($this->disk)->put($this->finalPath, $resultData); } }catch( Exception $e){ } } }
# QUEUE_CONNECTION=sync QUEUE_CONNECTION=database
php artisan queue:work
// config/backpack/crud.php // 'uploaders' => [ // 'withFiles' => [ // 'image' => \Backpack\CRUD\app\Library\Uploaders\SingleBase64Image::class, // 'upload' => \Backpack\CRUD\app\Library\Uploaders\SingleFile::class, // 'upload_multiple' => \Backpack\CRUD\app\Library\Uploaders\MultipleFiles::class, // ], // ], 'uploaders' => [ 'withFiles' => [ 'image' => \mohamed7sameer\LaravelTinify\Backpack\Uploaders\SingleBase64Image::class, 'upload' => \mohamed7sameer\LaravelTinify\Backpack\Uploaders\SingleFile::class, 'upload_multiple' => \mohamed7sameer\LaravelTinify\Backpack\Uploaders\MultipleFiles::class, ], ],