Avatar billede find_p Nybegynder
05. august 2008 - 21:49 Der er 43 kommentarer og
1 løsning

Hjælp til at gemme billede efter crop "2"

I forlængelse af supersquirrel´s tråd:

http://www.eksperten.dk/spm/840313

vil jeg høre om det kan lade sig gøre, at gemme filen / filerne

indeholdende det oprindelige filnavn eks. testbillede.jpg,

så resultatet bliver noget der ligner:

testbillede.jpg    (oprindelig størelse)
440_testbillde.jpg (440*280)
640_testbillde.jpg (640*480)
Avatar billede jakobdo Ekspert
06. august 2008 - 17:36 #1
Kig mine artikler her: http://www.eksperten.dk/artikler/?users=jakobdo
Der er blandt andet en funktion til resize.
Avatar billede find_p Nybegynder
06. august 2008 - 22:06 #2
Ja med stor interesse, men det hjælper mig desværre ikke, med mit nuværende niveau.

Nedenstående virker fint, men i stedet for md5 krypterede filnavne, vil jeg gerne
have at filerne får f.eks følgende navne: (let genkendelige for mig selv, for senere brug)

Filnavn: testbillede.jpg

    testbillede.jpg (oprindelig størelse)
440_testbillede.jpg (440*280 - crop)
640_testbillede.jpg (640*480 - resize)


function imgdata($imgid)
    {
        $newname = md5(uniqid(rand(), true));
        imagejpeg($imgid, TEMP_DIR.$newname.".jpg");
        $data = file_get_contents(TEMP_DIR.$newname.".jpg");
        return $data;
    }

Ændrer jeg ovenstående til:

function imgdata($imgid)
    {
        $newname = ($_FILES ['photo']['name']);
        imagejpeg($imgid, TEMP_DIR.$newname);
        $data = file_get_contents(TEMP_DIR.$newname);
        return $data;
    }

får jeg uploaded resizede billede som testbillede.jpg men intet andet.
Avatar billede jakobdo Ekspert
07. august 2008 - 10:39 #3
Har du styr på selve upload delen, eller er det også det du roder med ?
Avatar billede find_p Nybegynder
07. august 2008 - 10:55 #4
Nej - det mener jeg ikke

Hvis jeg bruger nedenstående, får jeg uploaded 3 stk .jpg filer (fullsize,resize og crop)til mit DIR (temp) på serveren.

Problemet for mig er at jeg gerne vil give de uploadede filer følgende navne i stedet for md5 krypterede navne:

(Fil jeg ønsker at resize / crop = testbillede.jpg)

    testbillede.jpg (fullsize)
440_testbillede.jpg (440*280 - crop)
640_testbillede.jpg (640*480 - resize)


function imgdata($imgid)
    {
        $newname = md5(uniqid(rand(), true));
        imagejpeg($imgid, TEMP_DIR.$newname.".jpg");
        $data = file_get_contents(TEMP_DIR.$newname.".jpg");
        return $data;
    }
Avatar billede jakobdo Ekspert
07. august 2008 - 11:02 #5
Her bliver navnet lavet: $newname = md5(uniqid(rand(), true));
Så skal du bare rette det...
Ellers er jeg slet ikke med.
Avatar billede find_p Nybegynder
07. august 2008 - 11:18 #6
Så langt er jeg med - tror jeg :o)

Jeg har prøvet at ændre:

$newname = md5(uniqid(rand(), true));

Til:

$newname = ($_FILES ['photo']['name']);

Resultatet er at jeg kun får uploaded det resized billede, men med det oprindelige filnavn (testbillede.jpg)
Problemet her er vel at man ikke kan uploade 3 stk filer med samme navn / samtidigt.
Derfor ønsker jeg at resized billede altid starter med 640_filnavn.jpg og ligeledes for croped (440_filnavn.jpg)
Avatar billede jakobdo Ekspert
07. august 2008 - 11:22 #7
Men vi snakker i bund og grund en upload funktion, som cropper 2 billeder ikke ?
Avatar billede find_p Nybegynder
07. august 2008 - 11:42 #8
Såvidt jeg forstår starter scriptet med at uploade billede i oprindelig størelse, samt
resized i størelsen 640*480, herefter kan man så vælge også at "croppe" det resizedede billede.

Scripet er hentet her:

http://da.vidnicholson.com/2006/10/php-image-uploader-and-manipulator.html
Avatar billede jakobdo Ekspert
07. august 2008 - 11:48 #9
I know...
Jeg var også med inde over superegerns problem.
Jeg synes dog den kode laver tingene på en dårlig måde, hvorfor jeg hellere ville arbejde med min upload form, samt billede klassen, da jeg kender dem.
Avatar billede find_p Nybegynder
07. august 2008 - 11:52 #10
Det vil jeg også meget gerne, men tror ikke at mine evner rækker - desværre
Avatar billede jakobdo Ekspert
07. august 2008 - 11:54 #11
Start med at få min upload kode til at virke.
Så tager vi den videre derfra.
Avatar billede find_p Nybegynder
07. august 2008 - 11:58 #12
Tak skal du have, men det bliver sikkert først i weekenden, da jobbet tager mere af min fritid end normalt i denne uge
Avatar billede jakobdo Ekspert
07. august 2008 - 12:08 #13
Du skriver bare når du har første kode på plads.
Avatar billede find_p Nybegynder
07. august 2008 - 22:15 #14
Hey igen

Jeg fik / tog mig alligevel tid - kunne ikke lade være ;o)

Upload billede og gem samtidigt et thump, virker perfekt.

Mit ønske, hvis jeg kunne vælge på alle hylder:

1) Tage et billede på harddisken i "kamera størelse" og crop / resize det til
  en størelse på 640*480 px og gemme på harddisken igen.
  Med andre ord "slippe" for denne operation i et billede behandlingsprogram.

2) Upload billede og gem samtidigt et thump
Avatar billede jakobdo Ekspert
08. august 2008 - 09:27 #15
1: Du kan jo rette mit upload script og rette resize til: 640*480
Avatar billede find_p Nybegynder
08. august 2008 - 09:45 #16
Ja, men udgangspunktet kan ikke være et billede i "kamera størrelse" 4000*3000 px,
det overstiger langt alokeret PHP memory på serveren (16 MB - tror jeg).

Så spørgsmålet er, kan man v.h.a. et PHP script kan crop / resize et
"kamera størrelse" billede og gemme på harddisken igen, og herefter uploade / resize til / på serveren?
Avatar billede jakobdo Ekspert
08. august 2008 - 09:58 #17
Nej, for PHP kan ikke arbejde med de størrelser.
Så der skal du f.eks. have fat i et program som ACDSEE, den kan resize mange billeder i et hug.
Avatar billede jakobdo Ekspert
08. august 2008 - 09:58 #18
Og dermed spare du også trafik på upload.
Avatar billede find_p Nybegynder
08. august 2008 - 10:13 #19
Ok - tak for forklaringen

Tilbage til udgangspunktet - hvordan implementerer crop mm. i "Upload billede og gem samtidigt et thump" scriptet?
Avatar billede jakobdo Ekspert
08. august 2008 - 10:28 #20
I disse linjer:

if(resize($uploadDir . basename($_FILES['myFile']['name']), $thumbDir . $thumbPrefix . basename($_FILES['myFile']['name']), $thumbWidth, $thumbHeight, $thumbQuality)){
              echo '<h3 style="color:green;">File ('.basename($_FILES['myFile']['name']).') uploaded and resized succesfully</h3>';
          }else{
            echo '<h3 style="color:red;">File ('.basename($_FILES['myFile']['name']).') uploaded succesfully, but resize failed</h3>';
        }

Retter du til:

$image = new image($uploadDir . basename($_FILES['myFile']['name']));
$new_width  = 100;
$new_height = 100;
$x = ($image->getWidth()/2) - ($new_width/2);
$y = ($image->getHeight()/2) - ($new_height/2);
$image->crop($x,$y,$new_width,$new_height);
$image->save('noget_cropped.jpg');
Avatar billede find_p Nybegynder
08. august 2008 - 10:40 #21
Tak - kan først prøve det i aften, for jeg er på job
Avatar billede find_p Nybegynder
08. august 2008 - 21:34 #22
Så er det gjort, jeg får følgende resp. :

Fatal error: Cannot instantiate non-existent class: image in /customers/*****.dk/*****.dk/httpd.www/upload.php on line 91
Avatar billede jakobdo Ekspert
08. august 2008 - 21:41 #23
Har du husket at smide hele klassen: class image..... ind i koden ?
Avatar billede find_p Nybegynder
08. august 2008 - 22:10 #24
Næh - Mener du hele dit script "Billede klasse"?

Hvis ja - hvor skal koden indsættes?
Avatar billede jakobdo Ekspert
08. august 2008 - 22:31 #25
Smid evt. koden i en fil: class.image.php
Og lav følgende i toppen af din anden kode:
require_once('class.image.php');
Avatar billede find_p Nybegynder
08. august 2008 - 22:50 #26
Så får jeg:

Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /customers/*****.dk/*****.dk/httpd.www/class.image.php on line 17
Avatar billede jakobdo Ekspert
09. august 2008 - 10:14 #27
Prøv at vis hele din kode nu ?
Avatar billede find_p Nybegynder
09. august 2008 - 10:40 #28
upload.php:

<?php
ini_set("display_errors", "on");
error_reporting(E_ALL);
require_once('class.image.php');
//SETTINGS
$uploadDir        = 'Billeder/'; //Bibliotek, hvor filer uploades til - husk chmod 777
$allowedFileTypes = array('jpg','gif','png'); //Hvilke filer vil vi acceptere bliver uploadet?
//THUMBS SETTINGS
$thumbDir        = 'Billeder/'; //Bibliotek, hvor thumbs gemmes - husk chmod 777
$thumbPrefix      = 'thumb_';  //Hvad skal tilføjes til originalt filnavn?
$thumbHeight      = 800;      //Thumb højde
$thumbWidth      = 800;      //Thumb bredde
$thumbQuality    = 85;        //Kvalitet af thumb, kan være fra 0 - dårligt til 100 - bedst
//Funktioner som bruges:
function getExtension($filename){   
        return strtolower( pathinfo( $filename, PATHINFO_EXTENSION ) );
}
function resize( $filename, $newfilename, $maxw, $maxh, $quality=85 )

  $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; 
    }
    $ow = imagesx( $srcim ); 
    $oh = imagesy( $srcim ); 
    $wscale = $maxw / $ow; 
    $hscale = $maxh / $oh; 
    $scale = min( $hscale, $wscale ); 
    $nw = round( $ow * $scale, 0 ); 
    $nh = round( $oh * $scale, 0 ); 
    $dstim = imagecreatetruecolor( $nw, $nh ); 
    imagecopyresampled( $dstim, $srcim, 0, 0, 0, 0, $nw, $nh, $ow, $oh ); 
    switch($extension) 
    {
      case 'jpeg':   
      case 'jpe':   
      case 'jpg':
        imagejpeg( $dstim, $newfilename, $quality );     
        break;
    case 'gif':
      imagegif( $dstim, $newfilename );     
      break;
    case 'png':     
      $png_q = floor( abs( $quality / 10 - 9.9 ) );     
      imagepng( $dstim, $newfilename, $png_q );     
      break;
    default:     
      return false; 
    }   
    imagedestroy( $dstim ); 
    imagedestroy( $srcim ); 
    return file_exists($newfilename);
}
//Er der trykket på Upload file knappen?
if(isset($_POST['myUpload']))
{       
  //Har vi en fil? 
  if(is_uploaded_file($_FILES['myFile']['tmp_name'])) 
  {
    //Filendelse   
    $extension = getExtension($_FILES['myFile']['name']);
           
    //Er filen en af de filer vi gerne vil have?   
    if(in_array($extension,$allowedFileTypes))   
    {
      //Vi flytter filen fra tmp til vores UPLOADDIR     
      if(move_uploaded_file($_FILES['myFile']['tmp_name'],$uploadDir . basename($_FILES['myFile']['name'])))     
      {
        $image = new image($uploadDir . basename($_FILES['myFile']['name']));
          $new_width  = 100;
          $new_height = 100;
          $x = ($image->getWidth()/2) - ($new_width/2);
          $y = ($image->getHeight()/2) - ($new_height/2);
          $image->crop($x,$y,$new_width,$new_height);
          $image->save('noget_cropped.jpg');
        }else{
                echo '<h3 style="color:red;">Error - unable to upload file: '.basename($_FILES['myFile']['name']).'</h3>';
        }   
        }else{     
                echo '<h3 style="color:red;">Wrong filetype, allowed filetypes are: ('.implode(',',$allowedFileTypes).')</h3>';   
        }
        }else{
                echo '<h3 style="color:red;">No file selected<h3>'; 
        }
      }
      //Vores form
      echo '<form action="upload.php" method="post" enctype="multipart/form-data">';
      echo 'File ('.implode(',',$allowedFileTypes).'): <input type="file" name="myFile"><br />';
      echo '<input type="submit" name="myUpload" value="Upload file">';
      echo '</form>';
     
?>

class.image.php:

Copy and paste fra artikler
Avatar billede jakobdo Ekspert
09. august 2008 - 19:00 #29
Du må gøre noget galt.
Jeg har netop copy/paste og der meldes ingen fejl.

Koden er her:
<?php

/**************************************\
* USAGE                                *
* $image = new image('picture.ext');  *
\**************************************/

