• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Image Crop - Bild verschieben

EvilBen

New member
Hallo liebes Forum,

ich habe mir aus dem Internet folgendes Script heruntergeladen und in mein Projekt implementiert:

Cropper

Funktioniert zu 99% wie es soll, nur an einer Kleinigkeit hänge ich fest, die das ganze aber erst sinnvoll machen würde.

Also der Plan ist folgender: User wählt sein Profilbild aus, schneidet es auf das Format, welches ich vorgebe zurecht, sieht ein Ergebnis (bis hier hin einwandfreier Ablauf) und entscheidet sich das Bild als Profilbild zu nehmen und hochzuladen. Er klickt dazu also auf einen Link/Button oder wie auch immer, welcher ein PHP Script ausführt um das Bild in den Ordner zu verschieben und einen entsprechenden Datenbank Eintrag zu erstellen.
Ich weiß nun aber nicht wo ich ansetzen soll: Bisher lädt die Klasse, die beim Script dabei war, das Bild hoch in einen "cache" Ordner - den habe ich so genannt. Als nächstes stelle ich mir eben vor das der User auf "Weiter oder Button" klickt und dann das Bild in den richtigen Ordner verschiebt, den Datenbank Eintrag erstellt, und das Bild aus dem Cache löscht.
Mir geht es nicht um das Script, was das Bild verschiebt, sondern vielmehr an welcher Stelle ich ein solches einsetzen müsste, bzw. mir würde es schon reichen, wenn ich den Dateinamen von der Cache Datei hätte, um im Weiteren die Datei verschieben zu können.

Ich hoffe ihr wisst weiter !

Lieben Dank
 
Als nächstes stelle ich mir eben vor das der User auf "Weiter oder Button" klickt und dann das Bild in den richtigen Ordner verschiebt, den Datenbank Eintrag erstellt, und das Bild aus dem Cache löscht.
1) "Weiter oder Button" würde ich das nicht nennen
2) wenn du mehrere user hast, hast du doch sicherlich eine session?
dann könntest du in den session-daten den dateinamen speichern und nach "Weiter oder Button" diesen dort auslesen.
 
EDIT:
Aber wo genau sollte ich die Session setzen
Code:
<?php
date_default_timezone_set("Europe/Berlin");
class CropAvatar {
  private $src;
  private $data;
  private $dst;
  private $type;
  private $extension;
  private $msg;

  function __construct($src, $data, $file) {
    $this -> setSrc($src);
    $this -> setData($data);
    $this -> setFile($file);
    $this -> crop($this -> src, $this -> dst, $this -> data);
  }

  private function setSrc($src) {
    if (!empty($src)) {
      $type = exif_imagetype($src);

      if ($type) {
        $this -> src = $src;
        $this -> type = $type;
        $this -> extension = image_type_to_extension($type);
        $this -> setDst();
      }
    }
  }

  private function setData($data) {
    if (!empty($data)) {
      $this -> data = json_decode(stripslashes($data));
    }
  }

  private function setFile($file) {
    $errorCode = $file['error'];

    if ($errorCode === UPLOAD_ERR_OK) {
      $type = exif_imagetype($file['tmp_name']);

      if ($type) {
        $extension = image_type_to_extension($type);
        $src = 'usr_img/_cache/' . date('YmdHis') . '.original' . $extension;

        if ($type == IMAGETYPE_GIF || $type == IMAGETYPE_JPEG || $type == IMAGETYPE_PNG) {

          if (file_exists($src)) {
            unlink($src);
          }

          $result = move_uploaded_file($file['tmp_name'], $src);
			
          if ($result) {
            $this -> src = $src;
            $this -> type = $type;
            $this -> extension = $extension;
            $this -> setDst();
          } else {
             $this -> msg = 'Fehler beim speichern';
          }
        } else {
          $this -> msg = 'Bitte wähle Bilder von folgenden Typen: JPG, PNG, GIF';
        }
      } else {
        $this -> msg = 'Bitte ein Bild hochladen';
      }
    } else {
      $this -> msg = $this -> codeToMessage($errorCode);
    }
  }

  private function setDst() {
    $this -> dst = 'usr_img/_cache/' . date('YmdHis') . '.png';
  }

