Autor Zpráva
Jcas
Profil
Prosím o radu - vůbec tomu chování nerozumím.
Pracuji s tímto.
Poprvé jsem použil while(filesize($filename)>40000) - to byl rachot(nekonečný cykl).

1. První zpracování ok., 1024*768 - 84kB
To byla velká velikost, tak jsem volání funkcí zopakoval z menšími rozměry. (v koku nyní zakomentováno)

Ale výsledek je divný. Oba obrázky mají (tohle zjištuji kliknutím pravým a uložením do PC) rozměr 600*x, oba obr mají 35kB, ale jeden je zobrazen zvětšen s w=1024, ale obojí zobrazení echo filesize ukazuje 84428.

$filename = $_FILES["obrazek"]["name"];
$x = 1024; $y = 1024;

        list($width, $height) = image_shrink_size($_FILES["obrazek"]["tmp_name"], $x, $y);
            
if ($width && $height) {
   image_resize($_FILES["obrazek"]["tmp_name"], $filename, $width, $height);
    echo filesize($filename).'<br>';
    echo '<img src="'.$filename.'" alt="" width="'.$width.'" height="'.$height.'">';
}
/*
if(filesize($filename)>40000) {
    $filename = $_FILES["obrazek"]["name"];
    $x = 600; $y = 600;
    
        list($width, $height) = image_shrink_size($_FILES["obrazek"]["tmp_name"], $x, $y);
            
    if ($width && $height) {
          image_resize($_FILES["obrazek"]["tmp_name"], $filename, $width, $height);
        echo filesize($filename).'<br>';
        echo '<img src="'.$filename.'" alt="" width="'.$width.'" height="'.$height.'">';
    }
    
}
*/
visionic
Profil *
Mozna ti tohle pomuze:

PHP
<?php
class Image
{
    // tady je obrazek ulozeny
    var $img;

    var $font_face;
    var $font_size;
    var $font_color;

    public function __construct($a, $b=0, $bg=0)
    {
        // vytvoreni noveho obrazku
        if (is_numeric($a)) {
            $this->img = imagecreatetruecolor($a, $b);

            // vyplneni barevnym pozadim
            if ($bg != 0)
                imagefill($this->img, 0, 0, imagecolorallocate($this->img, $bg["0"], $bg["1"], $bg["2"]));
        }
        // nacteni obrazku ze souboru
        else if (@imagesx($a)==false) {
            $info = getimagesize($a);
            switch ($info[2]):
                case "1": //GIF
                    $this->img = imagecreatefromgif($a);
                    break;
                case "2": //JPG
                    $this->img = imagecreatefromjpeg($a); 
                    break;
                case "3": //PNG
                    $this->img = imagecreatefrompng($a);
                    break;
                case false: $this->img=false;
            endswitch;
        }
        // prevzeti obrazku z venci
        else
            $this->img=$a;
    }

    // uvolneni obrazku
    public function destroy()
    {
        @imagedestroy($this->img);
    }

    // ulozit/zobrazit obrazek jako jpg
    public function save_jpg($dest, $quality=95)
    {
        return imagejpeg($this->img,$dest,$quality);
    }

    public function out_jpg($quality=95)
    {
        header ("Content-type: image/jpeg");
        imagejpeg($this->img,NULL,$quality);
    }

    // ulozit/zobrazit obrazek jako png
    public function save_png($dest)
    {
        return imagepng($this->img,$dest);
    }

    public function out_png()
    {
        header ("Content-type: image/png");
        imagepng($this->img);
    }

    // ulozit/zobrazit obrazek jako gif
    public function save_gif($dest)
    {
        return imagegif($this->img,$dest);
    }

    public function out_gif()
    {
        header ("Content-type: image/gif");
        imagegif($this->img);
    }

    // ziskat sirku aktualniho obrazku
    public function get_width()
    {
        return imagesx($this->img);
    }

    // ziskat vysku aktualniho obrazku
    public function get_height()
    {
        return imagesy($this->img);
    }

    // zmenit velikost obrazku na sirku $width a vysku $height, $aspect_ratio 
    // ovlivni, zda bude zachovan pomer stran, $force=true vynuti zmenu 
    // velikosti za kazdou cenu, i kdyby melo dojit ke ztrate kvality
    public function resize($width, $height, $aspect_ratio=true, $force=false)
    {
        // $force=false zaruci, ze obrazky mensi nez zadane rozliseni nebudou 
        // zvetsovany
        if ($width>$this->get_width()&&$height>$this->get_height()&&!$force)
            return $this;

        if ($width==0) $width=$this->get_width();
        if ($height==0) $height=$this->get_height();

        // spocitam nove rozemry
        if ($aspect_ratio) {
            $widthRatio=$this->get_width()/$width;
            $heightRatio=$this->get_height()/$height;
            $aspectRatio = $this->get_width()/$this->get_height();

            if ($widthRatio>$heightRatio)
                $height = $width / $aspectRatio;
            else
                $width = $height * $aspectRatio;
        }

        // zmenim velikost
        $img=imagecreatetruecolor($width,$height);
        if (!@imagecopyresampled($img,$this->img,0,0,0,0,$width,$height,$this->get_width(),$this->get_height())) return false;
        else {
            $this->img = $img;
            return true;
        }
    }

