2017-03-04 2 views
0

J'utilise l'extension Yii2 Imagine et j'ai besoin de créer des images 150x150 à partir des téléchargements d'utilisateurs.Recadrer une image du centre dans la plus grande case que vous pouvez faire dans Yii2 Imagine?

Actuellement, je suis en train de faire quelque chose comme ceci:

use yii\imagine\Image; 

.... 

Image::thumbnail($save_path, $img_size, $img_size)->save($save_path); 

Évidemment, cela peut causer des problèmes si l'une des dimensions est < 150px une fois redimensionné.

Donc ce que je suis en train de comprendre avant tout est comment pour recadrer l'image dans un carré avant il est redimensionnée, de sorte que quand je le redimensionnez il n'y aura pas un rapport quelconque aspect questions.

Maintenant, je sais que vous pouvez recadrer l'image avec quelque chose comme:

Image::crop($save_path, $img_size, $img_size, [5, 5]); 

Mais le problème est en train de faire ce avant redimensionner l'image ne sera probablement pas vous donner ce que vous voulez puisque l'image peut être si grand et le recadrage après le redimensionnement ne fonctionnera pas non plus, car une dimension peut déjà avoir été réduite à < 150px.

Donc ce que je suis en train de travailler est comment puis-je recadrer l'image avant le redimensionnement à la place taille maximale possible et du centre vers l'extérieur?

Edit:

Ok, j'ai trouvé un moyen de gérer cela, mais je me demandais s'il y avait de toute façon d'accomplir le dessous facilement ou vais-je avoir besoin de coder moi-même?

  • travail la plus petite dimension (largeur ou hauteur)
  • Ensuite, prendre cette dimension et ce sera la plus grande place, vous pouvez avoir
  • travailler sur la façon de positionner que dans le centre de la culture
  • maintenant, vous pouvez faire le redimensionnement
  • Si après la redimensionnement de chaque côté est inférieur à 150, créer la nouvelle image de fond blanc, puis centrer la nouvelle image sur cette
  • Enregistrer l'image
  • Fait! Vous ne pouvez pas utiliser le quatrième paramètre de Image :: thumbnail()?
+0

si vous ne pouvez pas accomplir avec 'imaginer/Image' essayer une autre extension comme' Gd \ Imagine' – Ripper

+0

il peut peut-être vous aider https: //imagine.readthedocs .io/fr/latest/_static/API/Imagine/Image/Box.html – bxN5

Répondre

1

Un autre essai: p

<?php 

use yii\imagine\Image; 
use Imagine\Image\Box; 
use Imagine\Image\Point; 

// ... 

$thumbnail = Image::thumbnail($save_path, $img_size, $img_size); 
$size = $thumbnail->getSize(); 
if ($size->getWidth() < $img_size or $size->getHeight() < $img_size) { 
    $white = Image::getImagine()->create(new Box($img_size, $img_size)); 
    $thumbnail = $white->paste($thumbnail, new Point($img_size/2 - $size->getWidth()/2, $img_size/2 - $size->getHeight()/2)); 
} 
$thumbnail->save($save_path); 
+0

Haha merci. Cela semble fonctionner :) – Brett

0

Image::thumbnail($save_path, $img_size, $img_size, Image\ImageInterface::THUMBNAIL_INSET)->save($save_path); 

De http://www.yiiframework.com/doc-2.0/yii-imagine-baseimage.html#thumbnail()-detail:

Si le mode miniature est ImageInterface :: THUMBNAIL_INSET, l'image originale est réduite de telle sorte qu'il est entièrement contenu dans la miniature dimensions.Le reste est rempli avec l'arrière-plan qui pourrait être configuré via yii \ imagine \ Image :: $ thumbnailBackgroundColor et yii \ imagine \ Image :: $ thumbnailBackgroundAlpha.

+0

Je vais vérifier cela et vous le faire savoir :) J'ai peut-être oublié cette option. – Brett

+0

_Almost_ a fait ce que je voulais; il ne place pas les images plus petites que la taille du pouce dans un arrière-plan rempli; ils viennent juste de sortir la taille d'origine. – Brett

+0

En fait, le tester plus ce n'est pas ce que je cherche car il réduit l'image pour obtenir l'image _whole_ dans le pouce, plutôt que de faire le plus grand carré possible à partir du centre. Merci quand même. – Brett