Avatar billede supersquirrel Nybegynder
03. august 2008 - 19:39 Der er 9 kommentarer

Hjælp til at gemme billede efter crop

Hejsa!
Jeg har downloadet dette script: http://da.vidnicholson.com/2006/10/php-image-uploader-and-manipulator.html

Og vil gerne have den færdig croppede fil gemt i en folder. Hvordan gøres dette?

Jeg vil tro at det er denne stump kode der skal bruges:
    // handle crop requests:
    if(isset($_POST['top']) && isset($_POST['left']) && isset($_POST['width']) && isset($_POST['height']))
    {
        do { $tempfile = rand(1,10000); } while(file_exists(TEMP_DIR.$tempfile));
        $fp = fopen(TEMP_DIR.$tempfile, 'wb');
        fwrite($fp, $_SESSION[$unique_session_key]['full']);
        fclose($fp);
        $sizedata = getimagesize(TEMP_DIR.$tempfile);
        $orig_w = $sizedata[0];
        $orig_h = $sizedata[1];
        $img = imagecreatefromjpeg(TEMP_DIR.$tempfile);
        $full_w = intval($_POST['width']);
        $full_h = intval($_POST['height']);
        $full = imagecreatetruecolor($full_w, $full_h);
        imagecopyresized($full, $img, 0, 0, 0, 0, $full_w, $full_h, $orig_w, $orig_h);
        $final = imagecreatetruecolor($cropped_width, $cropped_height);
        imagecopy($final, $full, 0, 0, -1*(intval($_POST['left'])-100), -1*(intval($_POST['top'])-100), $cropped_width, $cropped_height);
        storeImage($final);
        unlink(TEMP_DIR.$tempfile);
        header("Location: $redirect_after_crop");
    }

    if(!isset($_SESSION[$unique_session_key]['full']))
    {
        $_SESSION[$unique_session_key]['full'] = file_get_contents($default_image);
        $_SESSION[$unique_session_key]['lowres'] = file_get_contents($default_image);
    }

    function imgdata($imgid)
    {
        do{ $filename = TEMP_DIR.rand(1,10000); } while(file_exists($filename));
        imagejpeg($imgid, $filename);
        $data = file_get_contents($filename);
        unlink($filename);
        return $data;
    }
Avatar billede jakobdo Ekspert
03. august 2008 - 19:46 #1
Denne funktion giver dig data.
Prøv at tilføj: //foran unlink(...);

function imgdata($imgid)
    {
        do{ $filename = TEMP_DIR.rand(1,10000); } while(file_exists($filename));
        imagejpeg($imgid, $filename);
        $data = file_get_contents($filename);
        unlink($filename);
        return $data;
    }
Avatar billede supersquirrel Nybegynder
03. august 2008 - 19:47 #2
OK! Nu sletter den ikke det billeder der er blevet cropped, men den gemmer den kun som eks. 7856 (og jeg vil gerne have en .png endelse på)

Jeg har fjernet: unlink($filename); i fuction imgdata()

- Hvordan får jeg endelsen på?
Avatar billede jakobdo Ekspert
03. august 2008 - 19:54 #3
Denne funktion:

function storeImage($img_id)
{
  // $img_id is a GD image reference, if you want the actual
  // JPEG data pass it to imgdata (as below)
  $_SESSION['imgcropper']['cropped'] = imgdata($img_id);
}


Ret den f.eks. til:

function storeImage($img_id,$filename)
{
  // $img_id is a GD image reference, if you want the actual
  // JPEG data pass it to imgdata (as below)
  imagejpeg($img_id,$filename); //JPEG
}

Så kan du kalde den med:

storeImage($imgid,'noget.jpg');
Avatar billede jakobdo Ekspert
03. august 2008 - 19:55 #4
Og du kan jo udskifte imagejpeg med imagepng eller gif.
Avatar billede supersquirrel Nybegynder
03. august 2008 - 20:48 #5
Du gav mig en idé til at fixe det:

    function imgdata($imgid)
    {
        $newname = md5(uniqid(rand(), true));
        imagejpeg($imgid, TEMP_DIR.$newname.".jpg");
        $data = file_get_contents(TEMP_DIR.$newname.".jpg");
        return $data;
    }
Det virker finno. Nu er mit problem bare at jeg gerne vil have andre filtyper end bare jpg.

Jeg har jo dette fra et script du har lavet:
function getExtension($filename){
    return strtolower( pathinfo( $filename, PATHINFO_EXTENSION ) );
}
  $extension = getExtension($filename);
  switch($extension)
  {
    case 'jpeg':
    case 'jpe':
    case 'jpg':
      $srcim = imagecreatefromjpeg( $filename );
      break;
    case 'gif':
      $srcim = imagecreatefromgif( $filename );
      break;
    case 'png':
      $srcim = imagecreatefrompng( $filename );
      break;
    default:
      return false;
  }

