Zur Navigation

Bilderupload, resizen und mit Wasserzeichen versehen [3]

21 tobi

Die phpinfo zeigt mir das gleiche an wie deine.
Aber dern Pfad habe ich immer noch nicht rausgefunden. Gibt es da eine Möglichkeit dies rauszufinden?

11.02.2010 17:14

22 Jörg Kruse

Du hast weiter oben beschrieben, dass du die ttf Datei gefunden hast, war das nicht das Fonts-Verzeichnis?

Ansonsten einfach mal über die Suchfunktion deines Betriebssystems nach *.ttf Dateien suchen oder über eine Suchmaschine nach "<dein Betriebssystem> fonts Verzeichnis"

11.02.2010 18:48 | geändert: 11.02.2010 18:48

23 tobi

nein, die XFILES.TTF hatte ich in einem Ordner bei mir gefunden, welcher auf meinem Webspace ist und welche ich für Captcha benutze.
ich habe daher einfach die XFILES.TTF Datei zusätzlich in einen anderen Ordner geladen, in welchem auch meine
<?php
Header ("Content-type: image/gif");
$im = imagecreate (400, 30);
$black = ImageColorAllocate ($im, 0, 0, 0);
$white = ImageColorAllocate ($im, 255, 255, 255);
ImageTTFText ($im, 20, 0, 10, 20, $white, "XFLIES.TTF",
"Teste... Omega: &#937;");
ImageGif ($im);
ImageDestroy ($im);
?>
Datei ist.