class image{
    private $image;
    private $quality = 100;
   
    public function __construct($filename)    {
        $this->imagecreatefrom($filename);
    }
   
    private function getExtension($filename)    {
        return strtolower(pathinfo($filename,PATHINFO_EXTENSION));
    }
   
    private function imagecreatefrom($filename) {
        switch($this->getExtension($filename)){
            case 'jpg':
            case 'jpe':
            case 'jpeg':
                $this->resource = imagecreatefromjpeg($filename);
                break;
            case 'gif':
                $this->resource = imagecreatefromgif($filename);
                break;
            case 'png':
                $this->resource = imagecreatefrompng($filename);
                break;
            case 'bmp':
                $this->resource = $this->imagecreatefrombmp($filename);
                break;
            default:
                throw new Exception('Format not supported');
        }
    }
    //
    //http://dk.php.net/gd - shd at earthling dot net - 28-Mar-2006 02:44
    //START
    //
    private function imagebmp($im, $fn = false){
        if (!$im) return false;
             
        if ($fn === false) $fn = 'php://output';
        $f = fopen ($fn, "w");
        if (!$f) return false;
             
        //Image dimensions
        $biWidth = imagesx ($im);
        $biHeight = imagesy ($im);
        $biBPLine = $biWidth * 3;
        $biStride = ($biBPLine + 3) & ~3;
        $biSizeImage = $biStride * $biHeight;
        $bfOffBits = 54;
        $bfSize = $bfOffBits + $biSizeImage;
             
        //BITMAPFILEHEADER
        fwrite ($f, 'BM', 2);
        fwrite ($f, pack ('VvvV', $bfSize, 0, 0, $bfOffBits));
             
        //BITMAPINFO (BITMAPINFOHEADER)
        fwrite ($f, pack ('VVVvvVVVVVV', 40, $biWidth, $biHeight, 1, 24, 0, $biSizeImage, 0, 0, 0, 0));
             
        $numpad = $biStride - $biBPLine;
        for ($y = $biHeight - 1; $y >= 0; --$y)
        {
            for ($x = 0; $x < $biWidth; ++$x)
            {
                $col = imagecolorat ($im, $x, $y);
                fwrite ($f, pack ('V', $col), 3);
            }
            for ($i = 0; $i < $numpad; ++$i)
                fwrite ($f, pack ('C', 0));
        }
        fclose ($f);
        return true;
    }
    //
    //http://dk.php.net/gd - shd at earthling dot net - 28-Mar-2006 02:44
    //END
    //
   
    //
    //http://dk.php.net/gd - DHKold - 15-Jun-2005 11:52
    //START
    //
    private function imagecreatefrombmp($filename){
        if (! $f1 = fopen($filename,"rb")) return FALSE;

        $FILE = unpack("vfile_type/Vfile_size/Vreserved/Vbitmap_offset", fread($f1,14));
        if($FILE['file_type'] != 19778) return FALSE;

        $BMP = unpack('Vheader_size/Vwidth/Vheight/vplanes/vbits_per_pixel'.
                                    '/Vcompression/Vsize_bitmap/Vhoriz_resolution'.
                                    '/Vvert_resolution/Vcolors_used/Vcolors_important', fread($f1,40));
        $BMP['colors'] = pow(2,$BMP['bits_per_pixel']);
        if ($BMP['size_bitmap'] == 0)
            $BMP['size_bitmap'] = $FILE['file_size'] - $FILE['bitmap_offset'];
        $BMP['bytes_per_pixel'] = $BMP['bits_per_pixel']/8;
        $BMP['bytes_per_pixel2'] = ceil($BMP['bytes_per_pixel']);
        $BMP['decal'] = ($BMP['width']*$BMP['bytes_per_pixel']/4);
        $BMP['decal'] -= floor($BMP['width']*$BMP['bytes_per_pixel']/4);
        $BMP['decal'] = 4-(4*$BMP['decal']);
        if ($BMP['decal'] == 4)
            $BMP['decal'] = 0;

        $PALETTE = array();
        if ($BMP['colors'] < 16777216)
            $PALETTE = unpack('V'.$BMP['colors'], fread($f1,$BMP['colors']*4));

        $IMG = fread($f1,$BMP['size_bitmap']);
        $VIDE = chr(0);

        $res = imagecreatetruecolor($BMP['width'],$BMP['height']);
        $P = 0;
        $Y = $BMP['height']-1;
        while ($Y >= 0){
            $X=0;
            while ($X < $BMP['width']){
                if ($BMP['bits_per_pixel'] == 24)
                    $COLOR = unpack("V",substr($IMG,$P,3).$VIDE);
                elseif ($BMP['bits_per_pixel'] == 16){
                    $COLOR = unpack("v",substr($IMG,$P,2));
                    $blue  = ($COLOR[1] & 0x001f) << 3;
                    $green = ($COLOR[1] & 0x07e0) >> 3;
                    $red  = ($COLOR[1] & 0xf800) >> 8;
                    $COLOR[1] = $red * 65536 + $green * 256 + $blue;
                }elseif ($BMP['bits_per_pixel'] == 8){
                    $COLOR = unpack("n",$VIDE.substr($IMG,$P,1));
                    $COLOR[1] = $PALETTE[$COLOR[1]+1];
                }elseif ($BMP['bits_per_pixel'] == 4){
                    $COLOR = unpack("n",$VIDE.substr($IMG,floor($P),1));
                    if (($P*2)%2 == 0)
                        $COLOR[1] = ($COLOR[1] >> 4);
                    else
                        $COLOR[1] = ($COLOR[1] & 0x0F);
                    $COLOR[1] = $PALETTE[$COLOR[1]+1];
                }elseif($BMP['bits_per_pixel'] == 1){
            $COLOR = unpack("n",$VIDE.substr($IMG,floor($P),1));
                        if(($P*8)%8 == 0)
                            $COLOR[1] = $COLOR[1]>>7;
                        elseif(($P*8)%8 == 1)
                            $COLOR[1] = ($COLOR[1] & 0x40)>>6;
                elseif (($P*8)%8 == 2)
                    $COLOR[1] = ($COLOR[1] & 0x20)>>5;
                elseif (($P*8)%8 == 3)
                    $COLOR[1] = ($COLOR[1] & 0x10)>>4;
                elseif (($P*8)%8 == 4)
                    $COLOR[1] = ($COLOR[1] & 0x8)>>3;
                elseif (($P*8)%8 == 5)
                    $COLOR[1] = ($COLOR[1] & 0x4)>>2;
                elseif (($P*8)%8 == 6)
                    $COLOR[1] = ($COLOR[1] & 0x2)>>1;
                elseif (($P*8)%8 == 7)
                    $COLOR[1] = ($COLOR[1] & 0x1);
                $COLOR[1] = $PALETTE[$COLOR[1]+1];
            }else{
            return FALSE;
        }
            imagesetpixel($res,$X,$Y,$COLOR[1]);
            $X++;
            $P += $BMP['bytes_per_pixel'];
        }
            $Y--;
            $P+=$BMP['decal'];
        }

        fclose($f1);
        return $res;
    }
    //
    //http://dk.php.net/gd - DHKold - 15-Jun-2005 11:52
    //START
    //
   
/**************************************\
* USAGE                                *
* $image->getWidth();                  *
* Returns width as integer/pixel      *
\**************************************/
    public function getWidth(){
        return imagesx($this->resource);
    }

/**************************************\
* USAGE                                *
* $image->getHeight();                *
* Returns height as integer/pixel      *
\**************************************/
    public function getHeight(){
        return imagesy($this->resource);
    }

/**************************************\
* USAGE                                *
* $image->quality();                  *
* Set quality of image                *
* 0 = worst                            *
* 100 = best                          *
\**************************************/
    public function quality($quality){
        if(!is_numeric($quality))
            throw new Exception('Quality should be integer, 0 - 100');
        $this->quality = intval($quality);
    }

/**************************************\
* USAGE                                *
* $image->show(FORMAT,DEBUG);          *
* Shows the image in a given format    *
* Format: jpg, png, gif and bmp        *
* Debug: true/false                    *
\**************************************/
    public function show($format,$debug=false){
        switch($format){
            case 'jpg':
            case 'jpe':
            case 'jpeg':
                if($debug){
                    header('Content-Type: text/html');
                }else{
                    header('Content-Type: image/jpeg');
                }
                imagejpeg($this->resource, NULL, $this->quality);
                break;
            case 'gif':
                if($debug){
                    header('Content-Type: text/html');
                }else{
                    header('Content-Type: image/gif');
                }
                imagegif($this->resource, NULL);
                break;
            case 'png':
                if($debug){
                    header('Content-Type: text/html');
                }else{
                    header('Content-Type: image/png');
                }
                imagepng($this->resource, NULL, floor( abs( $this->quality / 10 - 9.9 ) ) );
                break;
            case 'bmp':
                if($debug){
                    header('Content-Type: text/html');
                }else{
                    header('Content-Type: image/bmp');
                }
                $this->imagebmp($this->resource);
                break;
            default:
                throw new Exception('Format not supported');
        }
    }

/**************************************\
* USAGE                                *
* $image->resize(WIDTH,HEIGHT,RATIO);  *
* Resize an image                      *
* Width: integer/pixel                *
* Height: integer/pixel                *
* Ratio: True = (keep ratio)          *
* Ratio: False = (skip ratio)          *
\**************************************/
    public function resize($width,$height,$ratio=true){
        $ow  = $this->getWidth();
        $oh = $this->getHeight();
        if($ratio){
          $wscale    = $width / $ow;
          $hscale    = $height / $oh;
          $scale = min( $hscale, $wscale );
          $nw = round( $ow * $scale, 0 );
          $nh = round( $oh * $scale, 0 );
      }else{
          $nw = $width;
          $nh = $height;
      }
      $tempImage = imagecreatetruecolor( $nw, $nh );
      imagecopyresampled( $tempImage, $this->resource, 0, 0, 0, 0, $nw, $nh, $ow, $oh );
      imagedestroy($this->resource);
      $this->resource = $tempImage;
    }

/**************************************\
* USAGE                                *
* $image->crop(X,Y,WIDTH,HEIGHT);      *
* Crop an image                        *
* X: X-Position - integer/pixel        *
* Y: Y-Position - integer/pixel        *
* Width: integer/pixel                *
* Height: integer/pixel                *
\**************************************/
    public function crop($x, $y, $width,$height){
        $ow  = $this->getWidth();
        $oh = $this->getHeight();
        if($ow < ($width + $x) || $oh < ($height + $y))
            throw new Exception('Crop failed, picture is to small');
      $cropImage = imagecreatetruecolor( $width, $height );
      imagecopyresampled( $cropImage, $this->resource, 0, 0, $x, $y, $width, $height, $width, $height );
      imagedestroy($this->resource);
      $this->resource = $cropImage;
    }

/**************************************\
* USAGE                                *
* $image->flipHorizontal();            *
* Flip an image horizontal            *
\**************************************/
    //
    //http://dk.php.net/gd - php at synvb dot com - 22-Apr-2006 05:19
    //START
    //
    function flipHorizontal(){
        $ow  = $this->getWidth();
        $oh = $this->getHeight();
        $flipImage = imagecreatetruecolor($ow, $oh);
        for($x = 0; $x < $ow; $x++) {
            imagecopy($flipImage, $this->resource, $x, 0, $ow - $x - 1, 0, 1, $oh);
        }
        imagedestroy($this->resource);
        $this->resource = $flipImage;
    }

/**************************************\
* USAGE                                *
* $image->flipVertical();              *
* Flip an image vertical              *
\**************************************/
    function flipVertical(){
        $ow  = $this->getWidth();
        $oh = $this->getHeight();

        $flipImage = imagecreatetruecolor($ow, $oh);

        for($y = 0; $y < $oh; $y++) {
            imagecopy($flipImage, $this->resource, 0, $y, 0, $oh - $y - 1, $ow, 1);
        }
        imagedestroy($this->resource);
        $this->resource = $flipImage;
    }
    //
    //http://dk.php.net/gd - php at synvb dot com - 22-Apr-2006 05:19
    //END
    //

/**************************************\
* USAGE                                *
* $image->rotate(DEGREE,HEXCOLOR);    *
* Rotate an image                      *
* Degree: 0-359 integer                *
* HexColor: #fff or #ffffff            *
\**************************************/
    //
    //http://www.anyexample.com/programming/php/php_convert_rgb_from_to_html_hex_color.xml
    //START
    //
    function rotate($degrees,$hex_bgcolor='#000'){
        if($hex_bgcolor[0] == '#')
            $hex_bgcolor = substr($hex_bgcolor, 1);

    if (strlen($hex_bgcolor) == 6)
            list($r, $g, $b) = array($hex_bgcolor[0].$hex_bgcolor[1], $hex_bgcolor[2].$hex_bgcolor[3], $hex_bgcolor[4].$hex_bgcolor[5]);
    elseif (strlen($hex_bgcolor) == 3)
            list($r, $g, $b) = array($hex_bgcolor[0].$hex_bgcolor[0], $hex_bgcolor[1].$hex_bgcolor[1], $hex_bgcolor[2].$hex_bgcolor[2]);
    else
            return false;

    $r = hexdec($r);
    $g = hexdec($g);
    $b = hexdec($b);
        //
        //http://www.anyexample.com/programming/php/php_convert_rgb_from_to_html_hex_color.xml
        //END
        //
       
    $bgcolor = imagecolorallocate($this->resource, $r, $g, $b);
       
        $rotateImage = imagerotate($this->resource, $degrees, $bgcolor, 0);
       
        imagedestroy($this->resource);
        $this->resource = $rotateImage;
    }

/**************************************\
* USAGE                                *
* $image->grayscale();                *
* Grayscale an image                  *
\**************************************/
    //
    //http://bubble.ro/How_to_convert_an_image_to_grayscale_using_PHP.html
    //START
    //
    function grayscale(){
        $ow  = $this->getWidth();
        $oh = $this->getHeight();
        for ($i = 0; $i < $ow; $i++){
            for ($j = 0; $j < $oh; $j++){
                // get the rgb value for current pixel
                $rgb = ImageColorAt($this->resource, $i, $j);
                // extract each value for r, g, b
                $rr = ($rgb >> 16) & 0xFF;
                $gg = ($rgb >> 8) & 0xFF;
                $bb = $rgb & 0xFF;
                // get the Value from the RGB value
                $g = round(($rr + $gg + $bb) / 3);
                // grayscale values have r=g=b=g
                $val = imagecolorallocate($this->resource, $g, $g, $g);
                // set the gray value
                imagesetpixel ($this->resource, $i, $j, $val);
            }
        }
    }
    //
    //http://bubble.ro/How_to_convert_an_image_to_grayscale_using_PHP.html
    //END
    //

/**************************************\
* USAGE                                *
* $image->save(FILENAME);              *
* Save an image                        *
* Filename: Save image as filename    *
\**************************************/
    public function save($filename){
        if(!is_writable(pathinfo($filename,PATHINFO_DIRNAME))){
            throw new Exception('Directory is not writable');
        }
        switch($this->getExtension($filename)){
            case 'jpg':
            case 'jpe':
            case 'jpeg':
                imagejpeg($this->resource, $filename, $this->quality);
                break;
            case 'gif':
                imagegif($this->resource, $filename);
                break;
            case 'png':
                imagepng($this->resource, $filename, floor( abs( $this->quality / 10 - 9.9 ) ) );
                break;
            default:
                throw new Exception('Format not supported');
        }
    }

/**************************************\
* USAGE                                *
* $image->watermark(WATERMARK,X,Y);    *
* Watermark an image                  *
* Watermark: Image to use as watermark *
* X: Left, Center, Right or integer    *
* Y: Top, Center, Bottom or integer    *
\**************************************/
    public function watermark($watermark,$x='right',$y='bottom'){
        $watermark = new image($watermark);
        if($watermark->getWidth() > $this->getWidth() || $watermark->getHeight() > $this->getHeight()){
            throw new Exception('Watermark is too large');
        }
        $positionX = 0;
        $positionY = 0;
        switch(strtolower($x)){
            case 'right':
                break;
            case 'center':
                $positionX = round($this->getWidth() / 2) - round($watermark->getWidth() / 2);
                break;
            case 'right':
                $positionX = $this->getWidth() - $watermark->getWidth();
                break;
            default:
                $positionX = (is_numeric($x)) ? intval($x) : ($this->getWidth() - $watermark->getWidth());
        }
       
        switch(strtolower($y)){
            case 'top':
                break;
            case 'center':
                $positionY = round($this->getHeight() / 2) - round($watermark->getHeight() / 2);
                break;
            case 'bottom':
                $positionY = $this->getHeight() - $watermark->getHeight();
                break;
            default:
                $positionY = (is_numeric($y)) ? intval($y) : ($this->getHeight() - $watermark->getHeight());
        }
       
        if(($positionX+$watermark->getWidth()) > $this->getWidth() || ($positionY+$watermark->getHeight()) > $this->getHeight()){
            throw new Exception('Watermark is outside the image');
        }
        imagecopy($this->resource, $watermark->resource, $positionX, $positionY, 0, 0, $watermark->getWidth(), $watermark->getHeight());
    }
}