  private function crop($src, $dst, $data) {
    if (!empty($src) && !empty($dst) && !empty($data)) {
      switch ($this -> type) {
        case IMAGETYPE_GIF:
          $src_img = imagecreatefromgif($src);
          break;

        case IMAGETYPE_JPEG:
          $src_img = imagecreatefromjpeg($src);
          break;

        case IMAGETYPE_PNG:
          $src_img = imagecreatefrompng($src);
          break;
      }

      if (!$src_img) {
        $this -> msg = "Fehler beim Lesen der Bildinformationen";
        return;
      }

      $size = getimagesize($src);
      $size_w = $size[0]; // natural width
      $size_h = $size[1]; // natural height

      $src_img_w = $size_w;
      $src_img_h = $size_h;

      $degrees = $data -> rotate;

      // Rotate the source image
      if (is_numeric($degrees) && $degrees != 0) {
        // PHP's degrees is opposite to CSS's degrees
        $new_img = imagerotate( $src_img, -$degrees, imagecolorallocatealpha($src_img, 0, 0, 0, 127) );

        imagedestroy($src_img);
        $src_img = $new_img;

        $deg = abs($degrees) % 180;
        $arc = ($deg > 90 ? (180 - $deg) : $deg) * M_PI / 180;

        $src_img_w = $size_w * cos($arc) + $size_h * sin($arc);
        $src_img_h = $size_w * sin($arc) + $size_h * cos($arc);

        // Fix rotated image miss 1px issue when degrees < 0
        $src_img_w -= 1;
        $src_img_h -= 1;
      }

      $tmp_img_w = $data -> width;
      $tmp_img_h = $data -> height;
      $dst_img_w = 220;
      $dst_img_h = 220;

      $src_x = $data -> x;
      $src_y = $data -> y;

      if ($src_x <= -$tmp_img_w || $src_x > $src_img_w) {
        $src_x = $src_w = $dst_x = $dst_w = 0;
      } else if ($src_x <= 0) {
        $dst_x = -$src_x;
        $src_x = 0;
        $src_w = $dst_w = min($src_img_w, $tmp_img_w + $src_x);
      } else if ($src_x <= $src_img_w) {
        $dst_x = 0;
        $src_w = $dst_w = min($tmp_img_w, $src_img_w - $src_x);
      }

      if ($src_w <= 0 || $src_y <= -$tmp_img_h || $src_y > $src_img_h) {
        $src_y = $src_h = $dst_y = $dst_h = 0;
      } else if ($src_y <= 0) {
        $dst_y = -$src_y;
        $src_y = 0;
        $src_h = $dst_h = min($src_img_h, $tmp_img_h + $src_y);
      } else if ($src_y <= $src_img_h) {
        $dst_y = 0;
        $src_h = $dst_h = min($tmp_img_h, $src_img_h - $src_y);
      }

      // Scale to destination position and size
      $ratio = $tmp_img_w / $dst_img_w;
      $dst_x /= $ratio;
      $dst_y /= $ratio;
      $dst_w /= $ratio;
      $dst_h /= $ratio;

      $dst_img = imagecreatetruecolor($dst_img_w, $dst_img_h);

      // Add transparent background to destination image
      imagefill($dst_img, 0, 0, imagecolorallocatealpha($dst_img, 0, 0, 0, 127));
      imagesavealpha($dst_img, true);

      $result = imagecopyresampled($dst_img, $src_img, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h);

      if ($result) {
        if (!imagepng($dst_img, $dst)) {
          $this -> msg = "Fehler beim Speichern des geschnittenen Bildes";
        }
      } else {
        $this -> msg = "Fehler beim Schneiden des Bildes";
	  }

      imagedestroy($src_img);
      imagedestroy($dst_img);
    }
  }

  private function codeToMessage($code) {
    $errors = array(
      UPLOAD_ERR_INI_SIZE =>'Da hochzuladene Datei überschreitet die zulässige Dateigröße',
      UPLOAD_ERR_FORM_SIZE =>'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form',
      UPLOAD_ERR_PARTIAL =>'The uploaded file was only partially uploaded',
      UPLOAD_ERR_NO_FILE =>'No file was uploaded',
      UPLOAD_ERR_NO_TMP_DIR =>'Missing a temporary folder',
      UPLOAD_ERR_CANT_WRITE =>'Failed to write file to disk',
      UPLOAD_ERR_EXTENSION =>'File upload stopped by extension',
    );

    if (array_key_exists($code, $errors)) {
      return $errors[$code];
    }

    return 'Unbekannter Fehler';
  }

  public function getResult() {
    return !empty($this -> data) ? $this -> dst : $this -> src;
  }

  public function getMsg() {
    return $this -> msg;
  }
}

$crop = new CropAvatar(
  isset($_POST['avatar_src']) ? $_POST['avatar_src'] : null,
  isset($_POST['avatar_data']) ? $_POST['avatar_data'] : null,
  isset($_FILES['avatar_file']) ? $_FILES['avatar_file'] : null
);

$response = array(
  'state'  => 200,
  'message' => $crop -> getMsg(),
  'result' => $crop -> getResult()
);

echo json_encode($response);
 
Zuletzt bearbeitet:
Die setDst() müsste etwas überarbeitet werden (es kann zu leicht zu einem Konflikt kommen). Dann könnte man für jeden Nutzer ein eigenes temporäres Bild haben, dessen Pfad dann in der Session gespeichert wird.

... oder was fragst du dich genau?
 
Zurück
Oben