    // otocit doleva
    public function rotate_left()
    {
        $this->img = imagerotate($this->img, 90, 0);
        return true;
    }
    // otocit doprava
    public function rotate_right()
    {
        $this->img = imagerotate($this->img, -90, 0);
        return true;
    }

    // pridat ramecek o barve $color (Array(r,g,b)) a tloustce $size pixelu
    public function border($color,$size)
    {
        $new = imagecreatetruecolor($this->get_width()+(2*$size),$this->get_height()+(2*$size));
        $bg = imagecolorallocate($new,$color["0"],$color["1"],$color["2"]);
        imagefill($new,0,0,$bg);
        
        if (imagecopy($new, $this->img, $size, $size, 0, 0, $this->get_width(), $this->get_height())) {
            $this->img = $new; 
            return true;
        }
        else 
            return false;
    }

    // oriznout -> vyriznu z obrazku obdelnik s levym hornim rohem na 
    // souradnicich $x, $y a rozmerech $width, $height
    public function crop($x, $y, $width, $height)
    {
        $copy=imagecreatetruecolor($width,$height);
        if (imagecopy($copy, $this->img, 0, 0, $x, $y, $width, $height)) {
            $this->img=$copy;
            return true;
        }

        return false;
    }

    // oriznout obrazek do pomeru stran $dest_ratio, $offset nabyva ohdnot 0 az 1 
    // a urcuje umisteni vyrezu, pricemz pokud obrazek s pomerem 3:4 (na vysku) 
    // orezavame do pomeru 4:3 (na sirku), tak $offset=0 znamena, ze se vezme 
    // horni cast puvodniho obrazku, 0.5 presne prostredni cast a 1 spodni cast 
    public function crop_to_ratio($dest_ratio=0, $offset=0.5)
    {
        if ($dest_ratio==0) $dest_ratio=(4/3);

        $width=$this->get_width();
        $height=$this->get_height();
        $img_ratio=$width/$height;

        if ($img_ratio==$dest_ratio) return $this;

        $widthRatio=$width/1;
        $heightRatio=$height/(1/$dest_ratio);

        if ($widthRatio>$heightRatio) {
            //vyska zustane puvodni
            $width=$dest_ratio*$height;
            return $this->crop(($this->get_width()-$width)*$offset, 0, $width, $height);
        }
        else {
            //sirka zustane puvodni
            $height=$width/$dest_ratio;
            return $this->crop(0, ($this->get_height()-$height)*$offset, $width, $height);
        }
    }

    // zmeni velikost a orizne do rozmeru $width x $height, $offset funguje 
    // stejne jako u crop_to_ratio()
    public function resize_crop($width, $height, $offset=0.5)
    {
        $widthRatio=$this->get_width()/$width;
        $heightRatio=$this->get_height()/$height;

        if ($widthRatio<$heightRatio)
            $this->resize($width, 0);
        else 
            $this->resize(0, $height);

        return $this->crop_to_ratio(($width/$height), $offset);
    }

    // nastavi pismo, $face je nazev ttf souboru s pismem, $size velikost (v 
    // bodech) a $color barva (Array(r,g,b))
    public function set_font($face, $size, $color)
    {
        $this->font_face = $face;
        $this->font_size = $size;
        $this->font_color = $color;
        return true;
    }

    // zapise text $text, s levym spodnim rohem na souradnich $x, $y, pod uhlem 
    // $angle a s vyditelnosti $alpha (0-100, 0 - neviditelne, 50 - pruhledne, 
    // 100 - viditelne
    public function write($text, $x=0, $y=0, $angle=0, $alpha = 100)
    {
        // create font color
        $color = imagecolorallocate($this->img, $this->font_color[0], $this->font_color[1], $this->font_color[2]);

        // no transparency
        if ($alpha == 100)
            // write text to the original image
            imagettftext($this->img, $this->font_size, $angle, $x, $y, $color, $this->font_face, $text);
        // transparency
        else {
            // create temporary image
            $tmp = imagecreatetruecolor($this->get_width(),$this->get_height());

            // choose transparent color
            $transparent = (Array(0,0,0) != $this->font_color) ? Array(0,0,0) : Array(255,255,255);

            // fill with transparent color
            imagefill($tmp, 0, 0, imagecolorallocate($tmp, $transparent["0"], $transparent["1"], $transparent["2"]));

            // set this color to transparent
            imagecolortransparent($tmp, imagecolorallocate($tmp, $transparent["0"], $transparent["1"], $transparent["2"]));

            // write text to the temporary image
            imagettftext($tmp, $this->font_size, $angle, $x, $y, $color, $this->font_face, $text);

            // merge original image and temporary image with alpha (pct)
            imagecopymerge($this->img, $tmp, 0, 0, 0, 0, $this->get_width(), $this->get_height(), $alpha);
        }
    }

    // automaticky uvolni pamet po skonceni scriptu
    public function __destruct()
    {
        // free memory
        $this->destroy();
    }

}
?>

Priklad vyvolani tridy
include 'soubor.php'; // jsem zadas cestu k souboru, kam si zadal ten predeslej kod, ten co jsem ti jsem napsal

$img = new Image("složka/složka/soubor.jpg");
$img->resize(1024, 1024);
$img->crop(0, 0, 1024, 768); // kdyby si ho chtel oriznout, jinak ho vyhod tenhle radek (osa-x, osa-y, šířka, výška)
$img->save_jpg("složka/složka/soubor.jpg", 100); // poslední číslo určuje kvalitu (1-100)

include 'soubor.php'; // jsem zadas cestu k souboru, kam si zadal ten predeslej kod, ten co jsem ti jsem napsal

$img = new image("složka/složka/soubor.jpg");
$img->resize(1024, 1024);
$img->crop(0, 0, 1024, 768); // kdyby si ho chtel oriznout, jinak ho vyhod tenhle radek (osa-x, osa-y, šířka, výška)
$img->save_jpg("složka/složka/soubor.jpg", 100); // poslední číslo určuje kvalitu (1-100)

priklad vyvolani tridy
include 'soubor.php'; // jsem zadas cestu k souboru, kam si zadal ten predeslej kod, ten co jsem ti jsem napsal

$img = new image("složka/složka/soubor.jpg");
$img->resize(1024, 1024);
$img->crop(0, 0, 1024, 768); // kdyby si ho chtel oriznout, jinak ho vyhod tenhle radek (osa-x, osa-y, šířka, výška)
$img->save_jpg("složka/složka/soubor.jpg", 100); // poslední číslo určuje kvalitu (1-100)

<?php
class image
{
    // tady je obrazek ulozeny
    var $img;

    var $font_face;
    var $font_size;
    var $font_color;

    public function __construct($a, $b=0, $bg=0)
    {
        // vytvoreni noveho obrazku
        if (is_numeric($a)) {
            $this->img = imagecreatetruecolor($a, $b);

            // vyplneni barevnym pozadim
            if ($bg != 0)
                imagefill($this->img, 0, 0, imagecolorallocate($this->img, $bg["0"], $bg["1"], $bg["2"]));
        }
        // nacteni obrazku ze souboru
        else if (@imagesx($a)==false) {
            $info = getimagesize($a);
            switch ($info[2]):
                case "1": //gif
                    $this->img = imagecreatefromgif($a);
                    break;
                case "2": //jpg
                    $this->img = imagecreatefromjpeg($a); 
                    break;
                case "3": //png
                    $this->img = imagecreatefrompng($a);
                    break;
                case false: $this->img=false;
            endswitch;
        }
        // prevzeti obrazku z venci
        else
            $this->img=$a;
    }

    // uvolneni obrazku
    public function destroy()
    {
        @imagedestroy($this->img);
    }

    // ulozit/zobrazit obrazek jako jpg
    public function save_jpg($dest, $quality=95)
    {
        return imagejpeg($this->img,$dest,$quality);
    }

    public function out_jpg($quality=95)
    {
        header ("content-type: image/jpeg");
        imagejpeg($this->img,null,$quality);
    }

    // ulozit/zobrazit obrazek jako png
    public function save_png($dest)
    {
        return imagepng($this->img,$dest);
    }

    public function out_png()
    {
        header ("content-type: image/png");
        imagepng($this->img);
    }

    // ulozit/zobrazit obrazek jako gif
    public function save_gif($dest)
    {
        return imagegif($this->img,$dest);
    }

    public function out_gif()
    {
        header ("content-type: image/gif");
        imagegif($this->img);
    }

    // ziskat sirku aktualniho obrazku
    public function get_width()
    {
        return imagesx($this->img);
    }

    // ziskat vysku aktualniho obrazku
    public function get_height()
    {
        return imagesy($this->img);
    }

    // zmenit velikost obrazku na sirku $width a vysku $height, $aspect_ratio 
    // ovlivni, zda bude zachovan pomer stran, $force=true vynuti zmenu 
    // velikosti za kazdou cenu, i kdyby melo dojit ke ztrate kvality
    public function resize($width, $height, $aspect_ratio=true, $force=false)
    {
        // $force=false zaruci, ze obrazky mensi nez zadane rozliseni nebudou 
        // zvetsovany
        if ($width>$this->get_width()&&$height>$this->get_height()&&!$force)
            return $this;

        if ($width==0) $width=$this->get_width();
        if ($height==0) $height=$this->get_height();

        // spocitam nove rozemry
        if ($aspect_ratio) {
            $widthratio=$this->get_width()/$width;
            $heightratio=$this->get_height()/$height;
            $aspectratio = $this->get_width()/$this->get_height();

            if ($widthratio>$heightratio)
                $height = $width / $aspectratio;
            else
                $width = $height * $aspectratio;
        }

        // zmenim velikost
        $img=imagecreatetruecolor($width,$height);
        if (!@imagecopyresampled($img,$this->img,0,0,0,0,$width,$height,$this->get_width(),$this->get_height())) return false;
        else {
            $this->img = $img;
            return true;
        }
    }

    // otocit doleva
    public function rotate_left()
    {
        $this->img = imagerotate($this->img, 90, 0);
        return true;
    }
    // otocit doprava
    public function rotate_right()
    {
        $this->img = imagerotate($this->img, -90, 0);
        return true;
    }

    // pridat ramecek o barve $color (array(r,g,b)) a tloustce $size pixelu
    public function border($color,$size)
    {
        $new = imagecreatetruecolor($this->get_width()+(2*$size),$this->get_height()+(2*$size));
        $bg = imagecolorallocate($new,$color["0"],$color["1"],$color["2"]);
        imagefill($new,0,0,$bg);
        
        if (imagecopy($new, $this->img, $size, $size, 0, 0, $this->get_width(), $this->get_height())) {
            $this->img = $new; 
            return true;
        }
        else 
            return false;
    }

    // oriznout -> vyriznu z obrazku obdelnik s levym hornim rohem na 
    // souradnicich $x, $y a rozmerech $width, $height
    public function crop($x, $y, $width, $height)
    {
        $copy=imagecreatetruecolor($width,$height);
        if (imagecopy($copy, $this->img, 0, 0, $x, $y, $width, $height)) {
            $this->img=$copy;
            return true;
        }

        return false;
    }

    // oriznout obrazek do pomeru stran $dest_ratio, $offset nabyva ohdnot 0 az 1 
    // a urcuje umisteni vyrezu, pricemz pokud obrazek s pomerem 3:4 (na vysku) 
    // orezavame do pomeru 4:3 (na sirku), tak $offset=0 znamena, ze se vezme 
    // horni cast puvodniho obrazku, 0.5 presne prostredni cast a 1 spodni cast 
    public function crop_to_ratio($dest_ratio=0, $offset=0.5)
    {
        if ($dest_ratio==0) $dest_ratio=(4/3);

        $width=$this->get_width();
        $height=$this->get_height();
        $img_ratio=$width/$height;

        if ($img_ratio==$dest_ratio) return $this;

        $widthratio=$width/1;
        $heightratio=$height/(1/$dest_ratio);

        if ($widthratio>$heightratio) {
            //vyska zustane puvodni
            $width=$dest_ratio*$height;
            return $this->crop(($this->get_width()-$width)*$offset, 0, $width, $height);
        }
        else {
            //sirka zustane puvodni
            $height=$width/$dest_ratio;
            return $this->crop(0, ($this->get_height()-$height)*$offset, $width, $height);
        }
    }

    // zmeni velikost a orizne do rozmeru $width x $height, $offset funguje 
    // stejne jako u crop_to_ratio()
    public function resize_crop($width, $height, $offset=0.5)
    {
        $widthratio=$this->get_width()/$width;
        $heightratio=$this->get_height()/$height;

        if ($widthratio<$heightratio)
            $this->resize($width, 0);
        else 
            $this->resize(0, $height);

        return $this->crop_to_ratio(($width/$height), $offset);
    }

    // nastavi pismo, $face je nazev ttf souboru s pismem, $size velikost (v 
    // bodech) a $color barva (array(r,g,b))
    public function set_font($face, $size, $color)
    {
        $this->font_face = $face;
        $this->font_size = $size;
        $this->font_color = $color;
        return true;
    }

    // zapise text $text, s levym spodnim rohem na souradnich $x, $y, pod uhlem 
    // $angle a s vyditelnosti $alpha (0-100, 0 - neviditelne, 50 - pruhledne, 
    // 100 - viditelne
    public function write($text, $x=0, $y=0, $angle=0, $alpha = 100)
    {
        // create font color
        $color = imagecolorallocate($this->img, $this->font_color[0], $this->font_color[1], $this->font_color[2]);

        // no transparency
        if ($alpha == 100)
            // write text to the original image
            imagettftext($this->img, $this->font_size, $angle, $x, $y, $color, $this->font_face, $text);
        // transparency
        else {
            // create temporary image
            $tmp = imagecreatetruecolor($this->get_width(),$this->get_height());

            // choose transparent color
            $transparent = (array(0,0,0) != $this->font_color) ? array(0,0,0) : array(255,255,255);

            // fill with transparent color
            imagefill($tmp, 0, 0, imagecolorallocate($tmp, $transparent["0"], $transparent["1"], $transparent["2"]));

            // set this color to transparent
            imagecolortransparent($tmp, imagecolorallocate($tmp, $transparent["0"], $transparent["1"], $transparent["2"]));

            // write text to the temporary image
            imagettftext($tmp, $this->font_size, $angle, $x, $y, $color, $this->font_face, $text);

            // merge original image and temporary image with alpha (pct)
            imagecopymerge($this->img, $tmp, 0, 0, 0, 0, $this->get_width(), $this->get_height(), $alpha);
        }
    }

    // automaticky uvolni pamet po skonceni scriptu
    public function __destruct()
    {
        // free memory
        $this->destroy();
    }

}
?>

priklad vyvolani tridy
include 'soubor.php'; // jsem zadas cestu k souboru, kam si zadal ten predeslej kod, ten co jsem ti jsem napsal

$img = new image("složka/složka/soubor.jpg");
$img->resize(1024, 1024);
$img->crop(0, 0, 1024, 768); // kdyby si ho chtel oriznout, jinak ho vyhod tenhle radek (osa-x, osa-y, šířka, výška)
$img->save_jpg("složka/složka/soubor.jpg", 100); // poslední číslo určuje kvalitu (1-100)


php
<?php
class image
{
    // tady je obrazek ulozeny
    var $img;

    var $font_face;
    var $font_size;
    var $font_color;

    public function __construct($a, $b=0, $bg=0)
    {
        // vytvoreni noveho obrazku
        if (is_numeric($a)) {
            $this->img = imagecreatetruecolor($a, $b);

            // vyplneni barevnym pozadim
            if ($bg != 0)
                imagefill($this->img, 0, 0, imagecolorallocate($this->img, $bg["0"], $bg["1"], $bg["2"]));
        }
        // nacteni obrazku ze souboru
        else if (@imagesx($a)==false) {
            $info = getimagesize($a);
            switch ($info[2]):
                case "1": //gif
                    $this->img = imagecreatefromgif($a);
                    break;
                case "2": //jpg
                    $this->img = imagecreatefromjpeg($a); 
                    break;
                case "3": //png
                    $this->img = imagecreatefrompng($a);
                    break;
                case false: $this->img=false;
            endswitch;
        }
        // prevzeti obrazku z venci
        else
            $this->img=$a;
    }

    // uvolneni obrazku
    public function destroy()
    {
        @imagedestroy($this->img);
    }

    // ulozit/zobrazit obrazek jako jpg
    public function save_jpg($dest, $quality=95)
    {
        return imagejpeg($this->img,$dest,$quality);
    }

    public function out_jpg($quality=95)
    {
        header ("content-type: image/jpeg");
        imagejpeg($this->img,null,$quality);
    }

    // ulozit/zobrazit obrazek jako png
    public function save_png($dest)
    {
        return imagepng($this->img,$dest);
    }

    public function out_png()
    {
        header ("content-type: image/png");
        imagepng($this->img);
    }

    // ulozit/zobrazit obrazek jako gif
    public function save_gif($dest)
    {
        return imagegif($this->img,$dest);
    }

    public function out_gif()
    {
        header ("content-type: image/gif");
        imagegif($this->img);
    }

    // ziskat sirku aktualniho obrazku
    public function get_width()
    {
        return imagesx($this->img);
    }

    // ziskat vysku aktualniho obrazku
    public function get_height()
    {
        return imagesy($this->img);
    }

    // zmenit velikost obrazku na sirku $width a vysku $height, $aspect_ratio 
    // ovlivni, zda bude zachovan pomer stran, $force=true vynuti zmenu 
    // velikosti za kazdou cenu, i kdyby melo dojit ke ztrate kvality
    public function resize($width, $height, $aspect_ratio=true, $force=false)
    {
        // $force=false zaruci, ze obrazky mensi nez zadane rozliseni nebudou 
        // zvetsovany
        if ($width>$this->get_width()&&$height>$this->get_height()&&!$force)
            return $this;

        if ($width==0) $width=$this->get_width();
        if ($height==0) $height=$this->get_height();

        // spocitam nove rozemry
        if ($aspect_ratio) {
            $widthratio=$this->get_width()/$width;
            $heightratio=$this->get_height()/$height;
            $aspectratio = $this->get_width()/$this->get_height();

            if ($widthratio>$heightratio)
                $height = $width / $aspectratio;
            else
                $width = $height * $aspectratio;
        }

        // zmenim velikost
        $img=imagecreatetruecolor($width,$height);
        if (!@imagecopyresampled($img,$this->img,0,0,0,0,$width,$height,$this->get_width(),$this->get_height())) return false;
        else {
            $this->img = $img;
            return true;
        }
    }

    // otocit doleva
    public function rotate_left()
    {
        $this->img = imagerotate($this->img, 90, 0);
        return true;
    }
    // otocit doprava
    public function rotate_right()
    {
        $this->img = imagerotate($this->img, -90, 0);
        return true;
    }

    // pridat ramecek o barve $color (array(r,g,b)) a tloustce $size pixelu
    public function border($color,$size)
    {
        $new = imagecreatetruecolor($this->get_width()+(2*$size),$this->get_height()+(2*$size));
        $bg = imagecolorallocate($new,$color["0"],$color["1"],$color["2"]);
        imagefill($new,0,0,$bg);
        
        if (imagecopy($new, $this->img, $size, $size, 0, 0, $this->get_width(), $this->get_height())) {
            $this->img = $new; 
            return true;
        }
        else 
            return false;
    }

    // oriznout -> vyriznu z obrazku obdelnik s levym hornim rohem na 
    // souradnicich $x, $y a rozmerech $width, $height
    public function crop($x, $y, $width, $height)
    {
        $copy=imagecreatetruecolor($width,$height);
        if (imagecopy($copy, $this->img, 0, 0, $x, $y, $width, $height)) {
            $this->img=$copy;
            return true;
        }

        return false;
    }

    // oriznout obrazek do pomeru stran $dest_ratio, $offset nabyva ohdnot 0 az 1 
    // a urcuje umisteni vyrezu, pricemz pokud obrazek s pomerem 3:4 (na vysku) 
    // orezavame do pomeru 4:3 (na sirku), tak $offset=0 znamena, ze se vezme 
    // horni cast puvodniho obrazku, 0.5 presne prostredni cast a 1 spodni cast 
    public function crop_to_ratio($dest_ratio=0, $offset=0.5)
    {
        if ($dest_ratio==0) $dest_ratio=(4/3);

        $width=$this->get_width();
        $height=$this->get_height();
        $img_ratio=$width/$height;

        if ($img_ratio==$dest_ratio) return $this;

        $widthratio=$width/1;
        $heightratio=$height/(1/$dest_ratio);

        if ($widthratio>$heightratio) {
            //vyska zustane puvodni
            $width=$dest_ratio*$height;
            return $this->crop(($this->get_width()-$width)*$offset, 0, $width, $height);
        }
        else {
            //sirka zustane puvodni
            $height=$width/$dest_ratio;
            return $this->crop(0, ($this->get_height()-$height)*$offset, $width, $height);
        }
    }

    // zmeni velikost a orizne do rozmeru $width x $height, $offset funguje 
    // stejne jako u crop_to_ratio()
    public function resize_crop($width, $height, $offset=0.5)
    {
        $widthratio=$this->get_width()/$width;
        $heightratio=$this->get_height()/$height;

        if ($widthratio<$heightratio)
            $this->resize($width, 0);
        else 
            $this->resize(0, $height);

        return $this->crop_to_ratio(($width/$height), $offset);
    }

    // nastavi pismo, $face je nazev ttf souboru s pismem, $size velikost (v 
    // bodech) a $color barva (array(r,g,b))
    public function set_font($face, $size, $color)
    {
        $this->font_face = $face;
        $this->font_size = $size;
        $this->font_color = $color;
        return true;
    }

    // zapise text $text, s levym spodnim rohem na souradnich $x, $y, pod uhlem 
    // $angle a s vyditelnosti $alpha (0-100, 0 - neviditelne, 50 - pruhledne, 
    // 100 - viditelne
    public function write($text, $x=0, $y=0, $angle=0, $alpha = 100)
    {
        // create font color
        $color = imagecolorallocate($this->img, $this->font_color[0], $this->font_color[1], $this->font_color[2]);

        // no transparency
        if ($alpha == 100)
            // write text to the original image
            imagettftext($this->img, $this->font_size, $angle, $x, $y, $color, $this->font_face, $text);
        // transparency
        else {
            // create temporary image
            $tmp = imagecreatetruecolor($this->get_width(),$this->get_height());

            // choose transparent color
            $transparent = (array(0,0,0) != $this->font_color) ? array(0,0,0) : array(255,255,255);

            // fill with transparent color
            imagefill($tmp, 0, 0, imagecolorallocate($tmp, $transparent["0"], $transparent["1"], $transparent["2"]));

            // set this color to transparent
            imagecolortransparent($tmp, imagecolorallocate($tmp, $transparent["0"], $transparent["1"], $transparent["2"]));

            // write text to the temporary image
            imagettftext($tmp, $this->font_size, $angle, $x, $y, $color, $this->font_face, $text);

            // merge original image and temporary image with alpha (pct)
            imagecopymerge($this->img, $tmp, 0, 0, 0, 0, $this->get_width(), $this->get_height(), $alpha);
        }
    }

    // automaticky uvolni pamet po skonceni scriptu
    public function __destruct()
    {
        // free memory
        $this->destroy();
    }

}
?>

priklad vyvolani tridy
include 'soubor.php'; // jsem zadas cestu k souboru, kam si zadal ten predeslej kod, ten co jsem ti jsem napsal

$img = new image("složka/složka/soubor.jpg");
$img->resize(1024, 1024);
$img->crop(0, 0, 1024, 768); // kdyby si ho chtel oriznout, jinak ho vyhod tenhle radek (osa-x, osa-y, šířka, výška)
$img->save_jpg("složka/složka/soubor.jpg", 100); // poslední číslo určuje kvalitu (1-100)


php
<?php
class image
{
    // tady je obrazek ulozeny
    var $img;

    var $font_face;
    var $font_size;
    var $font_color;

    public function __construct($a, $b=0, $bg=0)
    {
        // vytvoreni noveho obrazku
        if (is_numeric($a)) {
            $this->img = imagecreatetruecolor($a, $b);

            // vyplneni barevnym pozadim
            if ($bg != 0)
                imagefill($this->img, 0, 0, imagecolorallocate($this->img, $bg["0"], $bg["1"], $bg["2"]));
        }
        // nacteni obrazku ze souboru
        else if (@imagesx($a)==false) {
            $info = getimagesize($a);
            switch ($info[2]):
                case "1": //gif
                    $this->img = imagecreatefromgif($a);
                    break;
                case "2": //jpg
                    $this->img = imagecreatefromjpeg($a); 
                    break;
                case "3": //png
                    $this->img = imagecreatefrompng($a);
                    break;
                case false: $this->img=false;
            endswitch;
        }
        // prevzeti obrazku z venci
        else
            $this->img=$a;
    }

    // uvolneni obrazku
    public function destroy()
    {
        @imagedestroy($this->img);
    }

    // ulozit/zobrazit obrazek jako jpg
    public function save_jpg($dest, $quality=95)
    {
        return imagejpeg($this->img,$dest,$quality);
    }

    public function out_jpg($quality=95)
    {
        header ("content-type: image/jpeg");
        imagejpeg($this->img,null,$quality);
    }

    // ulozit/zobrazit obrazek jako png
    public function save_png($dest)
    {
        return imagepng($this->img,$dest);
    }

    public function out_png()
    {
        header ("content-type: image/png");
        imagepng($this->img);
    }

    // ulozit/zobrazit obrazek jako gif
    public function save_gif($dest)
    {
        return imagegif($this->img,$dest);
    }

    public function out_gif()
    {
        header ("content-type: image/gif");
        imagegif($this->img);
    }

    // ziskat sirku aktualniho obrazku
    public function get_width()
    {
        return imagesx($this->img);
    }

    // ziskat vysku aktualniho obrazku
    public function get_height()
    {
        return imagesy($this->img);
    }

    // zmenit velikost obrazku na sirku $width a vysku $height, $aspect_ratio 
    // ovlivni, zda bude zachovan pomer stran, $force=true vynuti zmenu 
    // velikosti za kazdou cenu, i kdyby melo dojit ke ztrate kvality
    public function resize($width, $height, $aspect_ratio=true, $force=false)
    {
        // $force=false zaruci, ze obrazky mensi nez zadane rozliseni nebudou 
        // zvetsovany
        if ($width>$this->get_width()&&$height>$this->get_height()&&!$force)
            return $this;

        if ($width==0) $width=$this->get_width();
        if ($height==0) $height=$this->get_height();

        // spocitam nove rozemry
        if ($aspect_ratio) {
            $widthratio=$this->get_width()/$width;
            $heightratio=$this->get_height()/$height;
            $aspectratio = $this->get_width()/$this->get_height();

            if ($widthratio>$heightratio)
                $height = $width / $aspectratio;
            else
                $width = $height * $aspectratio;
        }

        // zmenim velikost
        $img=imagecreatetruecolor($width,$height);
        if (!@imagecopyresampled($img,$this->img,0,0,0,0,$width,$height,$this->get_width(),$this->get_height())) return false;
        else {
            $this->img = $img;
            return true;
        }
    }

    // otocit doleva
    public function rotate_left()
    {
        $this->img = imagerotate($this->img, 90, 0);
        return true;
    }
    // otocit doprava
    public function rotate_right()
    {
        $this->img = imagerotate($this->img, -90, 0);
        return true;
    }

    // pridat ramecek o barve $color (array(r,g,b)) a tloustce $size pixelu
    public function border($color,$size)
    {
        $new = imagecreatetruecolor($this->get_width()+(2*$size),$this->get_height()+(2*$size));
        $bg = imagecolorallocate($new,$color["0"],$color["1"],$color["2"]);
        imagefill($new,0,0,$bg);
        
        if (imagecopy($new, $this->img, $size, $size, 0, 0, $this->get_width(), $this->get_height())) {
            $this->img = $new; 
            return true;
        }
        else 
            return false;
    }

    // oriznout -> vyriznu z obrazku obdelnik s levym hornim rohem na 
    // souradnicich $x, $y a rozmerech $width, $height
    public function crop($x, $y, $width, $height)
    {
        $copy=imagecreatetruecolor($width,$height);
        if (imagecopy($copy, $this->img, 0, 0, $x, $y, $width, $height)) {
            $this->img=$copy;
            return true;
        }

        return false;
    }

    // oriznout obrazek do pomeru stran $dest_ratio, $offset nabyva ohdnot 0 az 1 
    // a urcuje umisteni vyrezu, pricemz pokud obrazek s pomerem 3:4 (na vysku) 
    // orezavame do pomeru 4:3 (na sirku), tak $offset=0 znamena, ze se vezme 
    // horni cast puvodniho obrazku, 0.5 presne prostredni cast a 1 spodni cast 
    public function crop_to_ratio($dest_ratio=0, $offset=0.5)
    {
        if ($dest_ratio==0) $dest_ratio=(4/3);

        $width=$this->get_width();
        $height=$this->get_height();
        $img_ratio=$width/$height;

        if ($img_ratio==$dest_ratio) return $this;

        $widthratio=$width/1;
        $heightratio=$height/(1/$dest_ratio);

        if ($widthratio>$heightratio) {
            //vyska zustane puvodni
            $width=$dest_ratio*$height;
            return $this->crop(($this->get_width()-$width)*$offset, 0, $width, $height);
        }
        else {
            //sirka zustane puvodni
            $height=$width/$dest_ratio;
            return $this->crop(0, ($this->get_height()-$height)*$offset, $width, $height);
        }
    }

    // zmeni velikost a orizne do rozmeru $width x $height, $offset funguje 
    // stejne jako u crop_to_ratio()
    public function resize_crop($width, $height, $offset=0.5)
    {
        $widthratio=$this->get_width()/$width;
        $heightratio=$this->get_height()/$height;

        if ($widthratio<$heightratio)
            $this->resize($width, 0);
        else 
            $this->resize(0, $height);

        return $this->crop_to_ratio(($width/$height), $offset);
    }

    // nastavi pismo, $face je nazev ttf souboru s pismem, $size velikost (v 
    // bodech) a $color barva (array(r,g,b))
    public function set_font($face, $size, $color)
    {
        $this->font_face = $face;
        $this->font_size = $size;
        $this->font_color = $color;
        return true;
    }

    // zapise text $text, s levym spodnim rohem na souradnich $x, $y, pod uhlem 
    // $angle a s vyditelnosti $alpha (0-100, 0 - neviditelne, 50 - pruhledne, 
    // 100 - viditelne
    public function write($text, $x=0, $y=0, $angle=0, $alpha = 100)
    {
        // create font color
        $color = imagecolorallocate($this->img, $this->font_color[0], $this->font_color[1], $this->font_color[2]);

        // no transparency
        if ($alpha == 100)
            // write text to the original image
            imagettftext($this->img, $this->font_size, $angle, $x, $y, $color, $this->font_face, $text);
        // transparency
        else {
            // create temporary image
            $tmp = imagecreatetruecolor($this->get_width(),$this->get_height());

            // choose transparent color
            $transparent = (array(0,0,0) != $this->font_color) ? array(0,0,0) : array(255,255,255);

            // fill with transparent color
            imagefill($tmp, 0, 0, imagecolorallocate($tmp, $transparent["0"], $transparent["1"], $transparent["2"]));

            // set this color to transparent
            imagecolortransparent($tmp, imagecolorallocate($tmp, $transparent["0"], $transparent["1"], $transparent["2"]));

            // write text to the temporary image
            imagettftext($tmp, $this->font_size, $angle, $x, $y, $color, $this->font_face, $text);

            // merge original image and temporary image with alpha (pct)
            imagecopymerge($this->img, $tmp, 0, 0, 0, 0, $this->get_width(), $this->get_height(), $alpha);
        }
    }

    // automaticky uvolni pamet po skonceni scriptu
    public function __destruct()
    {
        // free memory
        $this->destroy();
    }

}
?>

priklad vyvolani tridy
include 'soubor.php'; // jsem zadas cestu k souboru, kam si zadal ten predeslej kod, ten co jsem ti jsem napsal

$img = new image("složka/složka/soubor.jpg");
$img->resize(1024, 1024);
$img->crop(0, 0, 1024, 768); // kdyby si ho chtel oriznout, jinak ho vyhod tenhle radek (osa-x, osa-y, šířka, výška)
$img->save_jpg("složka/složka/soubor.jpg", 100); // poslední číslo určuje kvalitu (1-100)


nejak se mi to tu postlo duplicitne
Jcas
Profil
Nějak se ti to zduplicovalo.
Dík, to vyzkouším. Ale koukám, že tu třídu voláš se souborem na disku.
(já teda nevím, jak funguje ukládání, ale myslel jsem, že dokud neprovedu move_uploade, tak soubor ještě není na web uložen.

Nešlo by to - zmenšit - zkontroluj velikost a pokud je velkej - zmenšit - zkontroluj velikost....a až bude velikost v mezích, tak teprve uložit.
visionic
Profil *
bohužel, tenhle příklad musíš ješte dodělat. Myslel jsem, že už máš hotové řešení. Toto je pouze knihovna na zmenšování a ořezávání. Upload si řešíš sám a po uploadu vyvoláš tuto třídu. Možná tě navede JAVASCRIPT příklad s preloadem obrázku před uploadováním. Možná, že když budeš hledat, nebude jen umožněn náhled, ale i velikosti.

PHP nebo HTML
echo '<form action="" method="post" enctype="multipart/form-data">';
echo '<div class="obal-obrazek">';
echo '<img src="" style="display: none;" id="obrazek">';
echo '</div>';
echo '<input class="files" type="File" name="soubor" onchange="zobrazit(this)" accept="image/jpeg">';
echo '<input class="button" name="submit" type="submit" value="Odeslat">';
echo '</form>';

JAVASCRIPT
function zobrazit(input) {
    if (input.files && input.files[0]) {
        var reader = new FileReader();
        reader.onload = function (e) {
            var obrazek = document.getElementById("obrazek");
            obrazek.src = e.target.result;
            obrazek.style.display = "block";
        };
        reader.readAsDataURL(input.files[0]);
    }
}
anonymníí
Profil *
Jcas:
Před uložením na tebou požadovanou lokaci na disku (move_uploaded_file) je obrázek v dočasném uložišti. Ten můžeš pro změnu rozměru použít.
Jcas
Profil
Takže jakmile odešlu formulář, soubor se uloží na nějaké dočasné uložiště (u mně na PC, nebo na serveru?).
Tento soubor pak načítám - měním rozměr.
A až to je, tak ho pomocí move_uploaded_file přesunu na správné místo.

Přesně o to se snažím. Prosím vraťte se k prvnímu vláknu. Funguje to dobře, pokud to chci udělat jednou.
Toto funguje: Odešlu form - změním velikost obr. a tím se změní i velikost souboru - a nahraji ho na správné místo na serveru.
Toto mi nejde: Odešlu form - změním velikost obr. a tím se změní i velikost souboru - velikost je ještě velká, a proto ho ještě zmenším - a nahraji ho na správné místo na serveru.
anonymníí
Profil *
Jcas:
soubor se uloží na nějaké dočasné uložiště (u mně na PC, nebo na serveru?).
U tebe určitě ne - formulář se přeci odesílá na server... nebo k tobě do počítače? :-)
Keeehi
Profil
Jcas:
Nechce se mi zkoumat ten dlouhý kód, takže to tak možná děláš ale kdyby ne, tak to sem raději napíšu. Při druhém zmenšování nezmenšuj zmenšený obrázek ale zase ten původní, jen nově o něco víc. Pokud bys bral jako zdroj už zmenšené obrázky, trpěla by tím kvalita.
Jcas
Profil
Keeehi - Tak dlouhý kod to není-7řádků. (v prvním příspěvku) A je to vlastně kopie volání funkcí od Vrány.
A následujících 7 řádků, které jsou zakomentovány je znova naprosto to stejný - druhé a větší zmenšení.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0