Aus Ihrer Frage geht hervor, dass Sie ein bisschen neu bei GD sind. Ich werde einige meiner Erfahrungen teilen. Vielleicht ist dies ein wenig abseits des Themas, aber ich denke, es wird für jemanden hilfreich sein, der neu bei GD ist, wie Sie:
Schritt 1, Datei validieren. Verwenden Sie die folgende Funktion, um zu überprüfen, ob die $_FILES['image']['tmp_name']
Datei eine gültige Datei ist:
function getContentsFromImage($image) {
if (@is_file($image) == true) {
return file_get_contents($image);
} else {
throw new \Exception('Invalid image');
}
}
$contents = getContentsFromImage($_FILES['image']['tmp_name']);
Schritt 2, Dateiformat abrufen Versuchen Sie die folgende Funktion mit der Erweiterung finfo, um das Dateiformat der Datei (Inhalt) zu überprüfen. Sie würden sagen, warum verwenden Sie nicht einfach $_FILES["image"]["type"]
, um das Dateiformat zu überprüfen? Weil es nur Dateierweiterung prüft nicht den Dateiinhalt, wenn jemand eine Datei ursprünglich genannt umbenennen World.png zu world.jpg , $_FILES["image"]["type"]
kehrt jpeg nicht png, so $_FILES["image"]["type"]
kann falsches Ergebnis zurück.
function getFormatFromContents($contents) {
$finfo = new \finfo();
$mimetype = $finfo->buffer($contents, FILEINFO_MIME_TYPE);
switch ($mimetype) {
case 'image/jpeg':
return 'jpeg';
break;
case 'image/png':
return 'png';
break;
case 'image/gif':
return 'gif';
break;
default:
throw new \Exception('Unknown or unsupported image format');
}
}
$format = getFormatFromContents($contents);
Schritt 3, GD-Ressource abrufen GD-Ressource aus zuvor vorhandenen Inhalten abrufen :
function getGDResourceFromContents($contents) {
$resource = @imagecreatefromstring($contents);
if ($resource == false) {
throw new \Exception('Cannot process image');
}
return $resource;
}
$resource = getGDResourceFromContents($contents);
Schritt 4, Bildgröße abrufen Jetzt können Sie die Bildgröße mit dem folgenden einfachen Code abrufen:
$width = imagesx($resource);
$height = imagesy($resource);
Nun wollen wir sehen, welche Variable wir dann vom Originalbild erhalten haben:
$contents, $format, $resource, $width, $height
OK, lets move on
Schritt 5, Berechnen von Größenargumenten für Bilder Dieser Schritt bezieht sich auf Ihre Frage. Der Zweck der folgenden Funktion besteht darin, Größenänderungsargumente für die GD-Funktion imagecopyresampled()
abzurufen. Der Code ist etwas lang, funktioniert aber hervorragend und bietet sogar drei Optionen: Strecken, Verkleinern , und Fülle.
strecken : Die Dimension des Ausgabebilds entspricht der neuen Dimension, die Sie festgelegt haben. Das Verhältnis von Höhe zu Breite wird nicht eingehalten.
Verkleinern : Die Bemaßung des Ausgabebilds überschreitet nicht die neue Bemaßung, die Sie angeben, und behält das Verhältnis von Bildhöhe zu -breite bei.
Füllen : Die Dimension des Ausgabebilds entspricht der neuen Dimension, die Sie angeben. Bei Bedarf wird das Bild zugeschnitten und in der Größe geändert , und das Verhältnis von Bildhöhe zu -breite wird beibehalten. Diese Option benötigen Sie in Ihrer Frage.
function getResizeArgs($width, $height, $newwidth, $newheight, $option) {
if ($option === 'stretch') {
if ($width === $newwidth && $height === $newheight) {
return false;
}
$dst_w = $newwidth;
$dst_h = $newheight;
$src_w = $width;
$src_h = $height;
$src_x = 0;
$src_y = 0;
} else if ($option === 'shrink') {
if ($width <= $newwidth && $height <= $newheight) {
return false;
} else if ($width / $height >= $newwidth / $newheight) {
$dst_w = $newwidth;
$dst_h = (int) round(($newwidth * $height) / $width);
} else {
$dst_w = (int) round(($newheight * $width) / $height);
$dst_h = $newheight;
}
$src_x = 0;
$src_y = 0;
$src_w = $width;
$src_h = $height;
} else if ($option === 'fill') {
if ($width === $newwidth && $height === $newheight) {
return false;
}
if ($width / $height >= $newwidth / $newheight) {
$src_w = (int) round(($newwidth * $height) / $newheight);
$src_h = $height;
$src_x = (int) round(($width - $src_w) / 2);
$src_y = 0;
} else {
$src_w = $width;
$src_h = (int) round(($width * $newheight) / $newwidth);
$src_x = 0;
$src_y = (int) round(($height - $src_h) / 2);
}
$dst_w = $newwidth;
$dst_h = $newheight;
}
if ($src_w < 1 || $src_h < 1) {
throw new \Exception('Image width or height is too small');
}
return array(
'dst_x' => 0,
'dst_y' => 0,
'src_x' => $src_x,
'src_y' => $src_y,
'dst_w' => $dst_w,
'dst_h' => $dst_h,
'src_w' => $src_w,
'src_h' => $src_h
);
}
$args = getResizeArgs($width, $height, 150, 170, 'fill');
Schritt 6, Größe ändern Bild Verwenden $args
, $width
, $height
, $format
und $ Ressource , die wir von oben in die folgende Funktion bekam und die neue Ressource des skalierte Bild erhalten:
function runResize($width, $height, $format, $resource, $args) {
if ($args === false) {
return; //if $args equal to false, this means no resize occurs;
}
$newimage = imagecreatetruecolor($args['dst_w'], $args['dst_h']);
if ($format === 'png') {
imagealphablending($newimage, false);
imagesavealpha($newimage, true);
$transparentindex = imagecolorallocatealpha($newimage, 255, 255, 255, 127);
imagefill($newimage, 0, 0, $transparentindex);
} else if ($format === 'gif') {
$transparentindex = imagecolorallocatealpha($newimage, 255, 255, 255, 127);
imagefill($newimage, 0, 0, $transparentindex);
imagecolortransparent($newimage, $transparentindex);
}
imagecopyresampled($newimage, $resource, $args['dst_x'], $args['dst_y'], $args['src_x'], $args['src_y'], $args['dst_w'], $args['dst_h'], $args['src_w'], $args['src_h']);
imagedestroy($resource);
return $newimage;
}
$newresource = runResize($width, $height, $format, $resource, $args);
Schritt 7, Neue Inhalte abrufen . Verwenden Sie die folgende Funktion, um Inhalte aus der neuen GD-Ressource abzurufen:
function getContentsFromGDResource($resource, $format) {
ob_start();
switch ($format) {
case 'gif':
imagegif($resource);
break;
case 'jpeg':
imagejpeg($resource, NULL, 100);
break;
case 'png':
imagepng($resource, NULL, 9);
}
$contents = ob_get_contents();
ob_end_clean();
return $contents;
}
$newcontents = getContentsFromGDResource($newresource, $format);
Schritt 8 Erweiterung abrufen, Verwenden Sie die folgende Funktion, um die Erweiterung des Bildformats abzurufen (Hinweis: Das Bildformat entspricht nicht der Bilderweiterung):
function getExtensionFromFormat($format) {
switch ($format) {
case 'gif':
return 'gif';
break;
case 'jpeg':
return 'jpg';
break;
case 'png':
return 'png';
}
}
$extension = getExtensionFromFormat($format);
Schritt 9 Bild speichern Wenn wir einen Benutzer namens mike haben, können Sie Folgendes tun: Er wird im selben Ordner wie dieses PHP-Skript gespeichert:
$user_name = 'mike';
$filename = $user_name . '.' . $extension;
file_put_contents($filename, $newcontents);
Schritt 10 Ressource zerstören Vergessen Sie nicht, GD-Ressource zu zerstören!
imagedestroy($newresource);
oder Sie können Ihren gesamten Code in eine Klasse schreiben und einfach Folgendes verwenden:
public function __destruct() {
@imagedestroy($this->resource);
}
TIPPS
Ich empfehle, das vom Benutzer hochgeladene Dateiformat nicht zu konvertieren, da Sie auf viele Probleme stoßen werden.