?>
Avatar billede find_p Nybegynder
10. august 2008 - 09:08 #30
Nu breder mystikken sig ;0)

Jeg har taget en copy / paste fra ovenstående og får stadig samme fejl og sammenligner jeg min fil med ovenstående, kan jeg ikke få øje på forskel nogen steder.
Avatar billede jakobdo Ekspert
10. august 2008 - 11:19 #31
Smid en email, for både din kode og min klasse virker fint hos mig og melder ingen fejl.
Så må jeg sende det zippet.
Avatar billede find_p Nybegynder
10. august 2008 - 11:47 #32
Ok

hlmf@tdcadsl.dk
Avatar billede jakobdo Ekspert
10. august 2008 - 12:20 #33
Afsendt.
Avatar billede find_p Nybegynder
10. august 2008 - 12:56 #34
Øv - Stadig samme resultat
Avatar billede jakobdo Ekspert
10. august 2008 - 12:59 #35
Hvilken version af php bruger du ?
Avatar billede find_p Nybegynder
10. august 2008 - 13:07 #36
PHP4
Avatar billede jakobdo Ekspert
10. august 2008 - 13:13 #37
Min klasse er lavet til php5. :o)
Avatar billede find_p Nybegynder
10. august 2008 - 13:23 #38
Ok  - kan jeg opgradere til PHP5, uden at "ødelægge" noget eksisterende?
Avatar billede find_p Nybegynder
10. august 2008 - 13:25 #39
Med andre ord - er PHP5 bagud kompatibel?
Avatar billede find_p Nybegynder
11. august 2008 - 21:20 #40
Hej Jacob - Håber ikke at du helt har mistet tålmodigheden med mig.