Vil du hjælpe med at putte det ind i koden? Jeg har selv prøvet, men der kom jeg kun frem til en hvid side
Avatar billede jakobdo Ekspert
03. august 2008 - 21:08 #6
Problemet er i funktionen imgdata() har du ikke styr på hvad type filen er...
Så du skal have et ekstra argument til din funktion.
F.eks. $filename
Avatar billede supersquirrel Nybegynder
03. august 2008 - 21:20 #7
Altså nu forstår jeg ikke helt, kan du forklare det lidt nærmere, evt. vise eksempel?
Avatar billede supersquirrel Nybegynder
03. august 2008 - 21:22 #8
Jeg har fået lavet dette:

    $photoerr = false;
    if(isset($_FILES['photo']))
    {
        function getExtension($filename){
            return strtolower( pathinfo( $filename, PATHINFO_EXTENSION ) );
        }
          $extension = getExtension($_FILES['photo']['name']);
          switch($extension)
          {
            case 'jpeg':
            case 'jpe':
            case 'jpg':
              $img = imagecreatefromjpeg( $_FILES['photo']['tmp_name'] );
              break;
            case 'gif':
              $img = imagecreatefromgif( $_FILES['photo']['tmp_name'] );
              break;
            case 'png':
              $img = imagecreatefrompng( $_FILES['photo']['tmp_name'] );
              break;
            default:
              $photoerr = true;
          }       
        if($img=="")
        {
            // bad image uploaded
            $photoerr = true;           
        }
        else
        {
            $sizedata = getimagesize($_FILES['photo']['tmp_name']);
            // original dimensions:
            $orig_w = $sizedata[0];
            $orig_h = $sizedata[1];
            // low-res image dimensions:
            $full_w = min($default_max_width, $orig_w);
            $full_h = round(($full_w/$orig_w)*$orig_h);
            if($full_h > $default_max_height)
            {
                $full_h = $default_max_height;
                $full_w = round(($full_h/$orig_h)*$orig_w);
            }
            // create resized image:
            $full = imagecreatetruecolor($full_w, $full_h);
            imagecopyresized($full, $img, 0, 0, 0, 0, $full_w, $full_h, $orig_w, $orig_h);
            // store in Session:
            $_SESSION[$unique_session_key]['full'] = imgdata($img);
            $_SESSION[$unique_session_key]['lowres'] = imgdata($full);       
        }
    }

    // handle crop requests:
    if(isset($_POST['top']) && isset($_POST['left']) && isset($_POST['width']) && isset($_POST['height']))
    {
        do { $tempfile = rand(1,10000); } while(file_exists(TEMP_DIR.$tempfile));
        $fp = fopen(TEMP_DIR.$tempfile, 'wb');
        fwrite($fp, $_SESSION[$unique_session_key]['full']);
        fclose($fp);
        $sizedata = getimagesize(TEMP_DIR.$tempfile);
        $orig_w = $sizedata[0];
        $orig_h = $sizedata[1];
        function getExtension($filename){
            return strtolower( pathinfo( $filename, PATHINFO_EXTENSION ) );
        }
          $extension = getExtension($_FILES['photo']['name']);
          switch($extension)
          {
            case 'jpeg':
            case 'jpe':
            case 'jpg':
              $img = imagecreatefromjpeg( TEMP_DIR.$tempfile );
              break;
            case 'gif':
              $img = imagecreatefromgif( TEMP_DIR.$tempfile );
              break;
            case 'png':
              $img = imagecreatefrompng( TEMP_DIR.$tempfile );
              break;
          }           
        $full_w = intval($_POST['width']);
        $full_h = intval($_POST['height']);
        $full = imagecreatetruecolor($full_w, $full_h);
        imagecopyresized($full, $img, 0, 0, 0, 0, $full_w, $full_h, $orig_w, $orig_h);
        $final = imagecreatetruecolor($cropped_width, $cropped_height);
        imagecopy($final, $full, 0, 0, -1*(intval($_POST['left'])-100), -1*(intval($_POST['top'])-100), $cropped_width, $cropped_height);
        storeImage($final);
        unlink(TEMP_DIR.$tempfile);
        header("Location: $redirect_after_crop");
    }

    if(!isset($_SESSION[$unique_session_key]['full']))
    {
        $_SESSION[$unique_session_key]['full'] = file_get_contents($default_image);
        $_SESSION[$unique_session_key]['lowres'] = file_get_contents($default_image);
    }
    function imgdata($imgid)
    {
        $newname = md5(uniqid(rand(), true));
        imagejpeg($imgid, TEMP_DIR.$newname.".jpg");
        $data = file_get_contents(TEMP_DIR.$newname.".jpg");
        return $data;
    }

Men er i tvivl med imgdata()
Avatar billede jakobdo Ekspert
04. august 2008 - 06:45 #9
Den laver jo altid:

imagejpeg($imgid, TEMP_DIR.$newname.".jpg");
Altså et jpeg billede.
Du burde evt. tilføje support for png og gif også.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester