Grafiken laden, bearbeiten und in ein Magazin laden

PHP:
$var = 'Bmw500PS';
$pattern = '/([a-z])|([A-Z])|(![0-9])|([0-9])/';
if(preg_match_all($pattern, $var, $matches) !== false) {
  $count  = count($matches[0]);
  foreach($matches[0] as $i => $letter) {
    # Kleinbuchstabe
    if(!empty($matches[1][$i])) {
      $result[] = array($letter, 0);
    # Großbuchstabe
    } elseif(!empty($matches[2][$i])) {
      $result[] = array($letter, 1);
    # Ziffer mit Ausrufezeichen davor
    } elseif(!empty($matches[3][$i])) {
      $result[] = array(substr($letter, 1), 2);
    # einfache Ziffer
    } else {
      $result[] = array($letter, 3);
    }
  }
} else {
  $result = array();
}
 
Super jetzt geht es!

PHP:
Array
(
    [0] => Array
        (
            [0] => B
            [1] => 1
        )

    [1] => Array
        (
            [0] => m
            [1] => 0
        )

    [2] => Array
        (
            [0] => w
            [1] => 0
        )

    [3] => Array
        (
            [0] => 5
            [1] => 2
        )

    [4] => Array
        (
            [0] => 0
            [1] => 3
        )

    [5] => Array
        (
            [0] => 0
            [1] => 3
        )

    [6] => Array
        (
            [0] => P
            [1] => 1
        )

    [7] => Array
        (
            [0] => S
            [1] => 1
        )

)

Danke! :)

Jetzt muss ich nur noch herausfinden wie ich die Verzeichnisse damit lenke. :D
 
Hallo, ich hätte da noch eine Frage zu deinem Code. :)

PHP:
$var = 'Bmw500PS';
$pattern = '/([a-z])|([A-Z])|(![0-9])|([0-9])/';
if(preg_match_all($pattern, $var, $matches) !== false) {
  $count  = count($matches[0]);
  foreach($matches[0] as $i => $letter) {
    # Kleinbuchstabe
    if(!empty($matches[1][$i])) {
      $result[] = array($letter, 0);
    # Großbuchstabe
    } elseif(!empty($matches[2][$i])) {
      $result[] = array($letter, 1);
    # Ziffer mit Ausrufezeichen davor
    } elseif(!empty($matches[3][$i])) {
      $result[] = array(substr($letter, 1), 2);
    # einfache Ziffer
    } else {
      $result[] = array($letter, 3);
    }
  }
} else {
  $result = array();
}

Ich habe es nun so gemacht das in deinem Code eine neue Variable erstellt wird mit einem Teil-Pfad.

Beispiel:
PHP:
# Kleinbuchstabe
if(!empty($matches[1][$i])) {
   $result[] = array($letter, $Teil_Pfad = 'arial_font_bold';);
} 

# Großbuchstabe
elseif(!empty($matches[2][$i])) {
   $result[] = array($letter, $Teil_Pfad = 'arial_font_normal';);
}

Wie kann ich denn jetzt "$Teil_Pfad" richtig verwenden? Mit $result geht es nicht.
 
Was willst du denn damit erreichen? Sollen die Zeichenkette konkatiniert werden oder soll $Teil_Pfad der Schlüssel von den Werten sein?
 
Ich raff das ganze einfach überhaupt nicht. Ich versuche es mal zu erklären in einfachen Worten.

1. User gibt etwas in ein Formular ein und schickt es ab
2. Das Skript muss nun die Eingabe des User Zeichen für Zeichen einer Schriftart zuordnen
3. Die Grafiken werden in einer Schleife erstellt und dann in eine größere Grafik gespeichert
4. Fertig

In meinem "Anfänger-Skript" habe ich so etwas wie eine "Verzeichniss-Ebene" erstellt.

PHP:
Die Variable "$pfad_font" wird bisher durch eine ganz einfach IF-Abfrage ausgesucht.

Sind mehr als 5 Zeichen in der Variable dann "Arial_Font_Normal" sonst "Arial_Font_Bold".

$Pfad_1 = './';
$Pfad_2 = 'images/';
$Pfad_3 = 'sig';
$Pfad_4 = $pfad_font;
$format = '.png';

Ich möchte nun das Skript erweitern so das jedes Zeichen in der Variable seinen eigenen Pfad bekommt.

Später im Skript wenn die Grafiken geladen werden (imagecreate...) sollen die Grafiken individuell (nicht starr wie jetzt) geladen werden können.

Bei Bedarf stell ich mal einen 1:1 Code zur Verfügung.
 
Klassen? Ist das wieder etwas neues?

Hier mal das Skript aber sehr stark vereinfacht, da es sonst viel zu unübersichtlich ist.

PHP:
// ### Variable usw. ### //
   $U_Eingabe = "BMW500PX";
   $U_Eingabe = htmlspecialchars($U_Eingabe, ENT_QUOTES);
   $U_Eingabe = htmlspecialchars($U_Eingabe);

// ### Grundeinstellungen ### //
   $format = '.png';

// ### Prüfen ob leer ### //
   if (strlen($U_Eingabe) == '0') {
      unset($U_Eingabe);
      echo '<div style="text-align:center; font-weight:bold;">Error</div><br />';
   } 

// ### Zeichen zählen ### //
   $Zeahlen = strlen($U_Eingabe);

// ### Schrift auswählen (Starr) ### //
   if ($Zeahlen < 5) {
       $Schrift = 'Arial_Font_Normal';
   }
       else
   {
       $Schrift = 'Arial_Font_Bold';
   }


