Datei nach upload verkleiner und speichern

supersalzi

Erfahrenes Mitglied
Hi,

habe folgendes Problem, und habs nicht geschaft mir aus dem Forum eine Lösung zu erarbeiten.

Ich lade ein Bild per php hoch und ermittel dessen Größe; das geht.
Nun brauche ich ein kleines und ein größeres Bild. Dazu errechne ich die Höhe und Weite der 2 neuen Bilder; geht auch.

Und nun möchte ich 2 Bilder auf dem server speichern, die die neu errechnete Größe haben; wie geht das?

Ohne Größenenderung hatte ich es mal mit copy() gemacht, aber da gibts jetzt fehler.
Ich komme mit den image funktionen nicht so ganz klar, welche nehme ich denn nun am sinnvollsten?
Danke!

PHP:
// set max px  
	$maxAvatarWidth = '80';
	$maxAvatarHight = '80';
	$maxImgWidth = '180';
	$maxImgHight = '220';

	$imgInfo = getimagesize($tempname);

	$origWidth = $imgInfo['0'];
	$origHight = $imgInfo['1'];
	
	if($origWidth > $origHight){			//wenn Querformat
	
		$avatarFactor = $origWidth / $maxAvatarWidth ;
				
		$newAvatarWidth = $origWidth / $avatarFactor;		//
		$newAvatarHight = $origHight / $avatarFactor ;
	
		$imgFactor = $origWidth / $maxImgWidth ;
				
		$newImgWidth = $origWidth / $imgFactor;
		$newImgHight = $origHight / $imgFactor;
				
	}elseif($origWidth < $origHight){		//wenn Hochformat
	
		$avatarFactor = $origHight / $maxAvatarHight ;
				
		$newAvatarWidth = $origWidth / $avatarFactor;
		$newAvatarHight = $origHight / $avatarFactor ;
	
		$imgFactor = $origHight / $maxImgHight ;
				
		$newImgWidth = $origWidth / $imgFactor;
		$newImgHight = $origHight / $imgFactor;
	}
	
	
	$newImgName = "img$_SESSION[id].jpg";
	
	$newAvatarName = "avatar$_SESSION[id].jpg";
	
	
	$nesAvatar = imagecreate($newAvatarWidth, $newAvatarHight);
	
	
	$newImg = imagecreate($newImgWidth, $newImgHight);
	 
	 
	copy("$newAvatar", "content/waldis/daten/img/$newAvatarName");
	
	copy("$newImg", "content/waldis/daten/img/$newImgName");
 
Hi,
muss nochmal bissle pushen...

Ich wühle die ganze Zeit im Forum, doch komme einfach nicht weiter.

Ich versteh nicht wie ich meine Datei speichern kann, habs so versucht, aber es geht nichts

Wäre nett wenn mir mal jemand hilft, ich verstehe es einfach nicht, $newImgFile ist zur Zeit 1, warum auch immer...


Denke mal hier liegt das Problem:
PHP:
$newImg = imagecreate($newImgWidth, $newImgHeight);
	
	$newImgFile = imagejpeg($newImg,$newImgName, 100);
Danke!
 
supersalzi hat gesagt.:
Wäre nett wenn mir mal jemand hilft, ich verstehe es einfach nicht, $newImgFile ist zur Zeit 1, warum auch immer...
Warum dies so ist, zeigt dir ein Blick in das Manual.

Denke mal hier liegt das Problem:
PHP:
$newImg = imagecreate($newImgWidth, $newImgHeight);
	
	$newImgFile = imagejpeg($newImg,$newImgName, 100);
Mit [phpf]imagecreate[/phpf] erzeugst du im Speicher ein neues (und damit leeres!) Bild. Das schreibst du daraufhin mittels [phpf]imagejpeg[/phpf] in eine Datei. Der entscheidende Schritt, nämlich das Verkleinern des Bildes, fehlt! Am besten verwendet man hierzu [phpf]imagecopyresampled[/phpf]. Und bevor es zu Problemen kommt: verwende lieber [phpf]imagecreatetruecolor[/phpf] anstatt [phpf]imagecreate[/phpf].

Viel Erfolg!
 
Hi,

Jo, danke erstmal, php.net hatte ich auch schon gelesen, aber die imagecopyresampled war mir neu.

Um mein Problem nochmal zu formulieren: Ich checke nicht, wie und ob überhaupt etwas in Variablen geschrieben werden muss (ob etwas links vom = sein soll)?

PHP:
// $tempname kommt von weiter oben, $tempname = $_FILES['userimg']['tmp_name'];

$newImgName = "img$_SESSION[id].jpg";
	$newImgPath = "content/waldis/daten/img/";
	
	$newImg =  imagecreatetruecolor($newImgWidth, $newImgHeight);
	
	$newImgFile = imagejpeg($newImg, $newImgPath $newImgName, 100);
	
	$newImgXX = imagecopyresampled( $newImgFile , $tempname);
 
