bupy7 / yii2-widget-cropbox
这是 https://github.com/bupy7/js-cropbox 的小部件包装。此小部件允许在上传到服务器之前裁剪图像,并将裁剪信息作为JSON字符串发送。
Requires
- bower-asset/js-cropbox: ~0.12.0
- yiisoft/yii2: *
- yiisoft/yii2-bootstrap: *
Requires (Dev)
- friendsofphp/php-cs-fixer: 2.2.3
- phpunit/phpunit: >=4.8 <6.0.0
- satooshi/php-coveralls: ^1.0.1
README
这是针对 js-cropbox 的 Yii2 小部件包装。
插件演示和文档
安装
安装此扩展的首选方式是通过 composer。
运行以下命令:
$ php composer.phar require --prefer-dist bupy7/yii2-widget-cropbox "*"
或者将以下内容添加到你的 composer.json 文件的 require 部分:
"bupy7/yii2-widget-cropbox": "*"
to the require section of your composer.json file.
如果你使用 v4.1.2,请访问 v4.1.2。
如果你使用 v3.0.1,请访问 v3.0.1。
如果你使用 v2.2,请访问 v2.2。
如果你使用 v1.0,请访问 v1.0。
选项
$pluginOptions
包含 js-cropbox 包装的配置。
(array) $variants
:裁剪图像的变体。
更多信息: https://github.com/bupy7/js-cropbox#object-variants
(array) [$selectors]
:cropbox附加事件的CSS选择器。
- (string) fileInput
- (string) btnCrop
- (string) btnReset
- (string) btnScaleIn
- (string) btnScaleOut
- (string) croppedContainer
- (string) croppedDataInput
- (string) messageContainer
(array) [$messages]
:每个变体的警告消息。
使用
例如,我将使用 Imagine extensions for Yii2 https://github.com/yiisoft/yii2-imagine。你也可以使用其他东西。
在你的控制器动作中添加:
... if ($model->load(Yii::$app->request->post())) { $model->image = \yii\web\UploadedFile::getInstance($model, 'image'); if ($model->save()) { return $this->redirect(['index']); } } ...
在你的视图中添加:
use bupy7\cropbox\CropboxWidget; $form = ActiveForm::begin([ 'options' => ['enctype'=>'multipart/form-data'], ]); ... echo $form->field($model, 'image')->widget(CropboxWidget::className(), [ 'croppedDataAttribute' => 'crop_info', ]); ...
在你的模型中添加:
... use yii\helpers\FileHelper; use yii\imagine\Image; use yii\helpers\Json; use Imagine\Image\Box; use Imagine\Image\Point; ... public $image; public $crop_info; ... public function rules() { ... [ 'image', 'image', 'extensions' => ['jpg', 'jpeg', 'png', 'gif'], 'mimeTypes' => ['image/jpeg', 'image/pjpeg', 'image/png', 'image/gif'], ], ['crop_info', 'safe'], ... } ... public function afterSave($insert, $changedAttributes) { ... // open image $image = Image::getImagine()->open($this->image->tempName); // rendering information about crop of ONE option $cropInfo = Json::decode($this->crop_info)[0]; $cropInfo['dWidth'] = (int)$cropInfo['dWidth']; //new width image $cropInfo['dHeight'] = (int)$cropInfo['dHeight']; //new height image $cropInfo['x'] = $cropInfo['x']; //begin position of frame crop by X $cropInfo['y'] = $cropInfo['y']; //begin position of frame crop by Y // Properties bolow we don't use in this example //$cropInfo['ratio'] = $cropInfo['ratio'] == 0 ? 1.0 : (float)$cropInfo['ratio']; //ratio image. //$cropInfo['width'] = (int)$cropInfo['width']; //width of cropped image //$cropInfo['height'] = (int)$cropInfo['height']; //height of cropped image //$cropInfo['sWidth'] = (int)$cropInfo['sWidth']; //width of source image //$cropInfo['sHeight'] = (int)$cropInfo['sHeight']; //height of source image //delete old images $oldImages = FileHelper::findFiles(Yii::getAlias('@path/to/save/image'), [ 'only' => [ $this->id . '.*', 'thumb_' . $this->id . '.*', ], ]); for ($i = 0; $i != count($oldImages); $i++) { @unlink($oldImages[$i]); } //saving thumbnail $newSizeThumb = new Box($cropInfo['dWidth'], $cropInfo['dHeight']); $cropSizeThumb = new Box(200, 200); //frame size of crop $cropPointThumb = new Point($cropInfo['x'], $cropInfo['y']); $pathThumbImage = Yii::getAlias('@path/to/save/image') . '/thumb_' . $this->id . '.' . $this->image->getExtension(); $image->resize($newSizeThumb) ->crop($cropPointThumb, $cropSizeThumb) ->save($pathThumbImage, ['quality' => 100]); //saving original $this->image->saveAs( Yii::getAlias('@path/to/save/image') . '/' . $this->id . '.' . $this->image->getExtension() ); } ...
配置
预览项目的现有图像
如果你想显示上传和裁剪的图像,你必须添加以下代码:
echo $form->field($model, 'image')->widget(CropboxWidget::className(), [ ... 'croppedImagesUrl' => [ 'url/to/small/image' ], 'originalImageUrl' => 'url/to/original/image', ]);
如果你点击预览图像,你会看到原始图像。
按实际大小裁剪图片
与之前方法的不同之处在于,我们在裁剪图片之前不调整图片大小。我们以编辑器框中看到的样子裁剪图片,并保留实际大小。
为此,我们将使用来自 $cropInfo
的 ratio
属性。
$cropInfo = Json::decode($this->crop_info)[0]; $cropInfo['dWidth'] = (int)$cropInfo['dWidth']; $cropInfo['dHeight'] = (int)$cropInfo['dHeight']; $cropInfo['x'] = abs($cropInfo['x']); $cropInfo['y'] = abs($cropInfo['y']); $cropInfo['ratio'] = $cropInfo['ratio'] == 0 ? 1.0 : (float)$cropInfo['ratio']; $image = Image::getImagine()->open($this->image->tempName); $cropSizeLarge = new Box(200 / $cropInfo['ratio'], 200 / $cropInfo['ratio']); $cropPointLarge = new Point($cropInfo['x'] / $cropInfo['ratio'], $cropInfo['y'] / $cropInfo['ratio']); $pathLargeImage = Yii::getAlias('path/to/save') . '/' . $this->id . '.' . $this->image->getExtension(); $image->crop($cropPointLarge, $cropSizeLarge) ->save($pathLargeImage, ['quality' => $module->qualityLarge]);
多次裁剪选项
如果您将在插件上设置少量裁剪,您需要执行以下操作:
在模型中
... public function afterSave($insert, $changedAttributes) { ... // open image $image = Image::getImagine()->open($this->image->tempName); $variants = [ [ 'width' => 150, 'height' => 150, ], [ 'width' => 350, 'height' => 200, ], ]; for($i = 0; $i != count(Json::decode($this->crop_info)); $i++) { $cropInfo = Json::decode($this->crop_info)[$i]; $cropInfo['dWidth'] = (int)$cropInfo['dWidth']; //new width image $cropInfo['dHeight'] = (int)$cropInfo['dHeight']; //new height image $cropInfo['x'] = abs($cropInfo['x']); //begin position of frame crop by X $cropInfo['y'] = abs($cropInfo['y']); //begin position of frame crop by Y //$cropInfo['ratio'] = $cropInfo['ratio'] == 0 ? 1.0 : (float)$cropInfo['ratio']; //ratio image. We don't use in this example //delete old images $oldImages = FileHelper::findFiles(Yii::getAlias('@path/to/save/image'), [ 'only' => [ $this->id . '.' . $i . '.*', 'thumb_' . $this->id . '.' . $i . '.*', ], ]); for ($j = 0; $j != count($oldImages); $j++) { @unlink($oldImages[$j]); } //saving thumbnail $newSizeThumb = new Box($cropInfo['dWidth'], $cropInfo['dHeight']); $cropSizeThumb = new Box($variants[$i]['width'], $variants[$i]['height']); //frame size of crop $cropPointThumb = new Point($cropInfo['x'], $cropInfo['y']); $pathThumbImage = Yii::getAlias('@path/to/save/image') . '/thumb_' . $this->id . '.' . $i . '.' . $this->image->getExtension(); $image->copy() ->resize($newSizeThumb) ->crop($cropPointThumb, $cropSizeThumb) ->save($pathThumbImage, ['quality' => 100]); //saving original $this->image->saveAs(Yii::getAlias('@path/to/save/image') . $this->id . '.' . $i . '.' . $this->image->getExtension()); } } ...
使用缩放
如果您想使用缩放,您需要在 pluginOptions
的 variants
中指定图片的最小和最大尺寸。
在模型中
// open image $image = Image::getImagine()->open($this->image->tempName); // rendering information about crop of ONE option $cropInfo = Json::decode($this->crop_info)[0]; $cropInfo['dWidth'] = (int)$cropInfo['dWidth']; //new width image $cropInfo['dHeight'] = (int)$cropInfo['dHeight']; //new height image $cropInfo['x'] = abs($cropInfo['x']); //begin position of frame crop by X $cropInfo['y'] = abs($cropInfo['y']); //begin position of frame crop by Y $cropInfo['width'] = (int)$cropInfo['width']; //width of cropped image $cropInfo['height'] = (int)$cropInfo['height']; //height of cropped image // Properties bolow we don't use in this example //$cropInfo['ratio'] = $cropInfo['ratio'] == 0 ? 1.0 : (float)$cropInfo['ratio']; //ratio image. //delete old images $oldImages = FileHelper::findFiles(Yii::getAlias('@path/to/save/image'), [ 'only' => [ $this->id . '.*', 'thumb_' . $this->id . '.*', ], ]); for ($i = 0; $i != count($oldImages); $i++) { @unlink($oldImages[$i]); } //saving thumbnail $newSizeThumb = new Box($cropInfo['dWidth'], $cropInfo['dHeight']); $cropSizeThumb = new Box($cropInfo['width'], $cropInfo['height']); //frame size of crop $cropPointThumb = new Point($cropInfo['x'], $cropInfo['y']); $pathThumbImage = Yii::getAlias('@path/to/save/image') . '/thumb_' . $this->id . '.' . $this->image->getExtension(); $image->resize($newSizeThumb) ->crop($cropPointThumb, $cropSizeThumb) ->save($pathThumbImage, ['quality' => 100]); //saving original $this->image->saveAs(Yii::getAlias('@path/to/save/image') . $this->id . '.' . $this->image->getExtension());
许可
yii2-widget-cropbox 是在 BSD 3-Clause 许可下发布的。