Ich möchte einen PHP-Code schreiben, der jedes über ein Formular hochgeladene Bild automatisch auf 147 x 147 Pixel skaliert, aber ich habe keine Ahnung, wie ich vorgehen soll (ich bin ein relativer PHP-Neuling).
Bisher habe ich Bilder erfolgreich hochgeladen, Dateitypen erkannt und Namen bereinigt, aber ich möchte die Größenänderungsfunktion in den Code einfügen. Zum Beispiel habe ich ein Testbild mit 2,3 MB und einer Größe von 1331 x 1331, und ich möchte, dass der Code es verkleinert, was meiner Meinung nach auch die Dateigröße des Bildes dramatisch komprimieren wird.
Bisher habe ich folgendes:
if ($_FILES) {
//Put file properties into variables
$file_name = $_FILES['profile-image']['name'];
$file_size = $_FILES['profile-image']['size'];
$file_tmp_name = $_FILES['profile-image']['tmp_name'];
//Determine filetype
switch ($_FILES['profile-image']['type']) {
case 'image/jpeg': $ext = "jpg"; break;
case 'image/png': $ext = "png"; break;
default: $ext=""; break;
}
if ($ext) {
//Check filesize
if ($file_size < 500000) {
//Process file - clean up filename and move to safe location
$n = "$file_name";
$n = ereg_replace("[^A-Za-z0-9.]", "", $n);
$n = strtolower($n);
$n = "avatars/$n";
move_uploaded_file($file_tmp_name, $n);
} else {
$bad_message = "Please ensure your chosen file is less than 5MB.";
}
} else {
$bad_message = "Please ensure your image is of filetype .jpg or.png.";
}
}
$query = "INSERT INTO users (image) VALUES ('$n')";
mysql_query($query) or die("Insert failed. " . mysql_error() . "<br />" . $query);
Haben Sie Beispiele wie diese ausprobiert stackoverflow.com/questions/10029838/image-resize-with-php ?
– Coenie Richards
1. Februar 2013 um 15:34 Uhr
ohne die zu ändern upload_max_filesize in php.iniErstens ist es möglich, die Datei mit einer Größe von mehr als hochzuladen upload_max_filesize?. Gibt es eine Möglichkeit, die Größe des Bildes mehr als zu ändern upload_max_filesize? ohne Veränderung upload_max_filesize in php.ini
– Rch
27. Dezember 2018 um 12:24 Uhr
Ian Atkin
Sie müssen entweder PHP verwenden ImageMagick oder GD Funktionen zum Arbeiten mit Bildern.
Aus eigener Erfahrung reduziert das Bild-Resampling von GD auch die Dateigröße drastisch, insbesondere beim Resampling von Rohbildern von Digitalkameras.
Speichern Sie Bilder als BLOBS? Ich würde empfehlen, Bilder im Dateisystem zu speichern und Referenzen in Ihre Datenbank einzufügen. Ich empfehle auch, die vollständige Dokumentation zu GD (oder ImageMagick) zu lesen, um zu sehen, welche anderen Optionen Ihnen zur Verfügung stehen.
– Ian Atkin
1. Februar 2013 um 15:47 Uhr
Beachten Sie, dass diese Lösung nur für JPEGs funktioniert. Sie können imagecreatefromjpeg durch eines der folgenden ersetzen: imagecreatefromgd, imagecreatefromgif, imagecreatefrompng, imagecreatefromstring, imagecreatefromwbmp, imagecreatefromxbm, imagecreatefromxpm, um mit unterschiedlichen Bildtypen umzugehen.
– Chris Hanson
1. Februar 2013 um 15:50 Uhr
@GordonFreeman Vielen Dank für das großartige Code-Snippet, aber es gibt einen Fehler, fügen Sie hinzu abs()wie ceil($width-($width*abs($r-$w/$h))) und das Gleiche gilt für den Höhenteil. Es ist für einige Fälle erforderlich.
– Arman P.
31. Juli 2013 um 18:50 Uhr
Ändern des Standard-Beschneidungswerts auf „true“ und Ändern der Bildgröße um http://wallpapercave.com/wp/wc1701171.jpg bis 400×128 (Banner) ein schwarzes Bild erstellt; Ich kann mir aber nicht erklären, warum es das tut.
– FoxInFlame
29. Oktober 2016 um 14:12 Uhr
Um das in der Größe geänderte Bild im Dateisystem zu speichern, fügen Sie hinzu imagejpeg($dst, $file); nach dem imagecopyresampled($dst,... Linie. Ändern $file wenn Sie das Original nicht überschreiben möchten.
– Wöchentlich
20. Januar 2020 um 20:57 Uhr
mabdullahse
Verwenden Sie einfach die GD-Funktionen von PHP (wie z Bildmaßstab):
Diese Ressource(defekter Link) ist ebenfalls eine Überlegung wert – ein sehr ordentlicher Code, der GD verwendet. Ich habe jedoch ihr letztes Code-Snippet geändert, um diese Funktion zu erstellen, die die OP-Anforderungen erfüllt …
function store_uploaded_image($html_element_name, $new_img_width, $new_img_height) {
$target_dir = "your-uploaded-images-folder/";
$target_file = $target_dir . basename($_FILES[$html_element_name]["name"]);
$image = new SimpleImage();
$image->load($_FILES[$html_element_name]['tmp_name']);
$image->resize($new_img_width, $new_img_height);
$image->save($target_file);
return $target_file; //return name of saved file in case you want to store it in you database or show confirmation message to user
}
Sie müssen auch diese PHP-Datei einbinden…
<?php
/*
* File: SimpleImage.php
* Author: Simon Jarvis
* Copyright: 2006 Simon Jarvis
* Date: 08/11/06
* Link: http://www.white-hat-web-design.co.uk/blog/resizing-images-with-php/
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details:
* http://www.gnu.org/licenses/gpl.html
*
*/
class SimpleImage {
var $image;
var $image_type;
function load($filename) {
$image_info = getimagesize($filename);
$this->image_type = $image_info[2];
if( $this->image_type == IMAGETYPE_JPEG ) {
$this->image = imagecreatefromjpeg($filename);
} elseif( $this->image_type == IMAGETYPE_GIF ) {
$this->image = imagecreatefromgif($filename);
} elseif( $this->image_type == IMAGETYPE_PNG ) {
$this->image = imagecreatefrompng($filename);
}
}
function save($filename, $image_type=IMAGETYPE_JPEG, $compression=75, $permissions=null) {
if( $image_type == IMAGETYPE_JPEG ) {
imagejpeg($this->image,$filename,$compression);
} elseif( $image_type == IMAGETYPE_GIF ) {
imagegif($this->image,$filename);
} elseif( $image_type == IMAGETYPE_PNG ) {
imagepng($this->image,$filename);
}
if( $permissions != null) {
chmod($filename,$permissions);
}
}
function output($image_type=IMAGETYPE_JPEG) {
if( $image_type == IMAGETYPE_JPEG ) {
imagejpeg($this->image);
} elseif( $image_type == IMAGETYPE_GIF ) {
imagegif($this->image);
} elseif( $image_type == IMAGETYPE_PNG ) {
imagepng($this->image);
}
}
function getWidth() {
return imagesx($this->image);
}
function getHeight() {
return imagesy($this->image);
}
function resizeToHeight($height) {
$ratio = $height / $this->getHeight();
$width = $this->getWidth() * $ratio;
$this->resize($width,$height);
}
function resizeToWidth($width) {
$ratio = $width / $this->getWidth();
$height = $this->getheight() * $ratio;
$this->resize($width,$height);
}
function scale($scale) {
$width = $this->getWidth() * $scale/100;
$height = $this->getheight() * $scale/100;
$this->resize($width,$height);
}
function resize($width,$height) {
$new_image = imagecreatetruecolor($width, $height);
imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
$this->image = $new_image;
}
}
?>
Ihre Probe ist die beste. Es funktioniert direkt im Zend-Framework, ohne Komödien, Dramen oder Haarrisse zu machen. Daumen hoch
– Benutzer285594
31. Oktober 2016 um 15:57 Uhr
Ich denke, der gesamte Code, den Sie benötigen, sollte in meiner Antwort enthalten sein, aber dies kann auch helfen: gist.github.com/arrowmedia/7863973 .
– Ban-Geoengineering
12. Juni 2017 um 20:42 Uhr
Danke! gute Arbeit
– Nuri Akman
30. Dezember 2021 um 11:35 Uhr
Wenn Ihnen das Seitenverhältnis egal ist (dh Sie möchten das Bild auf eine bestimmte Größe zwingen), finden Sie hier eine vereinfachte Antwort
Lassen Sie uns nun den Upload-Teil behandeln. Laden Sie im ersten Schritt die Datei in das gewünschte Verzeichnis hoch. Rufen Sie dann eine der oben genannten Funktionen basierend auf dem Dateityp (jpg, png oder gif) auf und übergeben Sie den absoluten Pfad Ihrer hochgeladenen Datei wie folgt:
// jpg change the dimension 750, 450 to your desired values
$img = resize_imagejpg('path/image.jpg', 750, 450);
Der Rückgabewert $img ist ein Ressourcenobjekt. Wir können an einem neuen Ort speichern oder das Original wie folgt überschreiben:
// again for jpg
imagejpeg($img, 'path/newimage.jpg');
Hoffe, das hilft jemandem. Weitere Informationen zum Ändern der Größe finden Sie unter diesen Links Imagick::resizeImage und imagejpeg()
danigore
(WICHTIG: Im Falle einer Größenänderung der Animation (animiertes Webp oder GIF) ist das Ergebnis ein nicht animiertes, aber in der Größe geändertes Bild ab dem ersten Frame! (Die Originalanimation bleibt erhalten…)
Ich habe dies zu meinem erstellt php7.2 Projekt (Beispiel imagebmp sure (PHP 7 >= 7.2.0) ):php/manual/function.imagebmp) Über techfry.com/php-tutorialmit GD2, (also keine Bibliothek von Drittanbietern) und der Antwort von Nico Bistolfi sehr ähnlich, funktioniert aber mit allen fünf grundlegenden Bild-Mimetypen (png, jpeg, webp, bmp und gif), Erstellen einer neuen Datei mit geänderter Größe, ohne das Original zu ändern, und alles in einer Funktion und sofort einsatzbereit (Kopieren und Einfügen in Ihr Projekt). (Sie können die Erweiterung der neuen Datei mit dem fünften Parameter festlegen oder einfach so lassen, wenn Sie das Original behalten möchten):
function createResizedImage(
string $imagePath="",
string $newPath="",
int $newWidth = 0,
int $newHeight = 0,
string $outExt="DEFAULT"
) : ?string
{
if (!$newPath or !file_exists ($imagePath)) {
return null;
}
$types = [IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_GIF, IMAGETYPE_BMP, IMAGETYPE_WEBP];
$type = exif_imagetype ($imagePath);
if (!in_array ($type, $types)) {
return null;
}
list ($width, $height) = getimagesize ($imagePath);
$outBool = in_array ($outExt, ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp']);
switch ($type) {
case IMAGETYPE_JPEG:
$image = imagecreatefromjpeg ($imagePath);
if (!$outBool) $outExt="jpg";
break;
case IMAGETYPE_PNG:
$image = imagecreatefrompng ($imagePath);
if (!$outBool) $outExt="png";
break;
case IMAGETYPE_GIF:
$image = imagecreatefromgif ($imagePath);
if (!$outBool) $outExt="gif";
break;
case IMAGETYPE_BMP:
$image = imagecreatefrombmp ($imagePath);
if (!$outBool) $outExt="bmp";
break;
case IMAGETYPE_WEBP:
$image = imagecreatefromwebp ($imagePath);
if (!$outBool) $outExt="webp";
}
$newImage = imagecreatetruecolor ($newWidth, $newHeight);
//TRANSPARENT BACKGROUND
$color = imagecolorallocatealpha ($newImage, 0, 0, 0, 127); //fill transparent back
imagefill ($newImage, 0, 0, $color);
imagesavealpha ($newImage, true);
//ROUTINE
imagecopyresampled ($newImage, $image, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
// Rotate image on iOS
if(function_exists('exif_read_data') && $exif = exif_read_data($imagePath, 'IFD0'))
{
if(isset($exif['Orientation']) && isset($exif['Make']) && !empty($exif['Orientation']) && preg_match('/(apple|ios|iphone)/i', $exif['Make'])) {
switch($exif['Orientation']) {
case 8:
if ($width > $height) $newImage = imagerotate($newImage,90,0);
break;
case 3:
$newImage = imagerotate($newImage,180,0);
break;
case 6:
$newImage = imagerotate($newImage,-90,0);
break;
}
}
}
switch (true) {
case in_array ($outExt, ['jpg', 'jpeg']): $success = imagejpeg ($newImage, $newPath);
break;
case $outExt === 'png': $success = imagepng ($newImage, $newPath);
break;
case $outExt === 'gif': $success = imagegif ($newImage, $newPath);
break;
case $outExt === 'bmp': $success = imagebmp ($newImage, $newPath);
break;
case $outExt === 'webp': $success = imagewebp ($newImage, $newPath);
}
if (!$success) {
return null;
}
return $newPath;
}
Du bist großartig! Dies ist eine einfache und saubere Lösung. Ich hatte Probleme mit dem Imagick-Modul und löse Probleme mit dieser einfachen Klasse. Danke!
– Ivijan Stefan Stipic
19. Juli 2019 um 6:43 Uhr
Großartig, wenn Sie möchten, kann ich später ein weiteres Update hinzufügen, ich verbessere dies ein wenig.
– Ivijan Stefan Stipic
22. Juli 2019 um 9:38 Uhr
sicher! Ich habe immer noch keine Zeit, den Teil zur Größenänderung der Animation zu erstellen …
– danigore
6. August 2019 um 18:40 Uhr
@danigore, wie man die Größe von RAW-Bildern ändert (.cr2, .dng, .nef und dergleichen)? GD2 hat keine Unterstützung und nach viel Mühe konnte ich ImageMagick einrichten. Es schlägt jedoch mit einem Verbindungszeitüberschreitungsfehler beim Lesen der Datei fehl. Und auch kein Fehlerprotokoll..
– Krishna Chebrolu
16. August 2019 um 13:03 Uhr
@danigore Ich füge Ihrer Funktion die automatische Bilddrehung hinzu, um Apple-Probleme zu beheben.
Du bist großartig! Dies ist eine einfache und saubere Lösung. Ich hatte Probleme mit dem Imagick-Modul und löse Probleme mit dieser einfachen Klasse. Danke!
– Ivijan Stefan Stipic
19. Juli 2019 um 6:43 Uhr
Großartig, wenn Sie möchten, kann ich später ein weiteres Update hinzufügen, ich verbessere dies ein wenig.
– Ivijan Stefan Stipic
22. Juli 2019 um 9:38 Uhr
sicher! Ich habe immer noch keine Zeit, den Teil zur Größenänderung der Animation zu erstellen …
– danigore
6. August 2019 um 18:40 Uhr
@danigore, wie man die Größe von RAW-Bildern ändert (.cr2, .dng, .nef und dergleichen)? GD2 hat keine Unterstützung und nach viel Mühe konnte ich ImageMagick einrichten. Es schlägt jedoch mit einem Verbindungszeitüberschreitungsfehler beim Lesen der Datei fehl. Und auch kein Fehlerprotokoll..
– Krishna Chebrolu
16. August 2019 um 13:03 Uhr
@danigore Ich füge Ihrer Funktion die automatische Bilddrehung hinzu, um Apple-Probleme zu beheben.
– Ivijan Stefan Stipic
10. Oktober 2019 um 11:23 Uhr
Ich habe eine benutzerfreundliche Bibliothek zur Größenänderung von Bildern erstellt. Es kann gefunden werden hier auf Github.
Ein Beispiel für die Verwendung der Bibliothek:
// Include PHP Image Magician library
require_once('php_image_magician.php');
// Open JPG image
$magicianObj = new imageLib('racecar.jpg');
// Resize to best fit then crop (check out the other options)
$magicianObj -> resizeImage(100, 200, 'crop');
// Save resized image as a PNG (or jpg, bmp, etc)
$magicianObj -> saveImage('racecar_small.png');
Weitere Funktionen, falls Sie sie benötigen, sind:
Schnelle und einfache Größenänderung – Ändern Sie die Größe auf Querformat, Hochformat oder automatisch
Einfache Ernte
Text hinzufügen
Qualitätsanpassung
Wasserzeichen
Schatten und Reflexionen
Transparenzunterstützung
Lesen Sie EXIF-Metadaten
Ränder, abgerundete Ecken, Rotation
Filter und Effekte
Bildschärfung
Konvertierung des Bildtyps
BMP-Unterstützung
Das hat meinen Tag gerettet. Es gibt jedoch eine kleine Mitteilung an jemanden, der wie ich 3 Tage lang gesucht hat und dabei war, die Hoffnung aufzugeben, eine Lösung zur Größenänderung zu finden. Wenn Sie in Zukunft undefinierte Indexhinweise sehen, sehen Sie sich einfach diesen Link an: github.com/Oberto/php-image-magician/pull/16/commits Und wenden Sie die Änderungen auf die Dateien an. Es funktioniert 100% ohne Probleme.
– Hema_Elmasry
20. August 2019 um 12:22 Uhr
Hey, @Hema_Elmasry. FYI, ich habe diese Änderungen gerade in die Hauptdatei zusammengeführt 🙂
– Jarrod
26. August 2019 um 21:05 Uhr
Okay, sorry, ist mir nicht aufgefallen. Aber ich habe eine Frage. Wenn ich eine Größenänderung auf eine kleinere Auflösung bei unveränderter Qualität durchführe, ist die angezeigte Bildqualität viel geringer. Ist Ihnen etwas Ähnliches schon einmal passiert? Weil ich immer noch keine Lösung gefunden habe.
Haben Sie Beispiele wie diese ausprobiert stackoverflow.com/questions/10029838/image-resize-with-php ?
– Coenie Richards
1. Februar 2013 um 15:34 Uhr
ohne die zu ändern
upload_max_filesize
inphp.ini
Erstens ist es möglich, die Datei mit einer Größe von mehr als hochzuladenupload_max_filesize
?. Gibt es eine Möglichkeit, die Größe des Bildes mehr als zu ändernupload_max_filesize
? ohne Veränderungupload_max_filesize
inphp.ini
– Rch
27. Dezember 2018 um 12:24 Uhr