// ### Verzeichniss-Ebene ### //
   $Pfad_1 = './';
   $Pfad_2 = 'images/';
   $Pfad_3 = 'sig';
   $Pfad_4 = $Schrift;

// ### Verzeichniss Zusammenfassem ### //
   $Pfad_complete = $Pfad_1.$Pfad_2.$Pfad_3.$Schrift;

// ### Grafiken erstellen ### //
   for($j=0, $x = strlen($U_Eingabe); $j < $x; ++$j){ 
      if(file_exists($Pfad_complete.$U_Eingabe[$j].$format){
         $size = getimagesize($Pfad_complete.$U_Eingabe[$j].$format);
         $im[] = array('img' => imagecreatefrompng($Pfad_complete.$U_Eingabe[$j].$format), 'sizex' => $size[0],); 
         $total_size_x +=$size[0]; 
      } 
   } 

// ### abschluss ### //
   $image = imagecreatetruecolor($total_size_x, $size[1]);
   $ac_x  = 0;
            foreach($im as $grafik){ 
                   ImageCopyResampled($imend, $grafik['img'], $ac_x, 0, 0, 0, imagesx($grafik['img']), imagesy($grafik['img']), imagesx($grafik['img']), imagesy($grafik['img']));
                   $ac_x+= $grafik['sizex']; 
            }

   imagepng($image);
 
Meine Lösung würde jetzt so aussehen:
PHP:
<?php
  class FontException extends Exception {}
  
  class Font {
    private static $fonts = array();
    private $name      = '';
    private $weight    = '';
    private $directory = '';
    private $letters   = array();
    public  $format    = 'png';
    
    public static function get($name, $weight = null, $directory = null) {
      if($weight === null) {
        $weight = 'normal';
      }
      
      if(self::$fonts === array()) {
        if($directory === null) {
          throw new FontException('directory required');
        }
        
        self::$fonts[] = new Font($name, $weight, $directory);
        return end(self::$fonts);
      } else {
        foreach(self::$fonts as $font) {
          if(($font->name === $name) && ($font->weight === $weight)) {
            return $font;
          }
        }
        
        if($directory === null) {
          throw new FontException('directory required');
        }
        
        self::$fonts[] = new Font($name, $weight, $directory);
        return end(self::$fonts);
      }
    }
    
    private function __construct($name, $weight, $directory) {
      if(!is_string($name) || !is_string($name) || !is_string($directory) || empty($name) || empty($weight) || empty($directory)) {
        throw new FontException('invalid arguments');
      } elseif(!file_exists($directory) || !is_dir($directory)) {
        throw new FontException('directory >>' . $directory . '<< does not exist');
      }
      
      $this->name      = strtolower($name);
      $this->weight    = strtolower($weight);
      $this->directory = $directory;
    }
    
    public function letter($letter) {
      if(isset($this->letters[$letter])) {
        return $this->letters[$letter];
      } elseif(file_exists($this->__toString() . $letter . '.' . $this->format) || ($size = getimagesize($this->__toString() . $letter . '.' . $this->format))) {
        switch($this->format) {
          case 'png':
            $this->letters[$letter] = array(
              imagecreatefrompng($this->__toString() . $letter . '.' . $this->format),
              $size,
            );
            break;
          case 'jpeg':
          case 'jpg':
            $this->letters[$letter] = array(
              imagecreatefromjpeg($this->__toString() . $letter . '.' . $this->format),
              $size,
            );
            break;
          case 'gif':
            $this->letters[$letter] = array(
              imagecreatefromgif($this->__toString() . $letter . '.' . $this->format),
              $size,
            );
            break;
          default:
            throw new FontException('invalid image format');
        }
      } else {
        throw new FontException('could not find the file for the character "' . $letter . '"');
      }
    }
    
    public function __toString() {
      return $this->directory . '/' . ucfirst($this->name) . '_Font_' . ucfirst($this->weight);
    }
  }
  
  
  if(isset($_POST['images']['submit'])) {
    try {
      if(($length = strlen($input = trim($_POST['images']['text']))) === 0) {
        throw new Exception('invalid input');
      }
      
      if($length < 5) {
        $font = Font::get('arial', null,   './images/sig');
      } else {
        $font = Font::get('arial', 'bold', './images/sig');
      }
      
      # set format of the character files
      $font->format = 'png';
      
      $letters = str_split($input);
      $size    = array(0, 0);
      
      foreach($letters as $i => $letter) {
        $letters[$i] = $letter = $font->letter($letter);
        $size[0]    += $letter[0][0];
        $size[1]     = ($letter[0][1] > $size[1]) ? $letter[0][1] : $size[1];
      }
      
      $image      = imagecreatetruecolor($size[0], $size[1]);
      $position_x = 0;
      $imend; # hast du irgendwo definiert
      
      foreach($letters as $letter) {
        imagecopyresampled($imend, $letter[0], $position_x, 0, 0, 0, $letter[0][0], $letter[0][1], $letter[0][0], $letter[0][1]);
        $position_x += $letter[0][0];
      }
      
      header('Content-Type: image/png');
      imagepng($image);
    } catch(Exception $e) {
?>
<!DOCTYPE html>
<html>
<head>
  <title>Fehler aufgetreten</title>
</head>
<body>
  <div style="border:3px solid red"><?php echo $e->getMessage(); ?></div>
</body>
<?php
    }
  } else {
?>
<!DOCTYPE html>
<html>
<head>
  <title>Bild erstellen</title>
</head>
<body>
  <form id="images" method="post" action="">
    <label for="images-text"><input id="images-text" name="images[text]" type="text" /><br />
    <input id="images-submit" name="images[submit]" type="submit" value="erstellen" />
  </form>
</body>
<?php
  }
?>
 
Zurück