Ich weiss nicht genau ob ich das gleiche Problem habe aber ich Denke schon.

Mittels PHP upload script lade ich Bilder in einen Ordner, jedoch sind die Bilder in der Original grösse und sind ca. 500kb Breit 2000px hoch 1700px gross.
Ich hätte sie aber gerne ca. 80kb Breit 200px hoch 150px gross geht das?

wen ja bin ich hier richtig?
 
Hallo!

@crashx, wie Du die Breite und Höhe berechnest siehst Du in diesem und zahlreichen anderen Threads.
Die Dateigrösse kannst Du nur bedingt beeinflussen, denn diese ist von den im Bild befindlichen Farbinformationen abhängig.
So hat ein farbiges Bild mehr Farbinformationen als ein Graustufenbild, daraus resultiert für ein farbiges Bild auch eine grössere Dateigrösse als für ein Graustufenbild (bei gleichen Dimensionen).
Du kannst die Dateigrösse aber auch mit dem Qualitätsgrad in imagejpeg() beeinflussen, 100 = 100% Qualität.
Matthias hat ja schon Funktionen/Links genannt, danach solltest Du also schauen.

Gruss Dr Dau
 
Hi, sorry, hatte nicht genau in die Beispiele geschaut...

ok, jetzt geht es so ein bisschen, aber ich will nochmal was fragen:

Wie verhält sich das denn nun mit der Proportionalität? Muss ich die neue Höhe und Weite errechnen, oder reicht die jeweils größere Größe von den beiden?
Im Beispiel sieht es so aus:
PHP:
if ($width && ($width_orig < $height_orig)) {
   $width = ($height / $height_orig) * $width_orig;
} else {
   $height = ($width / $width_orig) * $height_orig;
}
Aber mir ist nicht ganz klar wo zb width im else-Fall definiert wird.

Bei mir schauts jetzt so aus:

PHP:
$newPath = "content/waldis/daten/img/";
	
	$newImgName = "img$_SESSION[id].jpg";
	
		
	$newImg =  imagecreatetruecolor($newImgWidth, $newImgHeight);
	
	$newImgTemp =  imagecreatefromjpeg($tempname);
	
	imagecopyresampled($newImg, $newImgTemp, 0, 0, 0, 0, $newImgWidth, $newImgHeight, $origWidth, $origHeight);
	
	imagejpeg($newImg, "$newPath $newImgName", 100);

Wo ist der Zusamenhang von imagecreatetruecolor und imagecreatefromjpeg? Warum nimmt zweiteres Bezug auf ersteres, liegt das an diesem Dateizeiger?

@crashx glaube du bist hier richtig.
 
@ Dr Dau

Danke für die Info, nur das Problem bei mir ist das ich auf diesem Gebiet noch ein richtiges Greenhorn bin und das ganze noch nicht richtig Verstehe, aber was ich bis jetzt erreicht habe, glaube ich ist für mich nicht schlecht.

Wie muss ich den das ganze in mein upload script einfügen?

upload.php

PHP:
<?
include("dbconnect.php");

if (isset($_FILES)) 
  {
    for($i = 0; $i < count($_FILES['file']['tmp_name']); ++$i)
      {
        $tempname = $_FILES['file']['tmp_name'][$i];
        $name     = $_FILES['file']['name'][$i];
        if (is_uploaded_file($tempname))
          {
            move_uploaded_file($tempname,"../upload/images/$name");
            echo "Die Datei $name wurde erfolgreich hochgeladen!<br />";
          }
                     $eintrag = " 
                                INSERT INTO 
                    `auto` 
              		SET 
                    `marke`  = '".mysql_real_escape_string($marke)."', 
                    `typ`    = '".mysql_real_escape_string($typ)."', 
                    `ccm`    = '".mysql_real_escape_string($ccm)."', 
                    `jahr`   = '".mysql_real_escape_string($jahr)."', 
                    `km`     = '".mysql_real_escape_string($km)."', 
                    `farbe`  = '".mysql_real_escape_string($farbe)."', 
                    `preis`  = '".mysql_real_escape_string($preis)."', 
                    `beschr` = '".mysql_real_escape_string($beschr)."', 
                    `pic1`   = '".mysql_real_escape_string('upload/images/'.$_FILES['file']['name'][0])."', 
                    `pic2`   = '".mysql_real_escape_string('upload/images/'.$_FILES['file']['name'][1])."', 
                    `pic3`   = '".mysql_real_escape_string('upload/images/'.$_FILES['file']['name'][2])."'"; 
 			$eintragen = mysql_query($eintrag);  
	}
echo mysql_error();
?>

Weil ich die zusammenhänge noch nicht richtig verstehe, wäre ich euch Dankbar wen ihr mir Helfen könnt.

kann mir den niemand helfen?
 
Zuletzt bearbeitet:
Zurück