generazione delle miniature imagemagick con php - utilizzando -crop
-
16-09-2019 - |
Domanda
Molto tempo fa ho creato una piccola biblioteca per il ridimensionamento delle immagini utilizzando ImageMagick attraverso system(...)
perché non ho la sensazione che il build-in funzioni di ImageMagick per PHP sono stati sufficienti.
Tuttavia, di recente ho dovuto port ad un progetto symfony e ho scelto di usare sfThumbnailPlugin (se non ricordo male). Questo, purtroppo, non ha incluso la funzionalità delle colture - vale a dire per specificare una dimensione desiderata, per esempio 300x300 px e hanno la miniatura ritagliata in modo che si adattano. Ho scelto di implementare questa funzionalità me stesso, ma sembra che ci sia qualcosa che non va.
Ogni volta che ridimensionare un'immagine ad una dimensione desiderata non whe larghezza è superiore all'altezza, le proporzioni vengono avvitati. Date un'occhiata a questo esempio: http://i37.tinypic.com/9hkqrl.png -. In questo esempio la riga superiore è corrette proporzioni e la riga inferiore è il problema
Nell'esempio, la parte superiore e inferiore avrebbero dovuto essere tagliate.
Ecco il codice per la parte in cui viene effettuato il raccolto (i nomi delle variabili devono essere auto-esplicativo):
<?php
if ($width/$height > $this->maxWidth/$this->maxHeight) {
// then resize to the new height...
$command .= ' -resize "x'.$this->maxWidth.'"';
// ... and get the middle part of the new image
// what is the resized width?
$resized_w = ($this->maxWidth/$height) * $width;
// crop
$command .= ' -crop "'.$this->maxHeight.'x'.$this->maxWidth.'+'.round(($resized_w - $this->maxWidth)/2).'+0"';
} else {
// or else resize to the new width
$command .= ' -resize "'.$this->maxHeight.'x"';
// ... and get the middle part of the new image
// what is the resized height?
$resized_h = ($this->maxHeight/$width) * $height;
// crop
$command .= ' -crop "'.$this->maxWidth.'x'.$this->maxHeight.
'+0+'.round(($resized_h - $this->maxHeight)/2).'" +repage';
}
IS è la seconda parte della if che produce il codice errato.
Qualcuno può correggere questo per me? Ovviamente i calcoli sono sbagliati.
Soluzione
La soluzione è stata la seguente:
if ($width/$height > $this->maxWidth/$this->maxHeight) {
// then resize to the new height...
$command .= ' -resize "x'.$this->maxHeight.'"';
// ... and get the middle part of the new image
// what is the resized width?
$resized_w = ($this->maxHeight/$height) * $width;
// crop
$command .= ' -crop "'.$this->maxWidth.'x'.$this->maxHeight.'+'.round(($resized_w - $this->maxWidth)/2).'+0" +repage';
} else {
$command .= ' -resize "' . $this->maxWidth . 'x"';
$resized_h = ($this->maxWidth/$width) * $height;
// crop
$command .= ' -crop "'.$this->maxWidth.'x'.$this->maxHeight.
'+0+'.round(($resized_h - $this->maxHeight)/2).'" +repage';
}
Altri suggerimenti
dico un suggerimento si può provare,
Ho visto il link Immagine penso che le condizioni non sono controllati in modo corretto.
condizioneè stata selezionata [(larghezza / altezza)> (maxwidth / maxHeight)] Al posto di controllo
if (width == altezza) {}
elseif (larghezza> altezza) {}
altro (larghezza
Controlla questa condizione e in base a questa condizione delle colture l'immagine e ridimensionare.
Grazie