EDIT:
habe nun folgendes angegeben:
ImageTTFText ($im, 20, 0, 10, 20, $white, $_SERVER['DOCUMENT_ROOT']."/upload_bilder/XFILES.TTF",
damit scheint es zu gehen.

12.02.2010 01:02 | geändert: 12.02.2010 01:20

24 tobi

falls es für nachfolgende interessant ist hier der komplette code:
Bild verkleinern in 700x525 (kann verändert werden), speichern, Wasserzeichen einfügen.

upload.php:
<?php
session_start();

   if( isset($_POST['submit']) ) {
      include('SimpleImage.php');
	  
      $image = new SimpleImage();
      $image->load($_FILES['uploaded_image']['tmp_name']);
	  $image->resize (700, 525); 
	  $image->save('bilder/Bild_01.JPG');
	  
header('Content-type: image/jpeg');	  
	  
//Bilder in Variablen Laden
$Grafik = ImageCreateFromJPEG("bilder/Bild_01.JPG");

//Wasserzeichen erstellen
$im = imagecreate (305, 30);
$black = ImageColorAllocate ($im, 0, 0, 0);
$white = ImageColorAllocate ($im, 255, 255, 255);
//ImageTTFText ($im, 20, 0, 10, 20, $white, "XFILES.TTF",
ImageTTFText ($im, 15, 0, 10, 22, $white, $_SERVER['DOCUMENT_ROOT']."/upload_bilder/ARIAL.TTF",
"© 123.de - 2010");

//Bearbeitung
ImageCopy($Grafik, $im,
imagesx($Grafik)-imagesx($im),
imagesy($Grafik)-imagesy($im), 0, 0,
imagesx($im),
imagesy($im));

//Bilder ausgabe
imagejpeg($Grafik);
//Bild Speichern
imagejpeg($Grafik, "bilder/Bild_01.JPG");	  

   } else {
?>
<p>Bilderupload mit gleichzeitigem Verkleinern und Wasserzeichen versehen</p>

   <form action="upload.php" method="post" enctype="multipart/form-data">
      <p>Bild 1:
	  <input type="file" name="uploaded_image" />
	  </p>
	  <input type="submit" name="submit" value="Upload" />
	  </p>
   </form>

<?php
   }
?>

und die dazugehörige SimpleImage.php
<?php
/*
* File: SimpleImage.php
* Author: Simon Jarvis
* Copyright: 2006 Simon Jarvis
* Date: 08/11/06
* Link: http://www.white-hat-web-design.co.uk/articles/php-image-resizing.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;   
   }      
}
?>

13.02.2010 21:14 | geändert: 13.02.2010 21:14

25 tobi

so nun klappt das ganze mit einem Bild.

Wie bekomme ich dass für mehrere Bilder hin?
Außerdem möchte ich, dass man im Formlar einen Ordnernamen angeben muss, welcher dann erstellt wird und in dem dann die hochgeladenen, verkleinerten und mit Wasserzeichen versehenen Bilder abgespeichert werden. Desweiteren soll automatisch gleich schon im Formular der dazugehörige Bildnamen angezeigt werden, unter welchem das Bild dann gespeichert wird.

quasi so:
Bilderupload.

Ordnernamen: Feld um Namen einzugeben

Bild 1: Feld 1* und danach Feld 2* (Bild_01.JPG)
Bild 2: Feld 1 und danach Feld 2 (Bild_02.JPG)
Bild 3: Feld 1 und danach Feld 2 (Bild_03.JPG)
etc.

Feld 1 = für das Bild, welches hochgeladen werden soll
Feld 2 = Name des zukünfitgen Bildes

13.02.2010 21:22

26 Jörg Kruse

Wie bekomme ich dass für mehrere Bilder hin?

Das ist auf dieser Seite des PHP Manuals beschrieben:

http://php.net/manual/de/features.file-upload.multiple.php

Außerdem möchte ich, dass man im Formlar einen Ordnernamen angeben muss, welcher dann erstellt wird und in dem dann die hochgeladenen, verkleinerten und mit Wasserzeichen versehenen Bilder abgespeichert werden. Desweiteren soll automatisch gleich schon im Formular der dazugehörige Bildnamen angezeigt werden, unter welchem das Bild dann gespeichert wird.

Das geht nicht mit dem Upload-Formular, das überträgt nur Dateien, keinen Text; das kannst du aber ja mit einem zweiten Formular nach dem Upload machen

14.02.2010 00:24

27 tobi

<p>Bilderupload mit gleichzeitigem Verkleinern und Wasserzeichen versehen</p>

   <form action="upload.php" method="post" enctype="multipart/form-data">
      <p>
	  Bild 1: <input type="file" name="uploaded_image" /><br>
	  Bild 2: <input type="file" name="uploaded_image" /><br>
	  Bild 3: <input type="file" name="uploaded_image" /><br>
	  <input type="submit" name="submit" value="Upload" />
	  </p>
   </form>

nun muß ich aber im oberen Teil des Scriptes weitere Anpassungen vornehmen, da muß ja jedes Bild richtig zu geordnet werden oder? das laden, das speichern, das resizen?

Zitat von Jörg

Das geht nicht mit dem Upload-Formular, das überträgt nur Dateien, keinen Text; das kannst du aber ja mit einem zweiten Formular nach dem Upload machen

nunja das ist jetzt nicht so tragisch, aber wie könnte das dann von statten gehen, denn ich lade ja hoch, resize und speichere, und dann soll im nachhinein in einem anderen formular das dann gehen. irgendwie im moment nicht so ganz nachvollziehbar für mich

14.02.2010 01:05 | geändert: 14.02.2010 01:16

28 Jörg Kruse

nun muß ich aber im oberen Teil des Scriptes weitere Anpassungen vornehmen, da muß ja jedes Bild richtig zu geordnet werden oder? das laden, das speichern, das resizen?

$_FILES ist dann ein Array der Bilddateien, welches du in einer Schleife auslesen kannst (in den User-Kommentaren der Manualseite finden sich auch Beispiele hierfür)

nunja das ist jetzt nicht so tragisch, aber wie könnte das dann von statten gehen, denn ich lade ja hoch, resize und speichere, und dann soll im nachhinein in einem anderen formular das dann gehen. irgendwie im moment nicht so ganz nachvollziehbar für mich

Du speicherst die Dateien nach dem Upload mit ihrem Dateinamen in einem Defaultordner - nach Absenden des zweiten Formulars kannst du sie verschieben und umbenennen.

14.02.2010 11:01

29 tobi

ich habe ein nettes upload-script gefunden, in welchem ich eine beliebige anzahl an dateifeldern angeben kann.

<?php
    error_reporting(E_ALL);

    // Funktionen definieren
    // -----------------------------------------------
    function checkUpload($myFILE, $file_extensions, $mime_types, $maxsize)
    {
        $errors = array();
        // Uploadfehler prüfen
        switch ($myFILE['error']){
            case 1: $errors[] = "Bitte wählen Sie eine Datei aus, die <b>kleiner als ".ini_get('upload_max_filesize')."</b> ist.";
                    break;
            case 2: $errors[] = "Bitte wählen Sie eine Datei aus, die <b>kleiner als ".$maxsize/(4096*4096)." MB</b> ist.";
                    break;
            case 3: $errors[] = "Die Datei wurde nur teilweise hochgeladen.";
                    break;
            case 4: $errors[] = "Es wurde keine Datei ausgewählt.";
                    return $errors;
                    break;
            default : break;
        }
        // MIME-Type prüfen
        if(count($mime_types)!=0 AND !in_array(strtolower($myFILE['type']), $mime_types)){
            $fehler = "Falscher MIME-Type (".$myFILE['type'].").<br />".
                      "Erlaubte Typen sind:<br />\n";
            foreach($mime_types as $type)
                $fehler .= " - ".$type."\n<br />";
            $errors[] = $fehler;
        }
        // Dateiendung prüfen
        if($myFILE['name']=='' OR (count($file_extensions)!=0 AND !in_array(strtolower(getExtension($myFILE['name'])), $file_extensions))){
            $fehler = "Falsche Dateiendung (".getExtension($myFILE['name']).").<br />".
                      "Erlaubte Endungen sind:<br />\n";
            foreach($file_extensions as $extension)
                $fehler .= " - ".$extension."\n<br />";
            $errors[] = $fehler;
        }
        // Dateigröße prüfen
        if($myFILE['size'] > $maxsize){
            $errors[] = "Datei zu groß (".sprintf('%.2f',$myFILE['size']/(4096*4096))." MB).<br />".
                        "Erlaubte Größe: ".$maxsize/(4096*4096)." MB\n";
        }
        return $errors;
    }

    // gibt die Dateiendung einer Datei zurück
    function getExtension ($filename)
    {
        if(strrpos($filename, '.'))
             return substr($filename, strrpos($filename, '.')+1);
        return false;
    }

    // erzeugt einen Zufallswert
    function getRandomValue()
    {
        return substr(md5(rand(1, 9999)),0,8).substr(time(),-6);
    }

    // erzeugt einen neuen Dateinamen aus Zufallswert und
    // Dateiendung
    function renameFile ($filename)
    {
        return  getRandomValue().".".getExtension($filename);
    }

    // Werte zur Dateiprüfung initialisieren
    // -----------------------------------------------
    $maxsize = 2*4096*4096;
    $file_extensions = array('jpg', 'jpeg', 'jpe', 'gif', 'png');
    $mime_types = array('image/pjpeg', 'image/jpeg', 'image/gif', 'image/png', 'image/x-png');

    // Upload-Ordner definieren
    // -----------------------------------------------
    $ordner = "benutzer_dateien/";
	
	// Anzahl der Datefelder
	 $anzahl_dateifelder = 50;

    // Beginn des Skriptes
    // -----------------------------------------------
    echo "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \n".
         "\"http://www.w3.org/TR/html4/strict.dtd\">\n";
    echo "<html>\n";
    echo "<head>\n";
    echo " <title>multipler Datei-Upload</title>\n";
    echo "</head>\n";
    echo "<body>\n";

    // Falls der Benutzer auf "Upload" gedrückt hat,
    // werden die Dateien überprüft
    if(isset($_POST['submit']) AND $_POST['submit']=='Upload'){

        // jede Datei einzeln testen
        for($i=0; $i<$anzahl_dateifelder; $i++){
            $myFILE['name'] = $_FILES['Datei']['name'][$i];
            $myFILE['type'] = $_FILES['Datei']['type'][$i];
            $myFILE['tmp_name'] = $_FILES['Datei']['tmp_name'][$i];
            $myFILE['error'] = $_FILES['Datei']['error'][$i];
            $myFILE['size'] = $_FILES['Datei']['size'][$i];

            // Fehlerarray erzeugen
            $errors = array();

            $errors = checkUpload($myFILE, $file_extensions, $mime_types, $maxsize);
            if(count($errors)){
                echo "<p>\n".
                     "Die ".($i+1).". Datei (".$myFILE['name'].") konnte nicht gespeichert werden.<br />\n";
                foreach($errors as $error)
                    echo $error."<br />\n";
                echo "</p>\n";
            }
            else {
                do {
                    $neuer_name = renameFile($myFILE['name']);
                } while(file_exists($ordner.$neuer_name));
                if(@move_uploaded_file($myFILE['tmp_name'], $ordner.$neuer_name)){
                     echo "<p>\n".
                          "Die ".($i+1).". Datei (".$myFILE['name'].") wurde erfolgreich gespeichert.<br />\n".
                          "</p>\n";
                }
                else{
                     echo "<p>\n".
                          "Die Die ".($i+1).". Datei (".$myFILE['name'].") konnte nicht gespeichert werden.<br />\n".
                          "Es ist ein Upload-Fehler aufgetreten.<br />\n".
                          "Bitte versuchen Sie es später erneut.<br />\n".
                          "<br />\n".
                          "Sollte der Upload noch immer nicht funktionieren, informieren Sie uns bitte per Email.<br />\n".
                          "<a href=\"".$_SERVER['PHP_SELF']."\">Zurück zum Upload-Formular</a>\n".
                          "</p>\n";
                }
            }
        }
        echo "<p>\n".
             "<a href=\"".$_SERVER['PHP_SELF']."\">Zurück zum Upload-Formular</a>\n".
             "</p>\n";
    }
    // Beim ersten Aufruf des Skriptes wird das
    // Upload-Formular angezeigt
    else{
        echo "<h1>Laden Sie mehrere Bilder hoch!</h1>\n";
        echo "<h2>Erlaubte Dateiendungen sind:</h2>\n";
        foreach($file_extensions as $extension)
            echo " ".$extension.", \n";
        echo "<h2>Erlaubte Dateigröße:</h2>\n";
        echo " - maximal ".($maxsize/(4096*4096))." MB\n<br />";
        echo " <form ".
             "action=\"".$_SERVER['PHP_SELF']."\" ".
             "method=\"post\" ".
             "enctype=\"multipart/form-data\">\n";
        echo "  <input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\"".$maxsize."\" />\n";
        for($i=0; $i<$anzahl_dateifelder; $i++){
            echo "  <label for=\"Datei\">".($i+1).". Datei auswählen</label>\n";
            echo "  <input type=\"file\" name=\"Datei[".$i."]\" id=\"Datei[".$i."]\" />\n";
            echo "  <br />\n";
        }
        echo "  <input type=\"submit\" name=\"submit\" value=\"Upload\" />\n";
        echo " </form>\n";
    }

    echo "</body>\n";
    echo "</html>\n";
?>

nun muß ich noch den wasserzeichenteil einfügen, nur wie?
und eine weitere frage ich habe versucht die maxsizewerte ein wenig zu verändern, trotzdem läd er mir keine dateien hoch, welche größer als 2mb sind.

15.02.2010 14:00

30 Jörg Kruse

nun muß ich noch den wasserzeichenteil einfügen, nur wie?

Das Wasserzeichen fügst du bei Aufruf des jeweiligen Bildes ein.

und eine weitere frage ich habe versucht die maxsizewerte ein wenig zu verändern, trotzdem läd er mir keine dateien hoch, welche größer als 2mb sind.

Du meinst die Variable $maxsize in dem Script? das ist ja nur eine zusätzliche Beschränkung dieses Upload-Scriptes, dazu kommt ja noch die upload_max_filesize in der php.ini

15.02.2010 18:21