7

Die Funktion imagecopyresampled nützlich ist ein Miniaturbild zu erzeugen oder die Größe von Bildern, während Seitenverhältnis zu halten:Wählen PHP Ändern der Bildgröße Algorithmus

$fn = $_FILES['data']['tmp_name']; 
$size = getimagesize($fn); 
$width = $size[0]; 
$height = $size[1]; 
$ratio = $width/$height; 
if ($ratio > 1 && $size[0] > 500) { $width = 500; $height = 500/$ratio; } 
else { if ($ratio <= 1 && $size[1] > 500) { $width = 500 * $ratio; $height = 500; }} 
$src = imagecreatefromstring(file_get_contents($fn)); 
$dst = imagecreatetruecolor($width, $height); 
imagecopyresampled($dst, $src, 0, 0, 0, 0, $width, $height, $size[0], $size[1]); 
imagedestroy($src); 
imagejpeg($dst, 'test.jpg'); 
imagedestroy($dst); 

Wie kann ich die Größe neu bestimmen Algorithmus von PHP wählen?
Hinweis: wie angegeben in this question, Einstellung imagesetinterpolation($dst, IMG_BILINEAR_FIXED); oder solche Dinge scheint nicht zu funktionieren.


Nach Tests, die ich (in einer anderen Sprache) tat, „bilinear Redimensionierung“ gibt manchmal besseres Ergebnis als bikubische, und manchmal ist es das Gegenteil (abhängig, ob es oder upsizing Downsizing).

+0

Wie bereits erwähnt (http://php.net/manual/fr/function.imagecopyresampled.php#54448) von jemandem: "Es sollte beachtet werden, dass die Funktion imagecopyresampled() viel unschärfer ist als Photoshop CS bikubische Standardfunktion. Sieht ähnlich aus wie eine blury Version der bilinearen Funktion von Photoshop. In der Dokumentation wird nicht notiert, welcher Algorithmus beim Resampling verwendet wird. " – Basj

+1

Es sieht so aus, als ob es nicht auf imagecopyresampled angewendet wird - ich werde es als falsch löschen, während ich versuche, es auszuarbeiten. Es tut uns leid. –

+0

Wie gesagt [in dieser Frage] (http://stackoverflow.com/q/41729409/1422096), die Einstellung 'imagesetinterpolation ($ dst, IMG_BILINEAR_FIXED);' oder solche Dinge scheinen nicht zu funktionieren. – Basj

Antwort

8

eine alternative ist die imagescale() Funktion, welche den Interpolations-Algorithmus als Parameter ermöglicht die Angabe:

imagescale($image, $new_width, $new_height, $algorithm); 

Gemäß der Dokumentation $algorithm kann sein:

Ein IMG_NEAREST_NEIGHBOUR, IMG_BILINEAR_FIXED, IMG_BICUBIC, IMG_BICUBIC_FIXED oder irgendetwas anderes (wird mit zwei Durchläufen verwendet werden).

Ein Test in PHP 7.0.15 (Vergleich von Hash-Datei) zeigt, dass BICUBIC und BICUBIC_FIXED Ergebnis in einem anderen Bild, während BILINEAR_FIXED und NEAREST_NEIGHBOUR Ergebnis in dem gleichen Bild.

+0

Scheint gut! Ich werde so schnell wie möglich testen. – Basj

+1

@Basj das ist die Antwort, die ich mir geben würde. Ich denke, es ist richtig für deine Bedürfnisse ...? –

0

Warum verwenden Sie nicht eine Bibliothek? Ich denke, wenn Sie eine PHP-Bibliothek verwenden, wird es einfacher. Versuchen Sie this one. Hoffe es wird dir helfen.

+0

@Cakpep überprüfen Sie die neue Bearbeitung und lesen Sie erneut für die wahre Bedeutung der Frage. Sie können [** 'edit' **] (http://stackoverflow.com/posts/41889086/edit) Ihre Antwort mit neuen Infos, wenn Sie möchten ... –

+0

danke, sorry für mein schlechtes Englisch: D – cakpep

+0

Diese Bibliothek erlaubt es nicht, den Algorithmus zu ändern. Siehe [diesen Kommentar] (https://github.com/eventviva/php-image-resize/issues/68): 'http://php.net/manual/en/function.imagecopyresampled.php dies ist die verwendete Funktion intern von Bibliothek. Ich konnte keine Informationen darüber finden, welcher Algorithmus von der Funktion verwendet wird. – Basj

0

Nun, Sie könnten die PHP-Quelle herunterladen, fügen Sie Ihre Filterfunktion und kompilieren PHP.

hier können Sie die Filter finden https://github.com/php/php-src/blob/master/ext/gd/libgd/gd_interpolation.c#L481

hier ist der Schalter Fall, in dem Sie die Methode https://github.com/php/php-src/blob/master/ext/gd/libgd/gd_interpolation.c#L2530

hier anzuwenden haben, können Sie Konstanten definieren https://github.com/php/php-src/blob/master/ext/gd/libgd/gd.h#L137

glücklich Hacking: D

+0

Mit dieser Antwort ist nichts falsch. Es ist korrekt für den vorherigen Wortlaut der Frage, der andeutete, dass der Fragesteller den Quellcode eines Neuabtastungsalgorithmus modifizieren wollte. Ich habe die Frage bearbeitet. @VitalijMik, überprüfe den neuen Schnitt, wenn du [** 'change' **] (http://stackoverflow.com/posts/41889429/edit) willst, deine Antwort auch ... –

4

imagecopyresampled basiert/Teil von LibGD, durch Blick auf den Quellcode von LibGD, können Sie deutlich sehen, implementation, auch die Dokumentation ist n ot zweideutig über den verwendeten Algorithmus, wie es festgestellt, dass:

Wenn der Quell- und Zielbereich in der Größe unterscheiden, wird der Bereich bilineare Interpolation für True Color Bilder Größe verändert verwenden und Nächster-Nachbar-Interpolation für Palette Bilder.

Wie können Sie den von PHP verwendeten Größenänderungsalgorithmus auswählen?

Wenn Sie bestehen/müssen LibGD-Funktionen verwenden, können Sie nicht (es sei denn Sie PHP mit einer LibGD-Gabel neu kompilieren Sie Code nur für diese Angelegenheit).

Wenn Sie jedoch eine andere Bildbearbeitungsbibliothek verwenden können, können Sie einfach eine verwenden, die einen anderen Algorithmus zur Größenanpassung verwendet, zum Beispiel Imagick scheint eine breite Palette von Interpolationen anzubieten, aber seit documentation ist ziemlich stumm hier sind die Konstanten benötigt, um die Imagick::setImageInterpolateMethod(int $) Verfahren zu verwenden:

const INTERPOLATE_UNDEFINED = 0; 
const INTERPOLATE_AVERAGE = 1; 
const INTERPOLATE_BICUBIC = 2; 
const INTERPOLATE_BILINEAR = 3; 
const INTERPOLATE_FILTER = 4; 
const INTERPOLATE_INTEGER = 5; 
const INTERPOLATE_MESH = 6; 
const INTERPOLATE_NEARESTNEIGHBOR = 7; 
const INTERPOLATE_SPLINE = 8;