Min udbyder oplyser følgende:

"PHP-konfiguration
Du kan vælge mellem PHP4 og PHP5 til dit webhotel. PHP5 er den nyeste og mest avancerede version. Klik PHP5 eller PHP4 og klik "Opdater"(update) for at gemme dine ændringer. Selvom du vælger PHP5 kan du stadig køre PHP4-baserede sider ved at give dem filendelsen .php4. Det samme gælder for PHP5 filer, hvis du vælger PHP4."

Jeg har omdødt filerendelserne til .php5.

Jeg får nu følgende fejl:

Fatal error: Call to undefined method image::getWidth() in /customers/****.dk/****.dk/httpd.www/upload.php5. on line 86
Avatar billede find_p Nybegynder
17. august 2008 - 10:53 #41
Lukket
Avatar billede jakobdo Ekspert
17. august 2008 - 11:14 #42
Fik du rettet til php5 eller ?
Avatar billede find_p Nybegynder
17. august 2008 - 11:57 #43
Nej ikke på serveren, hvis det er det du mener.

Jeg har en interaktiv side, hvor man se skibstrafikken (online) i danske farvande.
Koden til dette indeholder en masse klasser, og jeg er bange for at det går galt hvis jeg opgraderer til PHP5 på serveren
Avatar billede jakobdo Ekspert
17. august 2008 - 15:00 #44
Ok. :o)
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